ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNjYzIxNQotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuYWdncmVnYXRvcjwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLnNvbmFybGludC5lY2xpcHNlLmNvcmUuc29uYXJsaW50QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9hYm91dC5odG1sIGIvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2plbmtpbnMuYnVpbGQuY29uZmlnLnhtbCBiL2plbmtpbnMuYnVpbGQuY29uZmlnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzQ3YjczCi0tLSAvZGV2L251bGwKKysrIGIvamVua2lucy5idWlsZC5jb25maWcueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAJCSAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgIC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBNb2R1bGUgc3BlY2lmaWMgcGFyYW1ldGVycyBmb3IgdGhlIEplbmtpbnMgSm9iIAkJCQkJCSAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxqZW5raW5zPgorCTwhLS0gRE8gTk9UIEVESVQgQkVMT1cgVEhJUyBMSU5FIC0tPgorICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLmRzbDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlcjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5vc2dpLmh5YnJpZC5hcGk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAucnVudGltZTwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLndlYjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC51aS5hcGk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAudXRpbHM8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAudXRpbHMudWk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWRkb25zPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb248L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcDwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0PC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5mdW5jdGlvbmxpYnJhcnk8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bjwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICA8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jaWVzPgorPC9qZW5raW5zPgpkaWZmIC0tZ2l0IGEvbm90aWNlLmh0bWwgYi9ub3RpY2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QzNGMzCi0tLSAvZGV2L251bGwKKysrIGIvbm90aWNlLmh0bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5BcHJpbCA5LCAyMDE0PC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisgICAgICAgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhjMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlLy5wcm9qZWN0CkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5zb25hcmxpbnQuZWNsaXBzZS5jb3JlLnNvbmFybGludEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTYxIEBACitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorCitUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KK09SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKK2kpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCitpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCit3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KK0EgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQorYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCittb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90CitkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgoraXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKK2FuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uCisKK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCithZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKK2FwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCitjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KK2Fzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKK2Jhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCitkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bworZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKworMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKK2kpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCit3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55CitvdGhlciBwYXJ0eTsgYW5kCisKK2l2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKK2luIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgorCithKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCisKK0NvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KKworRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKK290aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAorcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQorIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCit0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcworcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCitVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgorZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKK3dpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCitwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKK1JlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKK25vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKKyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50CitpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAorbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKK3JpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQorbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KKworVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKK29mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQorb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODkyMGZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitiaW4uaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsICBlcGwtdjEwLmh0bWwsICBmZWF0dXJlLnhtbCxcCisgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgYm9keSB7CisgICAgc2l6ZTogOC41aW4gMTEuMGluOworICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKKyAgICB0YWItaW50ZXJ2YWw6IDAuNWluOworICAgIH0KKyAgcCB7ICAJCisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgIH0KKyAgcC5saXN0IHsKKyAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKKyAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKKyAgICB9CisgIDwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorCis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KKworPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKK1BVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUworQUdSRUVNRU5ULjwvcD4KKworPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgorCis8cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKK2NvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgorPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KKzxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQorb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKK0NvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKK1Byb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCitDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KK2Nvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQorYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCit0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCitDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKK0NvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgorCis8cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQord2l0aCB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+CisKKzxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKK29mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKK29mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50CitsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKK1Byb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAorc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKK2J5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgorY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgorZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCithcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKK2hhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAordGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCitmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKK29yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKK0FncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCitwYXJ0eTsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQorcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQorZXhjaGFuZ2UuPC9wPgorCis8cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCitjb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKK3dpdGhpbiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCitDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50CitSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgorCis8cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCitsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKK3RoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCitwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgoraW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAoraW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQorYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCitwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKK2FjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCitvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQorSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KK2V4cGVuc2UuPC9wPgorCis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCitwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgorbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+CisKKzxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUworT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKK09SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAorZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKK2ludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KKworPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKK05PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CisKKzxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgorCis8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQorZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgorCis8cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCithZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKK3VuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKK3JldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQorQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCitGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQorc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQorZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZworQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCityaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKK3RoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKK0FncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgorCis8cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKK3RvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQordGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKK3JpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMjk3YwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNjkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIENyaXN0aWFubyBHYXZp428gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmVhdHVyZS5wcm9wZXJ0aWVzCisjIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAorIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorCisjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCitmZWF0dXJlTmFtZSA9T1NCUCBEU0w6IENoYXJ0IAorCisjICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCitwcm92aWRlck5hbWU9RWNsaXBzZSBPU0JQCisKKyMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCitkZXNjcmlwdGlvbj1UaGlzIGZlYXR1cmUgcHJvdmlkZXMgdGhlIGJ1bmRsZXMgZm9yIHRoZSBPU0JQIENoYXJ0RFNMLgorCisjICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCit1cGRhdGVTaXRlTmFtZT0KKworIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCitjb3B5cmlnaHQ9XAorQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCisjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgorIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCitsaWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAorCisjICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgorIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCitsaWNlbnNlPVwKK0VjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAorRmVicnVhcnkgMSwgMjAxMVxuXAorXG5cCitVc2FnZSBPZiBDb250ZW50XG5cCitcblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKK09USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAorVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCitBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKK05PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCitBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCitBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAorT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCitPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorXG5cCitBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCitcblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKK0VjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCit0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAorcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitcblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCityZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCithcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK1xuXAorICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKKyAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKKyAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCisgICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCisgICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCisgICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKKyAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCisgICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKKyAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKyAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAorICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCitcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKK2luIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKK0xpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorXG5cCisgICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKyAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCisgICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCisgICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCisgICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCitcblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKK1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKK1VwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKK0luY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoreW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAordGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAorZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKK1RPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAorU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorXG5cCisgICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKyAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKyAgICAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAorICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKK1xuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAorVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCitpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorXG5cCitcblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1xuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAorYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKK3RoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAorb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCit0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKK0luZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCitcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKK1lvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK2luIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKK21ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitcblwKKyAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCisgICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCisgICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKyAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCisgICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCisgICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKKyAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCisgICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCisgICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAorICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAorICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKKyAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitcblwKK0NyeXB0b2dyYXBoeVxuXAorXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKK2N1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKK2FuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKK3VzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAorcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKK3JlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitcblwKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2ZlYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NjM1MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGZlYXR1cmUKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZSIKKyAgICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgICAgdmVyc2lvbj0iMC45LjAucXVhbGlmaWVyIgorICAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KKyAgICAgICAgCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAlZGVzY3JpcHRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAKKyAgICA8Y29weXJpZ2h0PgorICAgICAgICAlY29weXJpZ2h0CisgICAgPC9jb3B5cmlnaHQ+CisgICAgICAgIAorICAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAgICAlbGljZW5zZQorICAgIDwvbGljZW5zZT4KKyAgICAgICAgCisgICAgPHBsdWdpbgorICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydCIKKyAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorICAgICAgICAKKyAgICA8cGx1Z2luCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzIgorICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisgICAgICAgIAorICAgIDxwbHVnaW4KKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkiCisgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKyAgICAgICAgCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDE2NCBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Cis8cD5GZWJydWFyeSAxLCAyMDExPC9wPgorCis8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisKKzxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQorICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKKyAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAorICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCis8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisKKzxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCisgICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28KKyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAorZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIAorc291cmNlIGNvZGUKKyAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSAKK2F2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisKKzx1bD4KKyAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIAorZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIAorbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAorKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgorICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmIzg0ODI7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgorICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIAorRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIAorc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgCituYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyAKK29mIHRoZSBQbHVnLWlucworICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisgICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCAKK0ZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSAKK2xpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKK0luY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkKKyBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKK2luY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisgICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyAKK2luc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdAorIGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgCitGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCitpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgCitmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIAorZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgCit0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IAorZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KK3RoYXQgZGlyZWN0b3J5LjwvcD4KKworPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiAKK1RPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLgorICBTT01FIE9GIFRIRVNFCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKworPHVsPgorICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgorICAgICAgIDxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KKzwvdWw+CisKKzxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIAorQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCAKK29yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQorY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIAorZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKworCis8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCAKK2V4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQorICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiAKK2FsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgCitjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisgICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCAKK3BhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKyAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKworPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsCisgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCisgICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8KKyBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5CisgICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggCit0aGUKKyAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIAorYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCis8b2w+CisgICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiAKK3doaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCAKK2V4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCisgICAgICAgcHJvZHVjdC48L2xpPgorICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCittYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKyAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciAKK3RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgCitTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisgICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgCitTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQKKyBnb3Zlcm4KKyAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgCit1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gCitVcG9uIHN1Y2gKKyAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAord2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Cis8L29sPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlCisgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCAKK2FuZC9vciByZS1leHBvcnQgdG8KKyAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIAorc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKK2NvbmNlcm5pbmcgdGhlIGltcG9ydCwKKyAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgCit0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisKKzxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgorCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjMwZDlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5mZWF0dXJlL3BvbS54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZlYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lY2xpcHNlLWZlYXR1cmU8L3BhY2thZ2luZz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnR5Y2hvLmV4dHJhczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50eWNoby1zb3VyY2UtZmVhdHVyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt0eWNob0V4dHJhc1ZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNvdXJjZS1mZWF0dXJlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zb3VyY2UtZmVhdHVyZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGxhYmVsU3VmZml4PiAoc291cmNlKTwvbGFiZWxTdWZmaXg+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4gaWQ9ImRjaGFydHMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4gaWQ9ImNvbS52YWFkaW4udGhlbWUtY29tcGlsZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4gaWQ9ImNvbS52YWFkaW4uY2xpZW50LWNvbXBpbGVkIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luIGlkPSJjb20udmFhZGluLnNlcnZlciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbiBpZD0iY29tLnZhYWRpbi5zaGFyZWQiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4gaWQ9ImNvbS52YWFkaW4uc2hhcmVkLmRlcHMiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4gaWQ9ImNvbS52YWFkaW4udGhlbWVzIi8+CisgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDwhLS0gd29ya2Fyb3VuZCB3aGlsZSBidWcgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTM5ODI1MCAKKwkJCQkJaXMgbm90IGZpeGVkIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnR5Y2hvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnR5Y2hvLXAyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3R5Y2hvLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaGVkLXAyLW1ldGFkYXRhPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wMi1tZXRhZGF0YTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OWQ4NQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrLy5wcm9qZWN0CkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvYWJvdXQuaW5pIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvYWJvdXQuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjY3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2Fib3V0Lm1hcHBpbmdzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvYWJvdXQubWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2Fib3V0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI0MTcwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrCisKKyMjIyMjIyMjIyMjIyMjIyMgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmZWF0dXJlVGV4dD1cCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCitDb250cmlidXRvcnM6XG5cCisgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KKyMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1MmU0YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAorYmluLmluY2x1ZGVzID0gbGljZW5zZS5odG1sLCAgZXBsLXYxMC5odG1sLCAgYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgYm9keSB7CisgICAgc2l6ZTogOC41aW4gMTEuMGluOworICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKKyAgICB0YWItaW50ZXJ2YWw6IDAuNWluOworICAgIH0KKyAgcCB7ICAJCisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgIH0KKyAgcC5saXN0IHsKKyAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKKyAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKKyAgICB9CisgIDwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorCis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KKworPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKK1BVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUworQUdSRUVNRU5ULjwvcD4KKworPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgorCis8cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKK2NvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgorPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KKzxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQorb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKK0NvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKK1Byb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCitDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KK2Nvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQorYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCit0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCitDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKK0NvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgorCis8cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQord2l0aCB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+CisKKzxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKK29mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKK29mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50CitsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKK1Byb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAorc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKK2J5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgorY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgorZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCithcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKK2hhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAordGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCitmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKK29yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKK0FncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCitwYXJ0eTsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQorcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQorZXhjaGFuZ2UuPC9wPgorCis8cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCitjb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKK3dpdGhpbiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCitDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50CitSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgorCis8cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCitsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKK3RoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCitwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgoraW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAoraW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQorYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCitwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKK2FjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCitvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQorSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KK2V4cGVuc2UuPC9wPgorCis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCitwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgorbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+CisKKzxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUworT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKK09SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAorZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKK2ludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KKworPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKK05PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CisKKzxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgorCis8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQorZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgorCis8cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCithZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKK3VuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKK3JldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQorQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCitGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQorc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQorZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZworQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCityaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKK3RoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKK0FncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgorCis8cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKK3RvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQordGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKK3JpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9mZWF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE1YzFhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvZmVhdHVyZS54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGZlYXR1cmUKKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrIgorICAgICAgICBsYWJlbD0iQ2hhcnREU0wKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBTREsKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICBGZWF0dXJlCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgCisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgIgorICAgICAgICB2ZXJzaW9uPSIwLjkuMC5xdWFsaWZpZXIiPgorICAgICAgICAJPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydCIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgdW5wYWNrPSJmYWxzZSIvPgorICAgICAgICAJPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aSIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiB2ZXJzaW9uPSIwLjAuMCIgdW5wYWNrPSJmYWxzZSIvPgorPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZGsvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTc5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKyBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCisgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKK3NvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKK2ZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKK21vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKK0ZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKK3N1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAorbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCitvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCitGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCitsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAorKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CisgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCitpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKKyBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAorZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKK2ZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KKyAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCitvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCitleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCithbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAorY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCitwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCisgYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAordGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKK2FjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCit3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCitleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAorbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0CisgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAordXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAorVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK3dpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQorIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCithbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKK3NvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCitjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAordGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2RrL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YmRiZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkay9wb20ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNkazwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5hZ2dyZWdhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLjwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTliZTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvLnByb2plY3QKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0czwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlhYWMzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI1IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE9TQlAKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHM7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorUmVxdWlyZS1CdW5kbGU6IGNvbS5nb29nbGUuaW5qZWN0O2J1bmRsZS12ZXJzaW9uPSIzLjAuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0O2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLm9iamVjdHdlYi5hc207YnVuZGxlLXZlcnNpb249Ils1LjAuMSw2LjAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsCitJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5sb2c0aiwKKyBvcmcuanVuaXQ7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXI7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXIubWFuaXB1bGF0aW9uO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbjt2ZXJzaW9uPSI0LjUuMCIsCisgb3JnLmp1bml0LnJ1bm5lcnM7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuaGFtY3Jlc3QuY29yZSwKKyBqYXZheC52YWxpZGF0aW9uCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7dmVyc2lvbj0iMC45LjAiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvYWJvdXQuaW5pIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9hYm91dC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjcxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvYWJvdXQuaW5pCkBAIC0wLDAgKzEsMTcgQEAKKyMgYWJvdXQuaW5pCisjIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcworIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCisjIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKK2Fib3V0VGV4dD0lZmVhdHVyZVRleHQKKworIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQorZmVhdHVyZUltYWdlPQorCisjIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKK2FwcE5hbWU9JWZlYXR1cmVOYW1lCisKKyMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQord2VsY29tZVBhZ2U9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL2Fib3V0Lm1hcHBpbmdzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9hYm91dC5tYXBwaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTExYTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9hYm91dC5tYXBwaW5ncwpAQCAtMCwwICsxLDYgQEAKKyMgYWJvdXQubWFwcGluZ3MKKyMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworMD1xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvYWJvdXQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTNkMDhjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIworCisjIE5MU19NRVNTQUdFRk9STUFUX1ZBUgorCitmZWF0dXJlTmFtZT1vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzCisKKyMjIyMjIyMjIyMjIyMjIyMgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmZWF0dXJlVGV4dD1cCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCitDb250cmlidXRvcnM6XG5cCisgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KKyMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNmJlNzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxMyBAQAorc291cmNlLi4gPSBzcmMvLFwKKyAgICAgICAgICAgc3JjLWdlbi8KK2Jpbi5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKKyAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKKyAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAorICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAorc3JjLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwJCQkgICAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9lcGwtdjEwLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5OGFjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KKyAgYm9keSB7CisgICAgc2l6ZTogOC41aW4gMTEuMGluOworICAgIG1hcmdpbjogMC4yNWluIDAuNWluIDAuMjVpbiAwLjVpbjsKKyAgICB0YWItaW50ZXJ2YWw6IDAuNWluOworICAgIH0KKyAgcCB7ICAJCisgICAgbWFyZ2luLWxlZnQ6IGF1dG87CisgICAgbWFyZ2luLXRvcDogIDAuNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOworICAgIH0KKyAgcC5saXN0IHsKKyAgCW1hcmdpbi1sZWZ0OiAwLjVpbjsKKyAgICBtYXJnaW4tdG9wOiAgMC4wNWVtOworICAgIG1hcmdpbi1ib3R0b206IDAuMDVlbTsKKyAgICB9CisgIDwvc3R5bGU+CisKKzwvaGVhZD4KKworPGJvZHkgbGFuZz0iRU4tVVMiPgorCis8aDI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9oMj4KKworPHA+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKK1BVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUworQUdSRUVNRU5ULjwvcD4KKworPHA+PGI+MS4gREVGSU5JVElPTlM8L2I+PC9wPgorCis8cD4iQ29udHJpYnV0aW9uIiBtZWFuczo8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwKK2NvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9wPgorPHAgY2xhc3M9Imxpc3QiPmkpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5paSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvcD4KKzxwIGNsYXNzPSJsaXN0Ij53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbQorb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEKK0NvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUKK1Byb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoCitDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCitQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4KK2Nvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKQorYXJlIG5vdCBkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzCit0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJMaWNlbnNlZCBQYXRlbnRzIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhCitDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMKK0NvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uPC9wPgorCis8cD4iUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZQord2l0aCB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPiJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIKK3RoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3A+CisKKzxwPjxiPjIuIEdSQU5UIE9GIFJJR0hUUzwvYj48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5hKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3MKK29mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4KK3NvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoCitDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwKK29mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50CitsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUKK1Byb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLAorc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQKK2J5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlcgorY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCitsaWNlbnNlZCBoZXJldW5kZXIuPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvcgorZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzCithcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlCitwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoCitDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5Cithbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzCitvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMKK2dyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvCitzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvcgorZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQKK3RvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUKK3RoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmQpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQKK2hhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudAordGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC48L3A+CisKKzxwPjxiPjMuIFJFUVVJUkVNRU5UUzwvYj48L3A+CisKKzxwPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlCitmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworQWdyZWVtZW50OyBhbmQ8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMKK29yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IKK2NvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMKK2FsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czs8L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5paWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMKK0FncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyCitwYXJ0eTsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUKK2Zyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYQorcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZQorZXhjaGFuZ2UuPC9wPgorCis8cD5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoCitjb3B5IG9mIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQKK3dpdGhpbiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzCitDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cyBzdWJzZXF1ZW50CitSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uPC9wPgorCis8cD48Yj40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvYj48L3A+CisKKzxwPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbgorcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQgdGhlCitsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YKK3RoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlCitwb3RlbnRpYWwgbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvcgoraW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZAoraW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKQorYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkCitwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUKK2FjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcworcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluCitvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZQorSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24KK2V4cGVuc2UuPC9wPgorCis8cD5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAorcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsCitDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKK2NsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlCitjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5CithbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCitkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlCitwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlcgorQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgorbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3A+CisKKzxwPjxiPjUuIE5PIFdBUlJBTlRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTCitQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUworT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sCitBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkKK09SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKK3Jlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZAorZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCit0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLAorZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IKK2ludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLjwvcD4KKworPHA+PGI+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L2I+PC9wPgorCis8cD5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQKK05PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCitJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HCitXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCitORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SCitESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3A+CisKKzxwPjxiPjcuIEdFTkVSQUw8L2I+PC9wPgorCis8cD5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlcgorYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCit0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24KK2J5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0KK2V4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9wPgorCis8cD5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZQorUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlcgorc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCitSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZQorZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuPC9wPgorCis8cD5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdAorZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lCithZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMKK3VuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCitkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAorUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5CitSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuPC9wPgorCis8cD5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcworQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCitjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZQorQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcKK3JldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZQorQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlCitGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYQorc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZQorZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZworQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24KK29mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMKK2V4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vCityaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIKK3RoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMKK0FncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9wPgorCis8cD5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYS4gTm8gcGFydHkKK3RvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZQordGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMKK3JpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvcD4KKworCisKKzwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKyBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCisgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKK3NvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKK2ZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKK21vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKK0ZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKK3N1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAorbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCitvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCitGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCitsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAorKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CisgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCitpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKKyBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAorZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKK2ZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KKyAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCitvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCitleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCithbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAorY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCitwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCisgYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAordGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKK2FjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCit3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCitleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAorbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0CisgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAordXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAorVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK3dpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQorIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCithbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKK3NvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCitjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAordGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy5sYXVuY2ggYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMubGF1bmNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0N2ExMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMubGF1bmNoCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxhdW5jaGNvbmZpZyI+Cis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KKzxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzIi8+Cis8L2xpc3RBdHRyaWJ1dGU+Cis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KKzxsaXN0RW50cnkgdmFsdWU9IjQiLz4KKzwvbGlzdEF0dHJpYnV0ZT4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iPW9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMiLz4KKzxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0NCIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UubTJlLmxhdW5jaGNvbmZpZy5jbGFzc3BhdGhQcm92aWRlciIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cyIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5tMmUubGF1bmNoY29uZmlnLnNvdXJjZXBhdGhQcm92aWRlciIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkOTI2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL3BvbS54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xJbmplY3RvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTEluamVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGY1NGVkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xJbmplY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0Lkdsb2JhbFJlZ2lzdHJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0Lkdsb2JhbFJlZ2lzdHJpZXMuR2xvYmFsU3RhdGVNZW1lbnRvOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JSW5qZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuSVJlZ2lzdHJ5Q29uZmlndXJhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBDaGFydERTTEluamVjdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5qZWN0b3JQcm92aWRlciwgSVJlZ2lzdHJ5Q29uZmlndXJhdG9yIHsKKwkKKyAgICBwcm90ZWN0ZWQgR2xvYmFsU3RhdGVNZW1lbnRvIHN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbjsKKwlwcm90ZWN0ZWQgR2xvYmFsU3RhdGVNZW1lbnRvIHN0YXRlQWZ0ZXJJbmplY3RvckNyZWF0aW9uOworCXByb3RlY3RlZCBJbmplY3RvciBpbmplY3RvcjsKKworCXN0YXRpYyB7CisJCUdsb2JhbFJlZ2lzdHJpZXMuaW5pdGlhbGl6ZURlZmF1bHRzKCk7CisJfQorCisJcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKCkKKwl7CisJCWlmIChpbmplY3RvciA9PSBudWxsKSB7CisJCQlzdGF0ZUJlZm9yZUluamVjdG9yQ3JlYXRpb24gPSBHbG9iYWxSZWdpc3RyaWVzLm1ha2VDb3B5T2ZHbG9iYWxTdGF0ZSgpOworCQkJdGhpcy5pbmplY3RvciA9IGludGVybmFsQ3JlYXRlSW5qZWN0b3IoKTsKKwkJCXN0YXRlQWZ0ZXJJbmplY3RvckNyZWF0aW9uID0gR2xvYmFsUmVnaXN0cmllcy5tYWtlQ29weU9mR2xvYmFsU3RhdGUoKTsKKwkJfQorCQlyZXR1cm4gaW5qZWN0b3I7CisJfQorCQorCXByb3RlY3RlZCBJbmplY3RvciBpbnRlcm5hbENyZWF0ZUluamVjdG9yKCkgeworCSAgICByZXR1cm4gbmV3IENoYXJ0RFNMU3RhbmRhbG9uZVNldHVwKCkuY3JlYXRlSW5qZWN0b3JBbmREb0VNRlJlZ2lzdHJhdGlvbigpOworCX0KKworCXB1YmxpYyB2b2lkIHJlc3RvcmVSZWdpc3RyeSgpIHsKKwkJc3RhdGVCZWZvcmVJbmplY3RvckNyZWF0aW9uLnJlc3RvcmVHbG9iYWxTdGF0ZSgpOworCX0KKworCXB1YmxpYyB2b2lkIHNldHVwUmVnaXN0cnkoKSB7CisJCWdldEluamVjdG9yKCk7CisJCXN0YXRlQWZ0ZXJJbmplY3RvckNyZWF0aW9uLnJlc3RvcmVHbG9iYWxTdGF0ZSgpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMVWlJbmplY3RvclByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFVpSW5qZWN0b3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZWRmY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFVpSW5qZWN0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JSW5qZWN0b3JQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xVaUluamVjdG9yUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5qZWN0b3JQcm92aWRlciB7CisJCisJcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5pbnRlcm5hbC5DaGFydERTTEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEluamVjdG9yKCJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIik7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNGUzNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvLnByb2plY3QKQEAgLTAsMCArMSw1MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjhiOWIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDM5IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE9TQlAKK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorUmVxdWlyZS1CdW5kbGU6IG9yZy5zbGY0ai5hcGk7YnVuZGxlLXZlcnNpb249IjEuNy4yIiwKKyBvcmcuYXBhY2hlLmxvZzRqO2J1bmRsZS12ZXJzaW9uPSIxLjIuMTUiLAorIG9yZy5hcGFjaGUueGVyY2VzO2J1bmRsZS12ZXJzaW9uPSIyLjkuMCIsCisgY29tLmdvb2dsZS5pbmplY3Q7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwKKyBvcmcuZWNsaXBzZS54dGV4dC51aTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLmNvbXBhcmUsCisgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZSwKKyBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLAorIG9yZy5lY2xpcHNlLnVpLAorIG9yZy5hbnRsci5ydW50aW1lLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLAorIG9yZy5lY2xpcHNlLm9zYnAudXRpbHM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiCitJbXBvcnQtUGFja2FnZTogamF2YXgudmFsaWRhdGlvbiwKKyBvcmcuYXBhY2hlLmxvZzRqCitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY29udGVudGFzc2lzdDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0LmFudGxyO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuaW50ZXJuYWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkubGFiZWxpbmc7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkub3V0bGluZTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5xdWlja2ZpeDt2ZXJzaW9uPSIwLjkuMCIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuaW50ZXJuYWwuQ2hhcnREU0xBY3RpdmF0b3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvYWJvdXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGMwNTk4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2Fib3V0LmluaQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGY2NzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2Fib3V0Lm1hcHBpbmdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTFhMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9hYm91dC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDZlNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ1NzJjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgIHNyYy1nZW4vLFwKKyAgICAgICAgICB4dGVuZC1nZW4vCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCisgICAgICAgICAgICAgICAuY2xhc3NwYXRoLFwKKyAgICAgICAgICAgICAgIC5wcm9qZWN0LFwKKyAgICAgICAgICAgICAgIC5zZXR0aW5ncy8sXAorICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCisgICAgICAgICAgICAgICBpMThuLyxcCisgICAgICAgICAgICAgICBpY29ucy8sXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgbGljZW5zZS5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgaWNvbnMvLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbAorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaTE4bi9JMThOLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZWVkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTczIEBACisjCisjV2VkIE1hciAxNSAxNToyMTo0OCBDRVQgMjAxNworb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0LmFzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0LmNoYXJ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0LmRlc2NyaWJlZFwgYnk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnQucG9sbGluZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydC51c2luZz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEF4aXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRBeGlzLmF4aXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRBeGlzLnJlbmRlcnM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRBeGlzLnNob3J0TGFiZWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRBeGlzLnRpY2thbmdsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJhcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJhci5hbmltYXRlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJhci5iYXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRCYXIuc2hhZGVkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0QmFyLnN0YWNrZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRCYXIuc3dhcHBlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJ1YmJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJ1YmJsZS5idWJibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRCdWJibGUuZ3JhZGllbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRCdWJibGUubXVsdGlwbGllcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEJ1YmJsZS50cmFuc3BhcmVudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydERhdGFtYXJ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0RGF0YW1hcnQuZGF0YW1hcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnREb251dD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydERvbnV0LmRvbnV0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0RWxlbWVudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEdhdWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0R2F1Z2UuZ2F1Z2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRHYXVnZS5oYXNUaWNrcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEdhdWdlLmludGVydmFscz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEdhdWdlLmxhYmVsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0R2F1Z2UubWF4aW11bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEdhdWdlLm1pbmltdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRIaWdobGlnaHRlcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEhpZ2hsaWdodGVyLmFsd2F5cz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEhpZ2hsaWdodGVyLmluc2lkZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydEhpZ2hsaWdodGVyLnRvb2x0aXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRJbXBvcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRJbXBvcnQuaW1wb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0SW50ZXJ2YWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRMZWdlbmQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRMZWdlbmQubGVnZW5kPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGVnZW5kLnJlcGxvdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydExlZ2VuZC50b2dnbGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRMaW5lPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS5hbmltYXRlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydExpbmUuY3Vyc29yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS5maWxsWmVybz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydExpbmUuZmlsbGVkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS5saW5lPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS5zaG93TWFya2VyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS50b29sdGlwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TGluZS50cmVuZExpbmU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRMaW5lLnpvb209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRNb2RlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydE51bWJlckludGVydmFsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0TnVtYmVySW50ZXJ2YWwudXBcIHRvPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0T3B0aW9uPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0UGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydFBhY2thZ2UucGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydFBpZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydFBpZS5lbXB0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydFBpZS5waWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0UmFuZ2VFbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0U2VnbWVudENvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0U2VnbWVudENvbG9yLnNlZ21lbnRjb2xvcj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ0NDaGFydFRyZWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRUcmVlLmNvbGxhcHNpYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DQ0NoYXJ0VHJlZS5tYXA9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNDQ2hhcnRUcmVlLnRyZWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydC5hcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQuY2hhcnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0LmRlc2NyaWJlZFwgYnk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0LnBvbGxpbmc9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0LnVzaW5nPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXM9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcy5heGlzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMucmVuZGVycz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzLnNob3J0TGFiZWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcy50aWNrYW5nbGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhci5hbmltYXRlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIuYmFyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhci5zaGFkZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyLnN0YWNrZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyLnN3YXBwZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZS5idWJibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlLmdyYWRpZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZS5tdWx0aXBsaWVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZS50cmFuc3BhcmVudD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydC5kYXRhbWFydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREb251dD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREb251dC5kb251dD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRFbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlLmdhdWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlLmhhc1RpY2tzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlLmludGVydmFscz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZS5sYWJlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZS5tYXhpbXVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlLm1pbmltdW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXI9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIuYWx3YXlzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyLmluc2lkZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlci50b29sdGlwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEltcG9ydD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbXBvcnQuaW1wb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEludGVydmFsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQubGVnZW5kPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZC5yZXBsb3Q9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kLnRvZ2dsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUuYW5pbWF0ZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZS5jdXJzb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZS5maWxsWmVybz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lLmZpbGxlZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lLmxpbmU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZS5zaG93TWFya2VyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUudG9vbHRpcD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lLnRyZW5kTGluZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lLnpvb209CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TW9kZWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwudXBcIHRvPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2UucGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllLmVtcHR5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBpZS5waWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFNlZ21lbnRDb2xvci5zZWdtZW50Y29sb3I9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlLmNvbGxhcHNpYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUubWFwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUudHJlZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bS5pbnNpZGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW0uaW5zaWRlLWdyaWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW0ub3V0c2lkZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bS5vdXRzaWRlLWdyaWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5SZW5kZXJUeXBlRW51bS5jYXRlZ29yeT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW0uZGF0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW0ubGluZWFyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5SZW5kZXJUeXBlRW51bS5sb2dhcml0aG1pYz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW0ucHlyYW1pZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuU2lnbmVkTnVtYmVyPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5UUkFOU0xBVEFCTEVJRD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVFJBTlNMQVRBQkxFU1RSSU5HPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9nZ2xlVHlwZUVudW0uZmFzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9nZ2xlVHlwZUVudW0ubm9ybWFsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bS5zbG93PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtLmVhc3Q9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0ubm9ydGg9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0ubm9ydGgtZWFzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9vbHRpcExvY2F0aW9uRW51bS5ub3J0aC13ZXN0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtLnNvdXRoPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtLnNvdXRoLWVhc3Q9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0uc291dGgtd2VzdD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9vbHRpcExvY2F0aW9uRW51bS53ZXN0PQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF9heGlzLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvY2hhcnRfYXhpcy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2YTcyNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvY2hhcnRfYXhpcy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF9pbnRlcnZhbC5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL2NoYXJ0X2ludGVydmFsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDMxNDI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF9pbnRlcnZhbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF9sZWdlbmQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF9sZWdlbmQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NjhhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL2NoYXJ0X2xlZ2VuZC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9jaGFydF90b29sdGlwLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvY2hhcnRfdG9vbHRpcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIzYTlmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvY2hhcnRfdG9vbHRpcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfY2hhcnQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfY2hhcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNjlkODYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL2RzbF9jaGFydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfZGF0YW1hcnQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfZGF0YW1hcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMjBhZWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL2RzbF9kYXRhbWFydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfaW1wb3J0LnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvZHNsX2ltcG9ydC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRmZGNjOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvZHNsX2ltcG9ydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfb3B0aW9uLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvZHNsX29wdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIwODdiOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvZHNsX29wdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfcmFuZ2UucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9kc2xfcmFuZ2UucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDQyZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL2RzbF9yYW5nZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9tb2RlbC5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2ljb25zL21vZGVsLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmZiODU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9pY29ucy9wYWNrYWdlLmdpZiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvcGFja2FnZS5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1MDZmYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvaWNvbnMvcGFja2FnZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL2xpY2Vuc2UuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTU3OWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8tLT4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+RmVicnVhcnkgMSwgMjAxMTwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKKyAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCisgICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKKyAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKworPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCis8cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKyBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvCisgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCisgICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiAKK3NvdXJjZSBjb2RlCisgICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgCithdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byAKK2ZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCAKK21vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKKygiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJiM4NDgyOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KKyAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciAKK0ZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSAKK3N1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIAorbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgCitvZiB0aGUgUGx1Zy1pbnMKKyAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgCitGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgCitsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Cis8L3VsPgorCis8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIAorY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIAorY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAorKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55CisgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKyAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKyAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+CisgICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorPC91bD4KKworPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgCitpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QKKyBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQoraW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIAorRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgoraW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIAorZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiAKK2ZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCitTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIAordGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCAKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCit0aGF0IGRpcmVjdG9yeS48L3A+CisKKzxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4KKyAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Cis8L3VsPgorCis8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCAKK0NPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgCitvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyAKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisKKworPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisKKzxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgCitleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKKyAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgCithbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKyAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIAorY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgCitwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisKKzxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbAorIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQorICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvCisgYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neQorICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgCitUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIAordGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSAKK2FjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKworPG9sPgorICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gCit3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgCitleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAorICAgICAgIHByb2R1Y3QuPC9saT4KKyAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IAorbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgCit0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKyAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIAorU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0CisgZ292ZXJuCisgICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIAordXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIAorVXBvbiBzdWNoCisgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK3dpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgorPC9vbD4KKworPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisKKzxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZQorIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgCithbmQvb3IgcmUtZXhwb3J0IHRvCisgICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiAKK3NvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCitjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIAordGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCis8cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvcGx1Z2luLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU5NzA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsNTMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8cGx1Z2luPgorCisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgICAgICA8ZWRpdG9yCisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIgorICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yIgorICAgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgICBleHRlbnNpb25zPSJjaGFydCIKKyAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2NoYXJ0LnBuZyIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisgICAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5lZGl0b3IuSmF2YUVkaXRvcklucHV0TWF0Y2hlciIKKyAgICAgICAgICAgICAgbmFtZT0iT1NCUCBDaGFydERTTCBFZGl0b3IiPgorICAgICAgICA8L2VkaXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oeXBlcmxpbmtpbmcuT3BlbkRlY2xhcmF0aW9uSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb24iPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhhbmRsZXIuVmFsaWRhdGVBY3Rpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnZhbGlkYXRlIj4KKyAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgIAk8L2hhbmRsZXI+CisgICAgICAJPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWVIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIAk8YW5kPgorICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJICAgICAgICAgICAgICAgIDxpdGVyYXRlPgorCQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lTm9kZSIgLz4KKwkJCQkJPC9pdGVyYXRlPgorCQkJCTwvYW5kPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5kZWZpbml0aW9ucyI+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0iaXNBY3RpdmVFZGl0b3JBbkluc3RhbmNlT2ZYdGV4dEVkaXRvciIvPgorICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yLmxhbmd1YWdlTmFtZSIgCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc1h0ZXh0RWRpdG9yQWN0aXZlIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgIAorICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvZGVmaW5pdGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfY2hhcnQucG5nIgorICAgICAgICAgICAgbmFtZT0iT1NCUCBDaGFydERTTCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLmNvbG9yaW5nIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2NoYXJ0LnBuZyIKKyAgICAgICAgICAgIG5hbWU9IlN5bnRheCBDb2xvcmluZyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnRlbXBsYXRlcyIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9jaGFydC5wbmciCisgICAgICAgICAgICBuYW1lPSJUZW1wbGF0ZXMiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkua2V5d29yZF9DaGFydERTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5wcmVmZXJlbmNlcy5MYW5ndWFnZVJvb3RQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2NoYXJ0LnBuZyIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisgICAgICAgICAgICAgIG5hbWU9Ik9TQlAgQ2hhcnREU0wiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkua2V5d29yZF9DaGFydERTTCIvPgorICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgorCSAgICAgICAgICAgIDxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIvPgorCQkJPC9lbmFibGVkV2hlbj4KKwkgICAgICAgIDxmaWx0ZXIgbmFtZT0icHJvamVjdE5hdHVyZSIgdmFsdWU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZSIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkua2V5d29yZHMiPgorICAgICAgICA8a2V5d29yZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkua2V5d29yZF9DaGFydERTTCIKKyAgICAgICAgICAgIGxhYmVsPSJPU0JQIENoYXJ0RFNMIi8+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKyAgICAgIDxjb21tYW5kCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iVHJpZ2dlciBleHBlbnNpdmUgdmFsaWRhdGlvbiIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCIKKyAgICAgICAgICAgIG5hbWU9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC52YWxpZGF0ZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1jb3B5Ij4KKyAgICAgICAgIAk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSIgCisgICAgICAgICAJCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgICAgIAk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICAJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorICAgICAgICAgCTwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOm9yZy5lY2xpcHNlLnh0ZXh0LnVpLm91dGxpbmU/YWZ0ZXI9YWRkaXRpb25zIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSIgCisJCQkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJICAgICAgICAgICAgCTxhbmQ+CisJICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5YdGV4dEVkaXRvci5vcGVuZWQiIC8+CisJCQkJCQk8aXRlcmF0ZT4KKwkJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuSU91dGxpbmVOb2RlIiAvPgorCQkJCQkJPC9pdGVyYXRlPgorCQkJCQk8L2FuZD4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9lbmRvZj1ncm91cC5maW5kIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLkZpbmRSZWZlcmVuY2VzIj4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCSAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuRmluZFJlZmVyZW5jZXNIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICA8L2V4dGVuc2lvbj4gICAKKworPCEtLSBhZGRpbmcgcmVzb3VyY2UgZmFjdG9yaWVzIC0tPgorCisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgorCQk8cGFyc2VyCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkiCisJCQl0eXBlPSJjaGFydCI+CisJCTwvcGFyc2VyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnh0ZXh0LmV4dGVuc2lvbl9yZXNvdXJjZVNlcnZpY2VQcm92aWRlciI+CisgICAgICAgIDxyZXNvdXJjZVNlcnZpY2VQcm92aWRlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5JUmVzb3VyY2VVSVNlcnZpY2VQcm92aWRlciIKKyAgICAgICAgICAgIHVyaUV4dGVuc2lvbj0iY2hhcnQiPgorICAgICAgICA8L3Jlc291cmNlU2VydmljZVByb3ZpZGVyPgorICAgIDwvZXh0ZW5zaW9uPgorCisKKwk8IS0tIG1hcmtlciBkZWZpbml0aW9ucyBmb3Igb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCAtLT4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0iY2hhcnQuY2hlY2suZmFzdCIKKwkgICAgICAgIG5hbWU9Ik9TQlAgQ2hhcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmZhc3QiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0iY2hhcnQuY2hlY2subm9ybWFsIgorCSAgICAgICAgbmFtZT0iT1NCUCBDaGFydERTTCBQcm9ibGVtIgorCSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorCSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuY2hlY2subm9ybWFsIi8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCSAgICAgICAgaWQ9ImNoYXJ0LmNoZWNrLmV4cGVuc2l2ZSIKKwkgICAgICAgIG5hbWU9Ik9TQlAgQ2hhcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmV4cGVuc2l2ZSIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wYXJ0aWNpcGFudCI+CisgICAgICA8cGFydGljaXBhbnQKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5JWHRleHRCdWlsZGVyUGFydGljaXBhbnQiPgorICAgICAgPC9wYXJ0aWNpcGFudD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5jb21waWxlci5wcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9jaGFydC5wbmciCisgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIgorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5jb21waWxlci5wcm9wZXJ0eVBhZ2UiCisgICAgICAgICAgICAgIGljb249Imljb25zL2RzbF9jaGFydC5wbmciCisgICAgICAgICAgICAgIG5hbWU9IkNvbXBpbGVyIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmtleXdvcmRfQ2hhcnREU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorCisJPCEtLSBRdWljayBPdXRsaW5lIC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLnF1aWNrb3V0bGluZS5TaG93UXVpY2tPdXRsaW5lQWN0aW9uSGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIj4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorCQk8Y29tbWFuZAorCQkJZGVzY3JpcHRpb249Ik9wZW4gdGhlIHF1aWNrIG91dGxpbmUuIgorCQkJaWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSIKKwkJCW5hbWU9IlF1aWNrIE91dGxpbmUiPgorCQk8L2NvbW1hbmQ+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gUXVpY2sgT3V0bGluZSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorICAgIDwhLS0gcXVpY2tmaXggbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIC0tPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5pZGUubWFya2VyUmVzb2x1dGlvbiI+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jaGFydC5jaGVjay5mYXN0Ij4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY2hhcnQuY2hlY2subm9ybWFsIj4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY2hhcnQuY2hlY2suZXhwZW5zaXZlIj4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgIDwvZXh0ZW5zaW9uPgorICAgCTwhLS0gUmVuYW1lIFJlZmFjdG9yaW5nIC0tPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLkRlZmF1bHRSZW5hbWVFbGVtZW50SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudCI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50IgorICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPgorICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorCSAgICA8cGFnZQorCSAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisJICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLlJlZmFjdG9yaW5nUHJlZmVyZW5jZVBhZ2UiCisJICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5yZWZhY3RvcmluZyIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9jaGFydC5wbmciCisJICAgICAgICBuYW1lPSJSZWZhY3RvcmluZyI+CisJICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisJICAgIDwvcGFnZT4KKwk8L2V4dGVuc2lvbj4KKworPCEtLSBUeXBlIEhpZXJhcmNoeSAgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuUXVpY2tUeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uaGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5IgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5lZGl0LnRleHQuamF2YS5vcGVuLmhpZXJhcmNoeSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJRdWljayBUeXBlIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTwhLS0gQ2FsbCBIaWVyYWNoeSAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYWNoeUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCQorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIENhbGwgSGllcmFyY2h5Ij4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuc21hcC5TdHJhdHVtQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIj4KKyAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ii8+CisgICAgICA8L2ZhY3Rvcnk+IAorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KKyAgICAgIDxlZGl0b3JDb250cmlidXRpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5pZGUucnVsZXJBY3Rpb25zIj4KKwkgICAgIDxhY3Rpb24KKwkgICAgICAgICAgICAgbGFiZWw9Ik5vdCBVc2VkIgorCSAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJUb2dnbGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisJICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorCSAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKKwkgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuZG91YmxlQ2xpY2tCcmVha3BvaW50QWN0aW9uIi8+CisJICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgICB0YXJnZXRJRD0iZXhhbXBsZS5ydWxlckNvbnRleHRNZW51SWQiCisgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5pZGUuUnVsZXJQb3B1cEFjdGlvbnMiPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgbGFiZWw9IlRvZ2dsZSBCcmVha3BvaW50IgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLlJ1bGVyVG9nZ2xlQnJlYWtwb2ludEFjdGlvbkRlbGVnYXRlIgorICAgICAgICAgICAgbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLmlkZS5ydWxlckNvbnRleHRNZW51LnRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24iPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgCisgICAgPCEtLSBJbnRyb2R1Y2UgTG9jYWwgVmFyaWFibGUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdFZhcmlhYmxlSGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdExvY2FsVmFyaWFibGUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdExvY2FsVmFyaWFibGUiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4gIAorCisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudFZpZXdlcnMiPgorICAgIDx2aWV3ZXIgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuY29tcGFyZS5jb250ZW50Vmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5JbmplY3RhYmxlVmlld2VyQ3JlYXRvciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImNoYXJ0Ij4KKyAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5jb21wYXJlLmNvbnRlbnRNZXJnZVZpZXdlcnMiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJjaGFydCIgbGFiZWw9IkNoYXJ0RFNMIENvbXBhcmUiPgorICAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IubW9kZWwuWHRleHREb2N1bWVudFByb3ZpZGVyIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0iY2hhcnQiPgorICAgIDwvcHJvdmlkZXI+CisgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvcGx1Z2luLnhtbF9nZW4gYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3BsdWdpbi54bWxfZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWFkODMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3BsdWdpbi54bWxfZ2VuCkBAIC0wLDAgKzEsNTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8cGx1Z2luPgorCisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgICAgICA8ZWRpdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvciIKKyAgICAgICAgICAgIGNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IiCisgICAgICAgICAgICBkZWZhdWx0PSJ0cnVlIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0iY2hhcnQiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5lZGl0b3IuSmF2YUVkaXRvcklucHV0TWF0Y2hlciIKKyAgICAgICAgICAgIG5hbWU9IkNoYXJ0RFNMIEVkaXRvciI+CisgICAgICAgIDwvZWRpdG9yPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLk9wZW5EZWNsYXJhdGlvbiI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaGFuZGxlci5WYWxpZGF0ZUFjdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wudmFsaWRhdGUiPgorICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgCTwvaGFuZGxlcj4KKyAgICAgIAk8IS0tIGNvcHkgcXVhbGlmaWVkIG5hbWUgLS0+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZUhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5PdXRsaW5lQ29weVF1YWxpZmllZE5hbWVIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgCTxhbmQ+CisgICAgICAgICAgICAJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCIgLz4KKwkgICAgICAgICAgICAgICAgPGl0ZXJhdGU+CisJCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuSU91dGxpbmVOb2RlIiAvPgorCQkJCQk8L2l0ZXJhdGU+CisJCQkJPC9hbmQ+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KKyAgICAgICAgPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc0FjdGl2ZUVkaXRvckFuSW5zdGFuY2VPZlh0ZXh0RWRpdG9yIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDwvd2l0aD4gICAgICAgIAorICAgICAgICAgICAgPC9hbmQ+CisgICAgICAgIDwvZGVmaW5pdGlvbj4KKyAgICAgICAgPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuWHRleHRFZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgIDxhbmQ+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9ImlzWHRleHRFZGl0b3JBY3RpdmUiLz4KKyAgICAgICAgICAgICAgICA8d2l0aCB2YXJpYWJsZT0iYWN0aXZlRWRpdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgPHRlc3QgcHJvcGVydHk9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvci5sYW5ndWFnZU5hbWUiIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgCisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9kZWZpbml0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuTGFuZ3VhZ2VSb290UHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIG5hbWU9IkNoYXJ0RFNMIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmtleXdvcmRfQ2hhcnREU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5zeW50YXhjb2xvcmluZy5TeW50YXhDb2xvcmluZ1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuY29sb3JpbmciCisgICAgICAgICAgICBuYW1lPSJTeW50YXggQ29sb3JpbmciPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkua2V5d29yZF9DaGFydERTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnRlbXBsYXRlcy5YdGV4dFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC50ZW1wbGF0ZXMiCisgICAgICAgICAgICBuYW1lPSJUZW1wbGF0ZXMiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkua2V5d29yZF9DaGFydERTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuTGFuZ3VhZ2VSb290UHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIG5hbWU9IkNoYXJ0RFNMIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmtleXdvcmRfQ2hhcnREU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KKyAgICAgICAgPGtleXdvcmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmtleXdvcmRfQ2hhcnREU0wiCisgICAgICAgICAgICBsYWJlbD0iQ2hhcnREU0wiLz4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wudmFsaWRhdGUiCisgICAgICAgICAgICBuYW1lPSJWYWxpZGF0ZSI+CisgICAgICA8L2NvbW1hbmQ+CisgICAgICA8IS0tIGNvcHkgcXVhbGlmaWVkIG5hbWUgLS0+CisgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSIKKyAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCisgICAgICAgICAgICBkZXNjcmlwdGlvbj0iQ29weSB0aGUgcXVhbGlmaWVkIG5hbWUgZm9yIHRoZSBzZWxlY3RlZCBlbGVtZW50IgorICAgICAgICAgICAgbmFtZT0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICA8L2NvbW1hbmQ+CisgICAgICA8Y29tbWFuZAorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5PdXRsaW5lQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCIKKyAgICAgICAgICAgIG5hbWU9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgICAgICBzdHlsZT0icHVzaCIKKyAgICAgICAgICAgICAgICAgdG9vbHRpcD0iVHJpZ2dlciBleHBlbnNpdmUgdmFsaWRhdGlvbiI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8IS0tIGNvcHkgcXVhbGlmaWVkIG5hbWUgLS0+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWNvcHkiPgorICAgICAgICAgCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIiAKKyAgICAgICAgIAkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIgLz4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorICAgICAgICAgCTwvY29tbWFuZD4gIAorICAgICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24gbG9jYXRpb25VUkk9Im1lbnU6ZWRpdD9hZnRlcj1jb3B5Ij4KKyAgICAgICAgIAk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5FZGl0b3JDb3B5UXVhbGlmaWVkTmFtZSIKKyAgICAgICAgICAgIAlzdHlsZT0icHVzaCIgdG9vbHRpcD0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICAgICAgICAJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisgICAgICAgICAJPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6b3JnLmVjbGlwc2UueHRleHQudWkub3V0bGluZT9hZnRlcj1hZGRpdGlvbnMiPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIiAKKwkJCQlzdHlsZT0icHVzaCIgdG9vbHRpcD0iQ29weSBRdWFsaWZpZWQgTmFtZSI+CisgICAgICAgICAJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkgICAgICAgICAgICAJPGFuZD4KKwkgICAgICAgICAgICAJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCIgLz4KKwkJCQkJCTxpdGVyYXRlPgorCQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5JT3V0bGluZU5vZGUiIC8+CisJCQkJCQk8L2l0ZXJhdGU+CisJCQkJCTwvYW5kPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2VuZG9mPWdyb3VwLmZpbmQiPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5maW5kcmVmcy5GaW5kUmVmZXJlbmNlc0hhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5GaW5kUmVmZXJlbmNlcyI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgIDwvZXh0ZW5zaW9uPiAgIAorCis8IS0tIGFkZGluZyByZXNvdXJjZSBmYWN0b3JpZXMgLS0+CisKKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+CisJCTxwYXJzZXIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeSIKKwkJCXR5cGU9ImNoYXJ0Ij4KKwkJPC9wYXJzZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuZXh0ZW5zaW9uX3Jlc291cmNlU2VydmljZVByb3ZpZGVyIj4KKyAgICAgICAgPHJlc291cmNlU2VydmljZVByb3ZpZGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlc291cmNlLklSZXNvdXJjZVVJU2VydmljZVByb3ZpZGVyIgorICAgICAgICAgICAgdXJpRXh0ZW5zaW9uPSJjaGFydCI+CisgICAgICAgIDwvcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXI+CisgICAgPC9leHRlbnNpb24+CisKKworCTwhLS0gbWFya2VyIGRlZmluaXRpb25zIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIC0tPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJjaGFydGRzbC5jaGVjay5mYXN0IgorCSAgICAgICAgbmFtZT0iQ2hhcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmZhc3QiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0iY2hhcnRkc2wuY2hlY2subm9ybWFsIgorCSAgICAgICAgbmFtZT0iQ2hhcnREU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLm5vcm1hbCIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJjaGFydGRzbC5jaGVjay5leHBlbnNpdmUiCisJICAgICAgICBuYW1lPSJDaGFydERTTCBQcm9ibGVtIgorCSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorCSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuY2hlY2suZXhwZW5zaXZlIi8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnBhcnRpY2lwYW50Ij4KKyAgICAgIDxwYXJ0aWNpcGFudAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLklYdGV4dEJ1aWxkZXJQYXJ0aWNpcGFudCIKKyAgICAgICAgICAgIGZpbGVFeHRlbnNpb25zPSJjaGFydCIKKyAgICAgICAgICAgID4KKyAgICAgIDwvcGFydGljaXBhbnQ+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuY29tcGlsZXIucHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5jb21waWxlci5wcm9wZXJ0eVBhZ2UiCisgICAgICAgICAgICBuYW1lPSJDb21waWxlciI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+CisJICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisJCQk8L2VuYWJsZWRXaGVuPgorCSAgICAgICAgPGZpbHRlciBuYW1lPSJwcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKworCTwhLS0gUXVpY2sgT3V0bGluZSAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5xdWlja291dGxpbmUuU2hvd1F1aWNrT3V0bGluZUFjdGlvbkhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbW1hbmRzIj4KKwkJPGNvbW1hbmQKKwkJCWRlc2NyaXB0aW9uPSJPcGVuIHRoZSBxdWljayBvdXRsaW5lLiIKKwkJCWlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQluYW1lPSJRdWljayBPdXRsaW5lIj4KKwkJPC9jb21tYW5kPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIFF1aWNrIE91dGxpbmUiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8IS0tIHF1aWNrZml4IG1hcmtlciByZXNvbHV0aW9uIGdlbmVyYXRvciBmb3Igb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTCAtLT4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY2hhcnRkc2wuY2hlY2suZmFzdCI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNoYXJ0ZHNsLmNoZWNrLm5vcm1hbCI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNoYXJ0ZHNsLmNoZWNrLmV4cGVuc2l2ZSI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgIAk8IS0tIFJlbmFtZSBSZWZhY3RvcmluZyAtLT4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5EZWZhdWx0UmVuYW1lRWxlbWVudEhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLlJlbmFtZUVsZW1lbnQiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudCIKKyAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KKyAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKwkgICAgPHBhZ2UKKwkgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIgorCSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5SZWZhY3RvcmluZ1ByZWZlcmVuY2VQYWdlIgorCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wucmVmYWN0b3JpbmciCisJICAgICAgICBuYW1lPSJSZWZhY3RvcmluZyI+CisJICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5rZXl3b3JkX0NoYXJ0RFNMIi8+CisJICAgIDwvcGFnZT4KKwk8L2V4dGVuc2lvbj4KKworPCEtLSBUeXBlIEhpZXJhcmNoeSAgLS0+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuUXVpY2tUeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuamR0LnVpLmVkaXQudGV4dC5qYXZhLm9wZW4uaGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5IgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLmpkdC51aS5lZGl0LnRleHQuamF2YS5vcGVuLmhpZXJhcmNoeSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJRdWljayBUeXBlIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorCTwhLS0gQ2FsbCBIaWVyYWNoeSAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYWNoeUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorCQorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKwkJPG1lbnVDb250cmlidXRpb24KKwkJCWxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAub3BlbiI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeSIKKwkJCQlzdHlsZT0icHVzaCIKKwkJCQl0b29sdGlwPSJPcGVuIENhbGwgSGllcmFyY2h5Ij4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdGVycyI+CisgICAgICA8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuc21hcC5TdHJhdHVtQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIj4KKyAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ii8+CisgICAgICA8L2ZhY3Rvcnk+IAorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KKyAgICAgIDxlZGl0b3JDb250cmlidXRpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5ydWxlckFjdGlvbnMiPgorCSAgICAgPGFjdGlvbgorCSAgICAgICAgICAgICBsYWJlbD0iTm90IFVzZWQiCisJICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5SdWxlclRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25EZWxlZ2F0ZSIKKwkgICAgICAgICAgICAgc3R5bGU9InB1c2giCisJICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgorCSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5kb3VibGVDbGlja0JyZWFrcG9pbnRBY3Rpb24iLz4KKwkgIDwvZWRpdG9yQ29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KKyAgICAgIDx2aWV3ZXJDb250cmlidXRpb24KKyAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLlJ1bGVyQ29udGV4dCIKKyAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLlJ1bGVyUG9wdXBBY3Rpb25zIj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgIGxhYmVsPSJUb2dnbGUgQnJlYWtwb2ludCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5SdWxlclRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25EZWxlZ2F0ZSIKKyAgICAgICAgICAgIG1lbnViYXJQYXRoPSJkZWJ1ZyIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnJ1bGVyQ29udGV4dE1lbnUudG9nZ2xlQnJlYWtwb2ludEFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgIGxhYmVsPSJOb3QgdXNlZCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5SdWxlckVuYWJsZURpc2FibGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgICBtZW51YmFyUGF0aD0iZGVidWciCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5ydWxlckNvbnRleHRNZW51LmVuYWJsZURpc2FibGVCcmVha3BvaW50QWN0aW9uIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICBsYWJlbD0iQnJlYWtwb2ludCBQcm9wZXJ0aWVzIgorICAgICAgICAgICBoZWxwQ29udGV4dElkPSJicmVha3BvaW50X3Byb3BlcnRpZXNfYWN0aW9uX2NvbnRleHQiCisgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuamR0LmRlYnVnLnVpLmFjdGlvbnMuSmF2YUJyZWFrcG9pbnRQcm9wZXJ0aWVzUnVsZXJBY3Rpb25EZWxlZ2F0ZSIKKyAgICAgICAgICAgbWVudWJhclBhdGg9Imdyb3VwLnByb3BlcnRpZXMiCisgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLnJ1bGVyQ29udGV4dE1lbnUub3BlbkJyZWFwb2ludFByb3BlcnRpZXNBY3Rpb24iPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgIDwhLS0gSW50cm9kdWNlIExvY2FsIFZhcmlhYmxlIFJlZmFjdG9yaW5nIC0tPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLnJlZmFjdG9yaW5nLkV4dHJhY3RWYXJpYWJsZUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLnJlZmFjdG9yaW5nLkV4dHJhY3RMb2NhbFZhcmlhYmxlIj4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICA8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLnJlZmFjdG9yaW5nLkV4dHJhY3RMb2NhbFZhcmlhYmxlIgorICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPgorICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+ICAKKyAgIDwhLS0gT3BlbiBpbXBsZW1lbnRhdGlvbiAtLT4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKyAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLm5hdmlnYXRpb24uT3BlbkltcGxlbWVudGF0aW9uSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuT3BlbkltcGxlbWVudGF0aW9uQ29tbWFuZCI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKyAgICAgIDwvaGFuZGxlcj4KKyAgIDwvZXh0ZW5zaW9uPgorIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6bmF2aWdhdGU/YWZ0ZXI9b3Blbi5leHQ0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuT3BlbkltcGxlbWVudGF0aW9uQ29tbWFuZCI+CisJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorCQk8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPgorICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50Vmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTC5jb21wYXJlLmNvbnRlbnRWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5jb21wYXJlLkluamVjdGFibGVWaWV3ZXJDcmVhdG9yIgorICAgICAgICAgICAgZXh0ZW5zaW9ucz0iY2hhcnQiPgorICAgIDwvdmlld2VyPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIj4KKyAgICA8dmlld2VyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLkNoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5JbmplY3RhYmxlVmlld2VyQ3JlYXRvciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImNoYXJ0IiBsYWJlbD0iQ2hhcnREU0wgQ29tcGFyZSI+CisgICAgIDwvdmlld2VyPgorICA8L2V4dGVuc2lvbj4KKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+CisgICAgPHByb3ZpZGVyIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5tb2RlbC5YdGV4dERvY3VtZW50UHJvdmlkZXIiCisgICAgICAgICAgICBleHRlbnNpb25zPSJjaGFydCI+CisgICAgPC9wcm92aWRlcj4KKyAgPC9leHRlbnNpb24+CisKKzwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9wb20ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OGZiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3BvbS54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQWJzdHJhY3RDaGFydERTTFVpTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9BYnN0cmFjdENoYXJ0RFNMVWlNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWRlZjJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQWJzdHJhY3RDaGFydERTTFVpTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLkRlZmF1bHRVaU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKKworLyoqCisgKiBNYW51YWwgbW9kaWZpY2F0aW9ucyBnbyB0byB7b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTFVpTW9kdWxlfQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENoYXJ0RFNMVWlNb2R1bGUgZXh0ZW5kcyBEZWZhdWx0VWlNb2R1bGUgeworCQorCXB1YmxpYyBBYnN0cmFjdENoYXJ0RFNMVWlNb2R1bGUoQWJzdHJhY3RVSVBsdWdpbiBwbHVnaW4pIHsKKwkJc3VwZXIocGx1Z2luKTsKKwl9CisJCisJCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLkltcGxpY2l0VWlGcmFnbWVudAorCXB1YmxpYyBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjxvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5jb250YWluZXJzLklBbGxDb250YWluZXJzU3RhdGU+IHByb3ZpZGVJQWxsQ29udGFpbmVyc1N0YXRlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLkFjY2Vzcy5nZXRKYXZhUHJvamVjdHNTdGF0ZSgpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5JbXBsaWNpdFVpRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvcj4gYmluZFh0ZXh0RWRpdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuZWRpdG9yLlhiYXNlRWRpdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5JbXBsaWNpdFVpRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5tb2RlbC5YdGV4dERvY3VtZW50UHJvdmlkZXI+IGJpbmRYdGV4dERvY3VtZW50UHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5lZGl0b3IuWGJhc2VEb2N1bWVudFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5JUHJvcG9zYWxDb25mbGljdEhlbHBlcj4gYmluZElQcm9wb3NhbENvbmZsaWN0SGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuQW50bHJQcm9wb3NhbENvbmZsaWN0SGVscGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSGlnaGxpZ2h0aW5nTGV4ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC51aS5MZXhlclVJQmluZGluZ3MuSElHSExJR0hUSU5HKSkudG8ob3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTExleGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUhpZ2hsaWdodGluZ1Rva2VuRGVmUHJvdmlkZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSVRva2VuRGVmUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC51aS5MZXhlclVJQmluZGluZ3MuSElHSExJR0hUSU5HKSkudG8ob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyVG9rZW5EZWZQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUmVzb3VyY2VEZXNjcmlwdGlvbnNCdWlsZGVyU2NvcGUoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlRGVzY3JpcHRpb25zUHJvdmlkZXIuTkFNRURfQlVJTERFUl9TQ09QRSkpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuY2x1c3RlcmluZy5DdXJyZW50RGVzY3JpcHRpb25zLlJlc291cmNlU2V0QXdhcmUuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuSVh0ZXh0RWRpdG9yQ2FsbGJhY2s+IGJpbmRJWHRleHRFZGl0b3JDYWxsYmFjaygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIubmF0dXJlLk5hdHVyZUFkZGluZ0VkaXRvckNhbGxiYWNrLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zUGVyc2lzdGVkKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuaW1wbC5SZXNvdXJjZURlc2NyaXB0aW9uc1Byb3ZpZGVyLlBFUlNJU1RFRF9ERVNDUklQVElPTlMpKS50byhvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLmJ1aWxkZXJTdGF0ZS5JQnVpbGRlclN0YXRlLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLkRvY3VtZW50QmFzZWREaXJ0eVJlc291cmNlPiBiaW5kRG9jdW1lbnRCYXNlZERpcnR5UmVzb3VyY2UoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLmltcGwuUGVyc2lzdGVudERhdGFBd2FyZURpcnR5UmVzb3VyY2UuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdlbmVyYXRvci5HZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5JWHRleHRCdWlsZGVyUGFydGljaXBhbnQ+IGJpbmRJWHRleHRCdWlsZGVyUGFydGljaXBhbnQoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLkJ1aWxkZXJQYXJ0aWNpcGFudC5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290IGJpbmRJV29ya3NwYWNlUm9vdFRvSW5zdGFuY2UoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5nZW5lcmF0b3IuR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVCdWlsZGVyUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQoImJ1aWxkZXJQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiKSkudG8ob3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZUFjY2Vzcy5Jbml0aWFsaXplci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmxhYmVsaW5nLkxhYmVsUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcj4gYmluZElMYWJlbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5sYWJlbGluZy5DaGFydERTTExhYmVsUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmxhYmVsaW5nLkxhYmVsUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJlc291cmNlVUlTZXJ2aWNlTGFiZWxQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkucmVzb3VyY2UuUmVzb3VyY2VTZXJ2aWNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmNsYXNzKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmxhYmVsaW5nLkNoYXJ0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3Iub3V0bGluZS5PdXRsaW5lVHJlZVByb3ZpZGVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLklPdXRsaW5lVHJlZVByb3ZpZGVyPiBiaW5kSU91dGxpbmVUcmVlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLm91dGxpbmUuQ2hhcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5vdXRsaW5lLk91dGxpbmVUcmVlUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuaW1wbC5JT3V0bGluZVRyZWVTdHJ1Y3R1cmVQcm92aWRlcj4gYmluZElPdXRsaW5lVHJlZVN0cnVjdHVyZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5vdXRsaW5lLkNoYXJ0RFNMT3V0bGluZVRyZWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguSXNzdWVSZXNvbHV0aW9uUHJvdmlkZXI+IGJpbmRJc3N1ZVJlc29sdXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkucXVpY2tmaXguQ2hhcnREU0xRdWlja2ZpeFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5jb250ZW50QXNzaXN0LkNvbnRlbnRBc3Npc3RGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyPiBiaW5kSUNvbnRlbnRQcm9wb3NhbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0LkNoYXJ0RFNMUHJvcG9zYWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dC5GYWN0b3J5PiBiaW5kQ29udGVudEFzc2lzdENvbnRleHQkRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLlBhcnNlckJhc2VkQ29udGVudEFzc2lzdENvbnRleHRGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLklDb250ZW50QXNzaXN0UGFyc2VyPiBiaW5kSUNvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuQ2hhcnREU0xQYXJzZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbnRlbnRBc3Npc3RMZXhlclByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsQ2hhcnREU0xMZXhlci5jbGFzcykudG9Qcm92aWRlcihvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJQcm92aWRlci5jcmVhdGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsQ2hhcnREU0xMZXhlci5jbGFzcykpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVDb250ZW50QXNzaXN0TGV4ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLkxleGVyVUlCaW5kaW5ncy5DT05URU5UX0FTU0lTVCkpLnRvKG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbENoYXJ0RFNMTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQoIlJlZmFjdG9yaW5nUHJlZmVyZW5jZXMiKSkudG8ob3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlcy5Jbml0aWFsaXplci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLnJlZmFjdG9yaW5nLlJlZmFjdG9yRWxlbWVudE5hbWVGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuSVJlbmFtZVN1cHBvcnQuRmFjdG9yeT4gYmluZElSZW5hbWVTdXBwb3J0JEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSmR0UmVuYW1lU3VwcG9ydC5GYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVTdHJhdGVneS5Qcm92aWRlcj4gYmluZElSZW5hbWVTdHJhdGVneSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudC5Kdm1NZW1iZXJSZW5hbWVTdHJhdGVneS5Qcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucmVmYWN0b3JpbmcuUmVmYWN0b3JFbGVtZW50TmFtZUZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSnZtTWVtYmVyUmVuYW1lU3RyYXRlZ3kkUHJvdmlkZXIkRGVsZWdhdGUoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVuYW1lU3RyYXRlZ3kuUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50Lkp2bU1lbWJlclJlbmFtZVN0cmF0ZWd5LlByb3ZpZGVyLkRlbGVnYXRlLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5pbXBsLkRlZmF1bHRSZW5hbWVTdHJhdGVneVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYmluZENsYXNzTG9hZGVyVG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5JSnZtVHlwZVByb3ZpZGVyLkZhY3Rvcnk+IGJpbmRJSnZtVHlwZVByb3ZpZGVyJEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLmpkdC5KZHRUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0QmFzZWRTaW1wbGVUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLklUeXBlc1Byb3Bvc2FsUHJvdmlkZXI+IGJpbmRJVHlwZXNQcm9wb3NhbFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LnVpLkpkdFR5cGVzUHJvcG9zYWxQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5qZHQuSUphdmFQcm9qZWN0UHJvdmlkZXI+IGJpbmRJSmF2YVByb2plY3RQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy54dGV4dC51aS5YdGV4dFJlc291cmNlU2V0QmFzZWRQcm9qZWN0UHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlByZWZpeE1hdGNoZXI+IGJpbmRQcmVmaXhNYXRjaGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuRlFOUHJlZml4TWF0Y2hlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklWYWxpZGF0aW9uSm9iU2NoZWR1bGVyPiBiaW5kSVZhbGlkYXRpb25Kb2JTY2hlZHVsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQudWkuSmR0VmFsaWRhdGlvbkpvYlNjaGVkdWxlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuaW1wbC5SZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXI+IGJpbmRSZWZhY3RvcmluZ1Jlc291cmNlU2V0UHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucmVmYWN0b3JpbmcuSnZtUmVmYWN0b3JpbmdSZXNvdXJjZVNldFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuQWJzdHJhY3RBbnRsclRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlcj4gYmluZEFic3RyYWN0QW50bHJUb2tlblRvQXR0cmlidXRlSWRNYXBwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5zeW50YXhjb2xvcmluZy5YYmFzZVRva2VuVG9BdHRyaWJ1dGVJZE1hcHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RKYXZhQmFzZWRDb250ZW50UHJvcG9zYWxQcm92aWRlci5SZWZlcmVuY2VQcm9wb3NhbENyZWF0b3I+IGJpbmRBYnN0cmFjdEphdmFCYXNlZENvbnRlbnRQcm9wb3NhbFByb3ZpZGVyJFJlZmVyZW5jZVByb3Bvc2FsQ3JlYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmNvbnRlbnRhc3Npc3QuWGJhc2VSZWZlcmVuY2VQcm9wb3NhbENyZWF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3Nvcj4gYmluZElDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuUmVwZWF0ZWRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSVNlbWFudGljSGlnaGxpZ2h0aW5nQ2FsY3VsYXRvcj4gYmluZElTZW1hbnRpY0hpZ2hsaWdodGluZ0NhbGN1bGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWdobGlnaHRpbmcuWGJhc2VIaWdobGlnaHRpbmdDYWxjdWxhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuSUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24+IGJpbmRJSGlnaGxpZ2h0aW5nQ29uZmlndXJhdGlvbigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZ2hsaWdodGluZy5YYmFzZUhpZ2hsaWdodGluZ0NvbmZpZ3VyYXRpb24uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyUHJvdmlkZXI+IGJpbmRJRU9iamVjdEhvdmVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5ob3Zlci5YYmFzZUhvdmVyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5JRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlRGlzcGF0Y2hpbmdFT2JqZWN0VGV4dEhvdmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyPiBiaW5kSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhvdmVyLlhiYXNlSG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5EZWZhdWx0UXVpY2tmaXhQcm92aWRlci5Dcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXI+IGJpbmREZWZhdWx0UXVpY2tmaXhQcm92aWRlciRDcm9zc1JlZlJlc29sdXRpb25Db252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5xdWlja2ZpeC5YYmFzZUNyb3NzUmVmUmVzb2x1dGlvbkNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS52YWxpZGF0aW9uLlhiYXNlVUlWYWxpZGF0b3I+IGJpbmRYYmFzZVVJVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkudmFsaWRhdGlvbi5YYmFzZVVJVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLklIeXBlcmxpbmtIZWxwZXI+IGJpbmRJSHlwZXJsaW5rSGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkubmF2aWdhdGlvbi5UeXBlTGl0ZXJhbEF3YXJlSHlwZXJsaW5rSGVscGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLklGZWF0dXJlU2NvcGVUcmFja2VyLlByb3ZpZGVyPiBiaW5kSUZlYXR1cmVTY29wZVRyYWNrZXIkUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLk9wdGltaXppbmdGZWF0dXJlU2NvcGVUcmFja2VyUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5maW5kcmVmcy5GaW5kUmVmZXJlbmNlc0hhbmRsZXI+IGJpbmRGaW5kUmVmZXJlbmNlc0hhbmRsZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbEZpbmRSZWZlcmVuY2VIYW5kbGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuUmVmZXJlbmNlUXVlcnlFeGVjdXRvcj4gYmluZFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5maW5kcmVmcy5Kdm1Nb2RlbFJlZmVyZW5jZVF1ZXJ5RXhlY3V0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3I+IGJpbmRJRGVwZW5kZW50RWxlbWVudHNDYWxjdWxhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuSnZtTW9kZWxEZXBlbmRlbnRFbGVtZW50c0NhbGN1bGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLklSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyPiBiaW5kSVJlbmFtZVJlZmFjdG9yaW5nUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVSZWZhY3RvcmluZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5JUmVmZXJlbmNlVXBkYXRlcj4gYmluZElSZWZlcmVuY2VVcGRhdGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuWGJhc2VSZWZlcmVuY2VVcGRhdGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5JUmVuYW1lQ29udGV4dEZhY3Rvcnk+IGJpbmRJUmVuYW1lQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5qZHQuQ29tYmluZWRKdm1KZHRSZW5hbWVDb250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnVpLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50LkpkdFJlbmFtZVBhcnRpY2lwYW50LkNvbnRleHRGYWN0b3J5PiBiaW5kSmR0UmVuYW1lUGFydGljaXBhbnQkQ29udGV4dEZhY3RvcnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5qdm1tb2RlbC5yZWZhY3RvcmluZy5Kdm1Nb2RlbEpkdFJlbmFtZVBhcnRpY2lwYW50Q29udGV4dC5Db250ZXh0RmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuSVJlbmFtZVN0cmF0ZWd5PiBiaW5kSVJlbmFtZVN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwucmVmYWN0b3JpbmcuRGVmYXVsdEp2bU1vZGVsUmVuYW1lU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLmltcGwuT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyPiBiaW5kT3V0bGluZU5vZGVFbGVtZW50T3BlbmVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwub3V0bGluZS5Kdm1PdXRsaW5lTm9kZUVsZW1lbnRPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5HbG9iYWxVUklFZGl0b3JPcGVuZXI+IGJpbmRHbG9iYWxVUklFZGl0b3JPcGVuZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkubmF2aWdhdGlvbi5HbG9iYWxEZXJpdmVkTWVtYmVyQXdhcmVVUklFZGl0b3JPcGVuZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vY2N1cnJlbmNlcy5JT2NjdXJyZW5jZUNvbXB1dGVyPiBiaW5kSU9jY3VycmVuY2VDb21wdXRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm9jY3VycmVuY2UuSnZtTW9kZWxPY2N1cnJlbmNlQ29tcHV0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5xdWVyeS5JSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24+IGJpbmRJSmF2YVNlYXJjaFBhcnRpY2lwYXRpb24oKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWkucXVlcnkuSUphdmFTZWFyY2hQYXJ0aWNpcGF0aW9uLk5vLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlTGFuZ3VhZ2VTcGVjaWZpY1VSSUVkaXRvck9wZW5lcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWlmIChvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJLmlzV29ya2JlbmNoUnVubmluZygpKSB7IAorCQkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLklVUklFZGl0b3JPcGVuZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkuTGFuZ3VhZ2VTcGVjaWZpYy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuanZtbW9kZWwubmF2aWdhdGlvbi5EZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpOyAKKwkJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy51aS5uYXZpZ2F0aW9uLklEZXJpdmVkTWVtYmVyQXdhcmVFZGl0b3JPcGVuZXIuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmp2bW1vZGVsLm5hdmlnYXRpb24uRGVyaXZlZE1lbWJlckF3YXJlRWRpdG9yT3BlbmVyLmNsYXNzKTsgCisJCX07CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3Rvcj4gYmluZElIeXBlcmxpbmtEZXRlY3RvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLm5hdmlnYXRpb24uWGJhc2VIeXBlcmxpbmtEZXRlY3Rvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzPiBiaW5kSmF2YVR5cGVRdWlja2ZpeGVzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucXVpY2tmaXguSmF2YVR5cGVRdWlja2ZpeGVzTm9JbXBvcnRTZWN0aW9uLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uPiBwcm92aWRlVGVtcGxhdGVzTGFuZ3VhZ2VDb25maWd1cmF0aW9uKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5BY2Nlc3NpYmxlQ29kZXRlbXBsYXRlc0FjdGl2YXRvci5nZXRUZW1wbGF0ZXNMYW5ndWFnZUNvbmZpZ3VyYXRpb25Qcm92aWRlcigpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucmVnaXN0cnkuTGFuZ3VhZ2VSZWdpc3RyeT4gcHJvdmlkZUxhbmd1YWdlUmVnaXN0cnkoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLkFjY2Vzc2libGVDb2RldGVtcGxhdGVzQWN0aXZhdG9yLmdldExhbmd1YWdlUmVnaXN0cnkoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyPiBiaW5kTGFuZ3VhZ2VSZWdpc3RyYXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnJlZ2lzdHJ5Lkxhbmd1YWdlUmVnaXN0cmFyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci50ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZT4gYmluZFh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWkucHJlZmVyZW5jZXMuQWR2YW5jZWRUZW1wbGF0ZXNQcmVmZXJlbmNlUGFnZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IudGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5wYXJ0aWFsRWRpdGluZy5JUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXI+IGJpbmRJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuUGFydGlhbENoYXJ0RFNMQ29udGVudEFzc2lzdFBhcnNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuY29tcGFyZS5Db21wYXJlRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLmNvbXBhcmUuSVZpZXdlckNyZWF0b3I+IGJpbmRJVmlld2VyQ3JlYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuRGVmYXVsdFZpZXdlckNyZWF0b3IuY2xhc3M7CisJfQorCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjE0ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmd1aWNlLkFic3RyYWN0R3VpY2VBd2FyZUV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuaW50ZXJuYWwuQ2hhcnREU0xBY3RpdmF0b3I7CisKKy8qKgorICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkLiBDdXN0b21pemF0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gaW4gYSBuZXdseQorICogaW50cm9kdWNlZCBzdWJjbGFzcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydERTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RHdWljZUF3YXJlRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisJCXJldHVybiBDaGFydERTTEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBDaGFydERTTEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEluamVjdG9yKENoYXJ0RFNMQWN0aXZhdG9yLk9SR19FQ0xJUFNFX09TQlBfWFRFWFRfQ0hBUlRfQ0hBUlREU0wpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGI5YmNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdENoYXJ0RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBnZW5lcmF0ZWQsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc3VwZXJjbGFzcyB7QGxpbmsgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkuY29udGVudGFzc2lzdC5YYmFzZVdpdGhBbm5vdGF0aW9uc1Byb3Bvc2FsUHJvdmlkZXJ9LgorICogTWV0aG9kcyBhcmUgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBvbiB0aGUgZmlyc3QgcGFyYW1ldGVyLCBpLmUuLCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0gCisgKiB3aXRoIGEgbW9yZSBjb25jcmV0ZSBzdWJ0eXBlLiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5jb250ZW50YXNzaXN0LlhiYXNlV2l0aEFubm90YXRpb25zUHJvcG9zYWxQcm92aWRlciB7CisJCQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRNb2RlbF9QYWNrYWdlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0UGFja2FnZV9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRQYWNrYWdlX0ltcG9ydHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydFBhY2thZ2VfQ2hhcnRzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRfTmFtZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0X0Rlc2NyaXB0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRfRGVzY3JpcHRpb25WYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0X0NoYXJ0dHlwZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0X1BvbGxpbmcoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydF9Qb2xsaW5nVGltZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0X1NvdXJjZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0QmFyX1NoYWRvdyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0QmFyX0FuaW1hdGVkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRCYXJfU3dhcHBlZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0QmFyX1N0YWNrZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydExpbmVfQW5pbWF0ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydExpbmVfU2hvd01hcmtlcihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGluZV9UcmVuZExpbmUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydExpbmVfQ3Vyc29yKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRMaW5lX1pvb20oRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydExpbmVfVG9vbHRpcChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGluZV9GaWxsVG9aZXJvKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRMaW5lX0ZpbGxBcmVhKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRQaWVfRW1wdHkoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEJ1YmJsZV9NdWx0aXBsaWVyKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRCdWJibGVfTXVsdGlwbGllclZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRCdWJibGVfR3JhZGllbnQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEJ1YmJsZV9UcmFuc3BhcmVudChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfTGFiZWxlZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfTGFiZWxWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfSGFzVGlja3MoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEdhdWdlX01pblZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRHYXVnZV9NYXhWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfSGFzSW50ZXJ2YWxzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRHYXVnZV9JbnRlcnZhbHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydFRyZWVfTWFwKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRUcmVlX0NvbGxhcHNpYmxlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJSYW5nZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0RGF0YW1hcnRfRGF0YW1hcnRSZWYoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJbG9va3VwQ3Jvc3NSZWZlcmVuY2UoKChDcm9zc1JlZmVyZW5jZSlhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnREYXRhbWFydF9FbGVtZW50cyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGVnZW5kX1BsYWNlbWVudChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGVnZW5kX1RvZ2dsZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGVnZW5kX1JlcGxvdChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0TGVnZW5kX1RvZ2dsZVR5cGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEhpZ2hsaWdodGVyX0xvY2F0aW9uKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRIaWdobGlnaHRlcl9Ub29sdGlwQWx3YXlzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRIaWdobGlnaHRlcl9JbnNpZGVDaGFydChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0QXhpc19BeGlzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0QXhpc19SZW5kZXJUeXBlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRBeGlzX1Nob3J0TGFiZWwoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEF4aXNfQW5nbGUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydFNlZ21lbnRDb2xvcl9SZ2IoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVDaGFydEltcG9ydF9JbXBvcnRlZE5hbWVzcGFjZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKyAgICAKKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydE1vZGVsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRQYWNrYWdlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydE9wdGlvbihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0NoYXJ0QmFyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRMaW5lKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRQaWUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydERvbnV0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRCdWJibGUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydEdhdWdlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRUcmVlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRJbnRlcnZhbChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0NoYXJ0TnVtYmVySW50ZXJ2YWwoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydERhdGFtYXJ0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRFbGVtZW50KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRMZWdlbmQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydEhpZ2hsaWdodGVyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRBeGlzKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRSYW5nZUVsZW1lbnQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydFNlZ21lbnRDb2xvcihFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0NoYXJ0SW1wb3J0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfU2lnbmVkTnVtYmVyKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVFJBTlNMQVRBQkxFU1RSSU5HKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVFJBTlNMQVRBQkxFSUQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9MZWdlbmRQbGFjZW1lbnRFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfVG9nZ2xlVHlwZUVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Ub29sdGlwTG9jYXRpb25FbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUmVuZGVyVHlwZUVudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvQ2hhcnREU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvQ2hhcnREU0xQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGU0YjIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9DaGFydERTTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNTczIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY29udGVudGFzc2lzdC5hbnRscjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS5SZWNvZ25pdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5BYnN0cmFjdEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuQWJzdHJhY3RDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkZvbGxvd0VsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcnZpY2VzLkNoYXJ0RFNMR3JhbW1hckFjY2VzczsKKworcHVibGljIGNsYXNzIENoYXJ0RFNMUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UGFyc2VyIHsKKwkKKwlASW5qZWN0CisJcHJpdmF0ZSBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwcml2YXRlIE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4gbmFtZU1hcHBpbmdzOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTFBhcnNlciBjcmVhdGVQYXJzZXIoKSB7CisJCW9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbENoYXJ0RFNMUGFyc2VyIHJlc3VsdCA9IG5ldyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTFBhcnNlcihudWxsKTsKKwkJcmVzdWx0LnNldEdyYW1tYXJBY2Nlc3MoZ3JhbW1hckFjY2Vzcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVsZU5hbWUoQWJzdHJhY3RFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKG5hbWVNYXBwaW5ncyA9PSBudWxsKSB7CisJCQluYW1lTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4oKSB7CisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCQkJeworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yXzEoKSwgInJ1bGVfX0NoYXJ0QnViYmxlX19BbHRlcm5hdGl2ZXNfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCksICJydWxlX19DaGFydFRyZWVfX0FsdGVybmF0aXZlc18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCksICJydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzVfMSgpLCAicnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzZfMSgpLCAicnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8wXzBfMF8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfM18xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzFfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzMoKSwgInJ1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzRfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQWx0ZXJuYXRpdmVzXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19BbHRlcm5hdGl2ZXNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8wKCksICJydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMV8xKCksICJydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXNfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8wXzMoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzFfMF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fVG9nZ2xlVHlwZUVudW1fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Ub29sdGlwTG9jYXRpb25FbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1JlbmRlclR5cGVFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NoYXJ0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX0NoYXJ0X19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fQ2hhcnRfX0dyb3VwXzZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRHcm91cF83KCksICJydWxlX19DaGFydF9fR3JvdXBfN19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydEJhcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0R3JvdXBfMl8zKCksICJydWxlX19DaGFydExpbmVfX0dyb3VwXzJfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydFBpZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydERvbnV0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSwgInJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCksICJydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEdyb3VwXzJfMSgpLCAicnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRHcm91cF8yXzIoKSwgInJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cF81KCksICJydWxlX19DaGFydEF4aXNfX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnRTZWdtZW50Q29sb3JfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzBfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCksICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCksICJydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzAoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMF8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82KCksICJydWxlX19PcE90aGVyX19Hcm91cF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMCgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzZfMV8wXzAoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzFfMigpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzNfMV8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWFNldExpdGVyYWxfX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8xKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMV8wXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwXzBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMV8xKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzYoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwXzZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wXzAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wXzAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xXzAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMV8wXzAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfNSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXBfMigpLCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfMCgpLCAicnVsZV9fWENhc2VQYXJ0X19Hcm91cF8zXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzNfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83KCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfN19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzdfMSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8yXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMigpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8xXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzIoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzNfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNCgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80XzFfMV8xKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wXzEoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzBfMCgpLCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX051bWJlcl9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFN0YXRpY1F1YWxpZmllckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19TdGF0aWNRdWFsaWZpZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzAoKSwgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfMigpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNCgpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzFfNF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzRfMF8wKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8yKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8xXzRfMl8yKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80XzJfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMSgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX0p2bVR5cGVQYXJhbWV0ZXJfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSwgInJ1bGVfX0NoYXJ0TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCksICJydWxlX19DaGFydFBhY2thZ2VfX05hbWVBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0SW1wb3J0c0Fzc2lnbm1lbnRfM18xKCksICJydWxlX19DaGFydFBhY2thZ2VfX0ltcG9ydHNBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRDaGFydHNBc3NpZ25tZW50XzNfMigpLCAicnVsZV9fQ2hhcnRQYWNrYWdlX19DaGFydHNBc3NpZ25tZW50XzNfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSwgInJ1bGVfX0NoYXJ0X19OYW1lQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCgpLCAicnVsZV9fQ2hhcnRfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEoKSwgInJ1bGVfX0NoYXJ0X19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydHR5cGVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX0NoYXJ0X19DaGFydHR5cGVBc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRQb2xsaW5nQXNzaWdubWVudF82XzAoKSwgInJ1bGVfX0NoYXJ0X19Qb2xsaW5nQXNzaWdubWVudF82XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRQb2xsaW5nVGltZUFzc2lnbm1lbnRfNl8xKCksICJydWxlX19DaGFydF9fUG9sbGluZ1RpbWVBc3NpZ25tZW50XzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldFNvdXJjZUFzc2lnbm1lbnRfN18xKCksICJydWxlX19DaGFydF9fU291cmNlQXNzaWdubWVudF83XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTaGFkb3dBc3NpZ25tZW50XzJfMCgpLCAicnVsZV9fQ2hhcnRCYXJfX1NoYWRvd0Fzc2lnbm1lbnRfMl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0QW5pbWF0ZWRBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fQ2hhcnRCYXJfX0FuaW1hdGVkQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTd2FwcGVkQXNzaWdubWVudF8yXzIoKSwgInJ1bGVfX0NoYXJ0QmFyX19Td2FwcGVkQXNzaWdubWVudF8yXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTdGFja2VkQXNzaWdubWVudF8yXzMoKSwgInJ1bGVfX0NoYXJ0QmFyX19TdGFja2VkQXNzaWdubWVudF8yXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0QW5pbWF0ZWRBc3NpZ25tZW50XzJfMCgpLCAicnVsZV9fQ2hhcnRMaW5lX19BbmltYXRlZEFzc2lnbm1lbnRfMl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFNob3dNYXJrZXJBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fQ2hhcnRMaW5lX19TaG93TWFya2VyQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VHJlbmRMaW5lQXNzaWdubWVudF8yXzIoKSwgInJ1bGVfX0NoYXJ0TGluZV9fVHJlbmRMaW5lQXNzaWdubWVudF8yXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q3Vyc29yQXNzaWdubWVudF8yXzNfMCgpLCAicnVsZV9fQ2hhcnRMaW5lX19DdXJzb3JBc3NpZ25tZW50XzJfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFpvb21Bc3NpZ25tZW50XzJfM18xKCksICJydWxlX19DaGFydExpbmVfX1pvb21Bc3NpZ25tZW50XzJfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFRvb2x0aXBBc3NpZ25tZW50XzJfM18yKCksICJydWxlX19DaGFydExpbmVfX1Rvb2x0aXBBc3NpZ25tZW50XzJfM18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEZpbGxUb1plcm9Bc3NpZ25tZW50XzJfNCgpLCAicnVsZV9fQ2hhcnRMaW5lX19GaWxsVG9aZXJvQXNzaWdubWVudF8yXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0RmlsbEFyZWFBc3NpZ25tZW50XzJfNSgpLCAicnVsZV9fQ2hhcnRMaW5lX19GaWxsQXJlYUFzc2lnbm1lbnRfMl81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0RW1wdHlBc3NpZ25tZW50XzIoKSwgInJ1bGVfX0NoYXJ0UGllX19FbXB0eUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldE11bHRpcGxpZXJBc3NpZ25tZW50XzJfMF8wKCksICJydWxlX19DaGFydEJ1YmJsZV9fTXVsdGlwbGllckFzc2lnbm1lbnRfMl8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyVmFsdWVBc3NpZ25tZW50XzJfMF8xKCksICJydWxlX19DaGFydEJ1YmJsZV9fTXVsdGlwbGllclZhbHVlQXNzaWdubWVudF8yXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEdyYWRpZW50QXNzaWdubWVudF8yXzFfMCgpLCAicnVsZV9fQ2hhcnRCdWJibGVfX0dyYWRpZW50QXNzaWdubWVudF8yXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFRyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSgpLCAicnVsZV9fQ2hhcnRCdWJibGVfX1RyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGFiZWxlZEFzc2lnbm1lbnRfMl8wXzAoKSwgInJ1bGVfX0NoYXJ0R2F1Z2VfX0xhYmVsZWRBc3NpZ25tZW50XzJfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRMYWJlbFZhbHVlQXNzaWdubWVudF8yXzBfMSgpLCAicnVsZV9fQ2hhcnRHYXVnZV9fTGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEhhc1RpY2tzQXNzaWdubWVudF8yXzFfMCgpLCAicnVsZV9fQ2hhcnRHYXVnZV9fSGFzVGlja3NBc3NpZ25tZW50XzJfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNaW5WYWx1ZUFzc2lnbm1lbnRfMl8xXzIoKSwgInJ1bGVfX0NoYXJ0R2F1Z2VfX01pblZhbHVlQXNzaWdubWVudF8yXzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWF4VmFsdWVBc3NpZ25tZW50XzJfMV80KCksICJydWxlX19DaGFydEdhdWdlX19NYXhWYWx1ZUFzc2lnbm1lbnRfMl8xXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEhhc0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzAoKSwgInJ1bGVfX0NoYXJ0R2F1Z2VfX0hhc0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzIoKSwgInJ1bGVfX0NoYXJ0R2F1Z2VfX0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0TWFwQXNzaWdubWVudF8yXzAoKSwgInJ1bGVfX0NoYXJ0VHJlZV9fTWFwQXNzaWdubWVudF8yXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0Q29sbGFwc2libGVBc3NpZ25tZW50XzJfMSgpLCAicnVsZV9fQ2hhcnRUcmVlX19Db2xsYXBzaWJsZUFzc2lnbm1lbnRfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yKCksICJydWxlX19DaGFydE51bWJlckludGVydmFsX19OdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJSYW5nZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0UmVmQXNzaWdubWVudF8xKCksICJydWxlX19DaGFydERhdGFtYXJ0X19EYXRhbWFydFJlZkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0VsZW1lbnRzQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0UGxhY2VtZW50QXNzaWdubWVudF8xKCksICJydWxlX19DaGFydExlZ2VuZF9fUGxhY2VtZW50QXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0VG9nZ2xlQXNzaWdubWVudF8yXzAoKSwgInJ1bGVfX0NoYXJ0TGVnZW5kX19Ub2dnbGVBc3NpZ25tZW50XzJfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFJlcGxvdEFzc2lnbm1lbnRfMl8xKCksICJydWxlX19DaGFydExlZ2VuZF9fUmVwbG90QXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRUb2dnbGVUeXBlQXNzaWdubWVudF8yXzIoKSwgInJ1bGVfX0NoYXJ0TGVnZW5kX19Ub2dnbGVUeXBlQXNzaWdubWVudF8yXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldExvY2F0aW9uQXNzaWdubWVudF8xKCksICJydWxlX19DaGFydEhpZ2hsaWdodGVyX19Mb2NhdGlvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0VG9vbHRpcEFsd2F5c0Fzc2lnbm1lbnRfMl8wKCksICJydWxlX19DaGFydEhpZ2hsaWdodGVyX19Ub29sdGlwQWx3YXlzQXNzaWdubWVudF8yXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldEluc2lkZUNoYXJ0QXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0luc2lkZUNoYXJ0QXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QXhpc0Fzc2lnbm1lbnRfMSgpLCAicnVsZV9fQ2hhcnRBeGlzX19BeGlzQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFJlbmRlclR5cGVBc3NpZ25tZW50XzMoKSwgInJ1bGVfX0NoYXJ0QXhpc19fUmVuZGVyVHlwZUFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRTaG9ydExhYmVsQXNzaWdubWVudF80KCksICJydWxlX19DaGFydEF4aXNfX1Nob3J0TGFiZWxBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QW5nbGVBc3NpZ25tZW50XzVfMSgpLCAicnVsZV9fQ2hhcnRBeGlzX19BbmdsZUFzc2lnbm1lbnRfNV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0UmdiQXNzaWdubWVudF8xKCksICJydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fUmdiQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0NoYXJ0SW1wb3J0X19JbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCksICJydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCksICJydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzBfMSgpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZEFzc2lnbm1lbnRfMF8yKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xKCksICJydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF81KCksICJydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlQXNzaWdubWVudF82XzEoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoQXNzaWdubWVudF8yXzFfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXNlc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEFzc2lnbm1lbnRfNV8yKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF8zXzBfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCb2R5QXNzaWdubWVudF81KCksICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzJfMF8wXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSaWdodEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80KCksICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCksICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEFycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF80KCksICJydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV80XzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSgpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpLCAicnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljQXNzaWdubWVudF8xXzBfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEV4dGVuc2lvbkFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMF8yKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8wXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgInJ1bGVfX0NoYXJ0QmFyX19Vbm9yZGVyZWRHcm91cF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgInJ1bGVfX0NoYXJ0TGluZV9fVW5vcmRlcmVkR3JvdXBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgInJ1bGVfX0NoYXJ0QnViYmxlX19Vbm9yZGVyZWRHcm91cF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksICJydWxlX19DaGFydEdhdWdlX19Vbm9yZGVyZWRHcm91cF8yIik7CisJCQkJfQorCQkJfTsKKwkJfQorCQlyZXR1cm4gbmFtZU1hcHBpbmdzLmdldChlbGVtZW50KTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4gZ2V0Rm9sbG93RWxlbWVudHMoQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXIgcGFyc2VyKSB7CisJCXRyeSB7CisJCQlvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTFBhcnNlciB0eXBlZFBhcnNlciA9IChvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTFBhcnNlcikgcGFyc2VyOworCQkJdHlwZWRQYXJzZXIuZW50cnlSdWxlQ2hhcnRNb2RlbCgpOworCQkJcmV0dXJuIHR5cGVkUGFyc2VyLmdldEZvbGxvd0VsZW1lbnRzKCk7CisJCX0gY2F0Y2goUmVjb2duaXRpb25FeGNlcHRpb24gZXgpIHsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKwkJfQkJCisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRJbml0aWFsSGlkZGVuVG9rZW5zKCkgeworCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHsgIlJVTEVfV1MiLCAiUlVMRV9NTF9DT01NRU5UIiwgIlJVTEVfU0xfQ09NTUVOVCIgfTsKKwl9CisJCisJcHVibGljIENoYXJ0RFNMR3JhbW1hckFjY2VzcyBnZXRHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gdGhpcy5ncmFtbWFyQWNjZXNzOworCX0KKwkKKwlwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQWNjZXNzKENoYXJ0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisJCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsQ2hhcnREU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL1BhcnRpYWxDaGFydERTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjIwNzNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsQ2hhcnREU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5BYnN0cmFjdFJ1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuY29kZXRlbXBsYXRlcy51aS5wYXJ0aWFsRWRpdGluZy5JUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuRm9sbG93RWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51dGlsLlBvbHltb3JwaGljRGlzcGF0Y2hlcjsKKworLyoqCisgKiBAYXV0aG9yIFNlYmFzdGlhbiBaYXJuZWtvdyAtIEluaXRpYWwgY29udHJpYnV0aW9uIGFuZCBBUEkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBQYXJ0aWFsQ2hhcnREU0xDb250ZW50QXNzaXN0UGFyc2VyIGV4dGVuZHMgQ2hhcnREU0xQYXJzZXIgaW1wbGVtZW50cyBJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIgeworCisJcHJpdmF0ZSBBYnN0cmFjdFJ1bGUgcnVsZTsKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3IoQWJzdHJhY3RSdWxlIHJ1bGUpIHsKKwkJdGhpcy5ydWxlID0gcnVsZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4gZ2V0Rm9sbG93RWxlbWVudHMoQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXIgcGFyc2VyKSB7CisJCWlmIChydWxlID09IG51bGwgfHwgcnVsZS5lSXNQcm94eSgpKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJlbnRyeVJ1bGUiICsgcnVsZS5nZXROYW1lKCk7CisJCVBvbHltb3JwaGljRGlzcGF0Y2hlcjxDb2xsZWN0aW9uPEZvbGxvd0VsZW1lbnQ+PiBkaXNwYXRjaGVyID0gCisJCQluZXcgUG9seW1vcnBoaWNEaXNwYXRjaGVyPENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4+KG1ldGhvZE5hbWUsIDAsIDAsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGFyc2VyKSk7CisJCWRpc3BhdGNoZXIuaW52b2tlKCk7CisJCXJldHVybiBwYXJzZXIuZ2V0Rm9sbG93RWxlbWVudHMoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzYThiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nCkBAIC0wLDAgKzEsMTAwMTQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK2dyYW1tYXIgSW50ZXJuYWxDaGFydERTTDsKKworb3B0aW9ucyB7CisJc3VwZXJDbGFzcz1BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKKwliYWNrdHJhY2s9dHJ1ZTsKKwkKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7CisKKy8vIEhhY2s6IFVzZSBvdXIgb3duIExleGVyIHN1cGVyY2xhc3MgYnkgbWVhbnMgb2YgaW1wb3J0LiAKKy8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gc3BlY2lmeSB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlIGxleGVyLgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkxleGVyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5ERkE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJ2aWNlcy5DaGFydERTTEdyYW1tYXJBY2Nlc3M7CisKK30KKworQHBhcnNlcjo6bWVtYmVycyB7CisgCisgCXByaXZhdGUgQ2hhcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgCQorICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJBY2Nlc3MoQ2hhcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAJdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKyAgICAJcmV0dXJuIGdyYW1tYXJBY2Nlc3MuZ2V0R3JhbW1hcigpOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRm9yVG9rZW5OYW1lKFN0cmluZyB0b2tlbk5hbWUpIHsKKyAgICAJcmV0dXJuIHRva2VuTmFtZTsKKyAgICB9CisKK30KKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydE1vZGVsCitlbnRyeVJ1bGVDaGFydE1vZGVsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE1vZGVsUnVsZSgpKTsgfQorCSBydWxlQ2hhcnRNb2RlbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRNb2RlbAorcnVsZUNoYXJ0TW9kZWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQXNzaWdubWVudCgpKTsgfQorKHJ1bGVfX0NoYXJ0TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQXNzaWdubWVudCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0UGFja2FnZQorZW50cnlSdWxlQ2hhcnRQYWNrYWdlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOyB9CisJIHJ1bGVDaGFydFBhY2thZ2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRQYWNrYWdlCitydWxlQ2hhcnRQYWNrYWdlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0CitlbnRyeVJ1bGVDaGFydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSdWxlKCkpOyB9CisJIHJ1bGVDaGFydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0CitydWxlQ2hhcnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRPcHRpb24KK2VudHJ5UnVsZUNoYXJ0T3B0aW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvblJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0T3B0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRPcHRpb24KK3J1bGVDaGFydE9wdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydEJhcgorZW50cnlSdWxlQ2hhcnRCYXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyUnVsZSgpKTsgfQorCSBydWxlQ2hhcnRCYXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydEJhcgorcnVsZUNoYXJ0QmFyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DaGFydEJhcl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0TGluZQorZW50cnlSdWxlQ2hhcnRMaW5lIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOyB9CisJIHJ1bGVDaGFydExpbmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRMaW5lCitydWxlQ2hhcnRMaW5lCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0UGllCitlbnRyeVJ1bGVDaGFydFBpZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVSdWxlKCkpOyB9CisJIHJ1bGVDaGFydFBpZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0UGllCitydWxlQ2hhcnRQaWUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0UGllX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnREb251dAorZW50cnlSdWxlQ2hhcnREb251dCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dFJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0RG9udXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0RG9udXQKK3J1bGVDaGFydERvbnV0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RG9udXRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RG9udXRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0QnViYmxlCitlbnRyeVJ1bGVDaGFydEJ1YmJsZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOyB9CisJIHJ1bGVDaGFydEJ1YmJsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0QnViYmxlCitydWxlQ2hhcnRCdWJibGUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRHYXVnZQorZW50cnlSdWxlQ2hhcnRHYXVnZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZVJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0R2F1Z2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0R2F1Z2UKK3J1bGVDaGFydEdhdWdlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0VHJlZQorZW50cnlSdWxlQ2hhcnRUcmVlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVSdWxlKCkpOyB9CisJIHJ1bGVDaGFydFRyZWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRUcmVlCitydWxlQ2hhcnRUcmVlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwKK2VudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW50ZXJ2YWxSdWxlKCkpOyB9CisJIHJ1bGVDaGFydEludGVydmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbnRlcnZhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydEludGVydmFsCitydWxlQ2hhcnRJbnRlcnZhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsKCkpOyB9CisJcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnROdW1iZXJJbnRlcnZhbAorZW50cnlSdWxlQ2hhcnROdW1iZXJJbnRlcnZhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0TnVtYmVySW50ZXJ2YWwKK3J1bGVDaGFydE51bWJlckludGVydmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0RGF0YW1hcnQKK2VudHJ5UnVsZUNoYXJ0RGF0YW1hcnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRSdWxlKCkpOyB9CisJIHJ1bGVDaGFydERhdGFtYXJ0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydERhdGFtYXJ0CitydWxlQ2hhcnREYXRhbWFydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydEVsZW1lbnQKK2VudHJ5UnVsZUNoYXJ0RWxlbWVudCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKTsgfQorCSBydWxlQ2hhcnRFbGVtZW50Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0RWxlbWVudAorcnVsZUNoYXJ0RWxlbWVudAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19DaGFydEVsZW1lbnRfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydExlZ2VuZAorZW50cnlSdWxlQ2hhcnRMZWdlbmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kUnVsZSgpKTsgfQorCSBydWxlQ2hhcnRMZWdlbmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydExlZ2VuZAorcnVsZUNoYXJ0TGVnZW5kCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0SGlnaGxpZ2h0ZXIKK2VudHJ5UnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJSdWxlKCkpOyB9CisJIHJ1bGVDaGFydEhpZ2hsaWdodGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydEhpZ2hsaWdodGVyCitydWxlQ2hhcnRIaWdobGlnaHRlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydEF4aXMKK2VudHJ5UnVsZUNoYXJ0QXhpcyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsgfQorCSBydWxlQ2hhcnRBeGlzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0QXhpcworcnVsZUNoYXJ0QXhpcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudAorZW50cnlSdWxlQ2hhcnRSYW5nZUVsZW1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50UnVsZSgpKTsgfQorCSBydWxlQ2hhcnRSYW5nZUVsZW1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJhbmdlRWxlbWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydFJhbmdlRWxlbWVudAorcnVsZUNoYXJ0UmFuZ2VFbGVtZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRTZWdtZW50Q29sb3JQYXJzZXJSdWxlQ2FsbCgpKTsgfQorCXJ1bGVDaGFydFNlZ21lbnRDb2xvcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRTZWdtZW50Q29sb3JQYXJzZXJSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0U2VnbWVudENvbG9yCitlbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JSdWxlKCkpOyB9CisJIHJ1bGVDaGFydFNlZ21lbnRDb2xvcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0U2VnbWVudENvbG9yCitydWxlQ2hhcnRTZWdtZW50Q29sb3IKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRJbXBvcnQKK2VudHJ5UnVsZUNoYXJ0SW1wb3J0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydFJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0SW1wb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRJbXBvcnQKK3J1bGVDaGFydEltcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQ2hhcnRJbXBvcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVTaWduZWROdW1iZXIKK2VudHJ5UnVsZVNpZ25lZE51bWJlciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyUnVsZSgpKTsgfQorCSBydWxlU2lnbmVkTnVtYmVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFNpZ25lZE51bWJlcgorcnVsZVNpZ25lZE51bWJlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCitlbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0KKwkgcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3J1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HCitlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR1J1bGUoKSk7IH0KKwkgcnVsZVRSQU5TTEFUQUJMRVNUUklORworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBUUkFOU0xBVEFCTEVTVFJJTkcKK3J1bGVUUkFOU0xBVEFCTEVTVFJJTkcKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorCVJVTEVfU1RSSU5HCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVRSQU5TTEFUQUJMRUlECitlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURSdWxlKCkpOyB9CisJIHJ1bGVUUkFOU0xBVEFCTEVJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFRSQU5TTEFUQUJMRUlECitydWxlVFJBTlNMQVRBQkxFSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKwlSVUxFX0lECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbgorZW50cnlSdWxlWEFubm90YXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbgorcnVsZVhBbm5vdGF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgfQorCSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCitydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEV4cHJlc3Npb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEV4cHJlc3Npb24KK3J1bGVYRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKwlydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQXNzaWdubWVudAorZW50cnlSdWxlWEFzc2lnbm1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsgfQorCSBydWxlWEFzc2lnbm1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQXNzaWdubWVudAorcnVsZVhBc3NpZ25tZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduCitlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcFNpbmdsZUFzc2lnbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wU2luZ2xlQXNzaWduCitydWxlT3BTaW5nbGVBc3NpZ24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorCisJJz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGlBc3NpZ24KK2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpQXNzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpQXNzaWduCitydWxlT3BNdWx0aUFzc2lnbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE9yRXhwcmVzc2lvbgorcnVsZVhPckV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BPcgorZW50cnlSdWxlT3BPciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IH0KKwkgcnVsZU9wT3IKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3IKK3J1bGVPcE9yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyB9CisKKwknfHwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbgorZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEFuZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5kRXhwcmVzc2lvbgorcnVsZVhBbmRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQW5kCitlbnRyeVJ1bGVPcEFuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRSdWxlKCkpOyB9CisJIHJ1bGVPcEFuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQW5kCitydWxlT3BBbmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CisKKwknJiYnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFcXVhbGl0eUV4cHJlc3Npb24KK3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wRXF1YWxpdHkKK2VudHJ5UnVsZU9wRXF1YWxpdHkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyB9CisJIHJ1bGVPcEVxdWFsaXR5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcEVxdWFsaXR5CitydWxlT3BFcXVhbGl0eQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhSZWxhdGlvbmFsRXhwcmVzc2lvbgorcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcENvbXBhcmUKK2VudHJ5UnVsZU9wQ29tcGFyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfQorCSBydWxlT3BDb21wYXJlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQ29tcGFyZQorcnVsZU9wQ29tcGFyZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KK2VudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE90aGVyCitlbnRyeVJ1bGVPcE90aGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgfQorCSBydWxlT3BPdGhlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BPdGhlcgorcnVsZU9wT3RoZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBZGRpdGl2ZUV4cHJlc3Npb24KK3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQWRkCitlbnRyeVJ1bGVPcEFkZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9CisJIHJ1bGVPcEFkZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wQWRkCitydWxlT3BBZGQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KK3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wTXVsdGkKK2VudHJ5UnVsZU9wTXVsdGkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyB9CisJIHJ1bGVPcE11bHRpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE11bHRpCitydWxlT3BNdWx0aQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24KK2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFVuYXJ5T3BlcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhVbmFyeU9wZXJhdGlvbgorcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFVuYXJ5CitlbnRyeVJ1bGVPcFVuYXJ5IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgfQorCSBydWxlT3BVbmFyeQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BVbmFyeQorcnVsZU9wVW5hcnkKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhDYXN0ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc3RlZEV4cHJlc3Npb24KK3J1bGVYQ2FzdGVkRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbgorZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFBvc3RmaXhPcGVyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUG9zdGZpeE9wZXJhdGlvbgorcnVsZVhQb3N0Zml4T3BlcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wUG9zdGZpeAorZW50cnlSdWxlT3BQb3N0Zml4IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9CisJIHJ1bGVPcFBvc3RmaXgKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BQb3N0Zml4CitydWxlT3BQb3N0Zml4CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAorZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9CisJIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE1lbWJlckZlYXR1cmVDYWxsCitydWxlWE1lbWJlckZlYXR1cmVDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbgorZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFByaW1hcnlFeHByZXNzaW9uCitydWxlWFByaW1hcnlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhMaXRlcmFsCitlbnRyeVJ1bGVYTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXRlcmFsCitydWxlWExpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsCitlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ29sbGVjdGlvbkxpdGVyYWwKK3J1bGVYQ29sbGVjdGlvbkxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNldExpdGVyYWwKK2VudHJ5UnVsZVhTZXRMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTZXRMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNldExpdGVyYWwKK3J1bGVYU2V0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTGlzdExpdGVyYWwKK2VudHJ5UnVsZVhMaXN0TGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWExpc3RMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXN0TGl0ZXJhbAorcnVsZVhMaXN0TGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2xvc3VyZQorZW50cnlSdWxlWENsb3N1cmUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgfQorCSBydWxlWENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2xvc3VyZQorcnVsZVhDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCitlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyB9CisJIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uSW5DbG9zdXJlCitydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNob3J0Q2xvc3VyZQorZW50cnlSdWxlWFNob3J0Q2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IH0KKwkgcnVsZVhTaG9ydENsb3N1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTaG9ydENsb3N1cmUKK3J1bGVYU2hvcnRDbG9zdXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgorZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhJZkV4cHJlc3Npb24KK2VudHJ5UnVsZVhJZkV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYSWZFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYSWZFeHByZXNzaW9uCitydWxlWElmRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbgorZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFN3aXRjaEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3dpdGNoRXhwcmVzc2lvbgorcnVsZVhTd2l0Y2hFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDYXNlUGFydAorZW50cnlSdWxlWENhc2VQYXJ0IAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9CisJIHJ1bGVYQ2FzZVBhcnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhc2VQYXJ0CitydWxlWENhc2VQYXJ0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbgorZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZvckxvb3BFeHByZXNzaW9uCitydWxlWEZvckxvb3BFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCitydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhXaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhXaGlsZUV4cHJlc3Npb24KK3J1bGVYV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWERvV2hpbGVFeHByZXNzaW9uCitydWxlWERvV2hpbGVFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24KK2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQmxvY2tFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQmxvY2tFeHByZXNzaW9uCitydWxlWEJsb2NrRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgorZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVmFyaWFibGVEZWNsYXJhdGlvbgorcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKK2VudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyB9CisJIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwKK2VudHJ5UnVsZVhGZWF0dXJlQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBydWxlWEZlYXR1cmVDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGZWF0dXJlQ2FsbAorcnVsZVhGZWF0dXJlQ2FsbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGZWF0dXJlQ2FsbElECitlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgfQorCSBydWxlRmVhdHVyZUNhbGxJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRmVhdHVyZUNhbGxJRAorcnVsZUZlYXR1cmVDYWxsSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSWRPclN1cGVyCitlbnRyeVJ1bGVJZE9yU3VwZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0KKwkgcnVsZUlkT3JTdXBlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBJZE9yU3VwZXIKK3J1bGVJZE9yU3VwZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbAorZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7IH0KKwkgcnVsZVhDb25zdHJ1Y3RvckNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDb25zdHJ1Y3RvckNhbGwKK3J1bGVYQ29uc3RydWN0b3JDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbAorZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYQm9vbGVhbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJvb2xlYW5MaXRlcmFsCitydWxlWEJvb2xlYW5MaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdWxsTGl0ZXJhbAorZW50cnlSdWxlWE51bGxMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVsbExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bGxMaXRlcmFsCitydWxlWE51bGxMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsCitlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTnVtYmVyTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhOdW1iZXJMaXRlcmFsCitydWxlWE51bWJlckxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwKK2VudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhTdHJpbmdMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFN0cmluZ0xpdGVyYWwKK3J1bGVYU3RyaW5nTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwKK2VudHJ5UnVsZVhUeXBlTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWFR5cGVMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhUeXBlTGl0ZXJhbAorcnVsZVhUeXBlTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uCitlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRocm93RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFRocm93RXhwcmVzc2lvbgorcnVsZVhUaHJvd0V4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24KK2VudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhSZXR1cm5FeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFJldHVybkV4cHJlc3Npb24KK3J1bGVYUmV0dXJuRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCitydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhdGNoQ2xhdXNlCitlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0KKwkgcnVsZVhDYXRjaENsYXVzZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2F0Y2hDbGF1c2UKK3J1bGVYQ2F0Y2hDbGF1c2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZQorZW50cnlSdWxlUXVhbGlmaWVkTmFtZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IH0KKwkgcnVsZVF1YWxpZmllZE5hbWUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWUKK3J1bGVRdWFsaWZpZWROYW1lCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU51bWJlcgorZW50cnlSdWxlTnVtYmVyIAorQGluaXQgeworCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworfQorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyB9CisJIHJ1bGVOdW1iZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyB9IAorCSBFT0YgCis7CitmaW5hbGx5IHsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisvLyBSdWxlIE51bWJlcgorcnVsZU51bWJlcgorICAgIEBpbml0IHsKKwkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKwlteUhpZGRlblRva2VuU3RhdGUucmVzdG9yZSgpOworfQorCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bVR5cGVSZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVR5cGVSZWZlcmVuY2UKK3J1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUFycmF5QnJhY2tldHMKK2VudHJ5UnVsZUFycmF5QnJhY2tldHMgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyB9CisJIHJ1bGVBcnJheUJyYWNrZXRzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBcnJheUJyYWNrZXRzCitydWxlQXJyYXlCcmFja2V0cworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmCitlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgfQorCSBydWxlWEZ1bmN0aW9uVHlwZVJlZgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZ1bmN0aW9uVHlwZVJlZgorcnVsZVhGdW5jdGlvblR5cGVSZWYKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsgfQorCSBydWxlSnZtVXBwZXJCb3VuZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVXBwZXJCb3VuZAorcnVsZUp2bVVwcGVyQm91bmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bVVwcGVyQm91bmRBbmRlZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1VcHBlckJvdW5kQW5kZWQKK3J1bGVKdm1VcHBlckJvdW5kQW5kZWQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtTG93ZXJCb3VuZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bUxvd2VyQm91bmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUxvd2VyQm91bmQKK3J1bGVKdm1Mb3dlckJvdW5kCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyB9CisJIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtTG93ZXJCb3VuZEFuZGVkCitydWxlSnZtTG93ZXJCb3VuZEFuZGVkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgfQorCSBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVmFsaWRJRAorZW50cnlSdWxlVmFsaWRJRCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJRFJ1bGUoKSk7IH0KKwkgcnVsZVZhbGlkSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFZhbGlkSUQKK3J1bGVWYWxpZElECisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IH0KKwlSVUxFX0lECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24KK2VudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEltcG9ydERlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJbXBvcnREZWNsYXJhdGlvbgorcnVsZVhJbXBvcnREZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfQorCSBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKy8vIFJ1bGUgTGVnZW5kUGxhY2VtZW50RW51bQorcnVsZUxlZ2VuZFBsYWNlbWVudEVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fTGVnZW5kUGxhY2VtZW50RW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBUb2dnbGVUeXBlRW51bQorcnVsZVRvZ2dsZVR5cGVFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9nZ2xlVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRvZ2dsZVR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgVG9vbHRpcExvY2F0aW9uRW51bQorcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fVG9vbHRpcExvY2F0aW9uRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gUnVsZSBSZW5kZXJUeXBlRW51bQorcnVsZVJlbmRlclR5cGVFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19SZW5kZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKK3J1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QmFyUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVDaGFydEJhcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRCYXJQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0TGluZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlQ2hhcnRMaW5lCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydExpbmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0UGllUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVDaGFydFBpZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRQaWVQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0RG9udXRQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CisJcnVsZUNoYXJ0RG9udXQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0RG9udXRQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QnViYmxlUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorCXJ1bGVDaGFydEJ1YmJsZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRCdWJibGVQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CisJcnVsZUNoYXJ0R2F1Z2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0VHJlZVBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKwlydWxlQ2hhcnRUcmVlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydFRyZWVQYXJzZXJSdWxlQ2FsbF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRCdWJibGVfX0FsdGVybmF0aXZlc18yXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEdyYWRpZW50QXNzaWdubWVudF8yXzFfMCgpKTsgfQorKHJ1bGVfX0NoYXJ0QnViYmxlX19HcmFkaWVudEFzc2lnbm1lbnRfMl8xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcmFkaWVudEFzc2lnbm1lbnRfMl8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xKCkpOyB9CisocnVsZV9fQ2hhcnRCdWJibGVfX1RyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFRyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0VHJlZV9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRNYXBBc3NpZ25tZW50XzJfMCgpKTsgfQorKHJ1bGVfX0NoYXJ0VHJlZV9fTWFwQXNzaWdubWVudF8yXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0TWFwQXNzaWdubWVudF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldENvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEoKSk7IH0KKyhydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0Q29sbGFwc2libGVBc3NpZ25tZW50XzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRBeGlzUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVDaGFydEF4aXMKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydEF4aXNQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydExlZ2VuZFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlQ2hhcnRMZWdlbmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydExlZ2VuZFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0SGlnaGxpZ2h0ZXJQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydEhpZ2hsaWdodGVyUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8zXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWEFubm90YXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKworCScrPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNFcXVhbHNTaWduS2V5d29yZF8xKCkpOyB9CisKKwknLT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgfQorCisJJyo9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBc3Rlcmlza0VxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgfQorCisJJy89JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBlcmNlbnRTaWduRXF1YWxzU2lnbktleXdvcmRfNCgpKTsgfQorCisJJyU9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKyhydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknPT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorCisJJyE9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CisKKwknPT09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgfQorCisJJyE9PScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CisocnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKyhydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IH0KKworCSc+PScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fT3BDb21wYXJlX19Hcm91cF8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMigpKTsgfQorCisJJz4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzMoKSk7IH0KKworCSc8JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0dyZWF0ZXJUaGFuU2lnbktleXdvcmRfMCgpKTsgfQorCisJJy0+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0dyZWF0ZXJUaGFuU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BMZXNzVGhhblNpZ25LZXl3b3JkXzEoKSk7IH0KKworCScuLjwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BMZXNzVGhhblNpZ25LZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfMl9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7IH0KKworCScuLicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzQoKSk7IH0KKworCSc9PicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF81X18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IH0KKworCSc8PicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IH0KKworCSc/OicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNV8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wKCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMSgpKTsgfQorCisJJz4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfNl8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzZfMV8wKCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfNl8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzZfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMSgpKTsgfQorCisJJzwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF82XzFfMigpKTsgfQorCisJJz0+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF82XzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknKycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CisKKwknLScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8wKCkpOyB9CisKKwknKicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0FzdGVyaXNrS2V5d29yZF8xKCkpOyB9CisKKwknKionIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrQXN0ZXJpc2tLZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRTb2xpZHVzS2V5d29yZF8yKCkpOyB9CisKKwknLycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0U29saWR1c0tleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFBlcmNlbnRTaWduS2V5d29yZF8zKCkpOyB9CisKKwknJScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhDYXN0ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgfQorCisJJyEnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CisKKwknLScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMigpKTsgfQorCisJJysnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRQbHVzU2lnblBsdXNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknKysnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0UGx1c1NpZ25QbHVzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorCisJJy0tJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEh5cGhlbk1pbnVzSHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18xXzBfMF8wXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wXzBfMF8xXzAoKSk7IH0KKworCScuJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzBfMF8wXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8wXzBfMF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzBfMF8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8wKCkpOyB9CisKKwknLicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzNfMV8xKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM18xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzNfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ29uc3RydWN0b3JDYWxsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYQ29uc3RydWN0b3JDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENvbnN0cnVjdG9yQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCbG9ja0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhCbG9ja0V4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN3aXRjaEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVhTd2l0Y2hFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN3aXRjaEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKygJcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZlYXR1cmVDYWxsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorCXJ1bGVYRmVhdHVyZUNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKwlydWxlWExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhJZkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82KCkpOyB9CisJcnVsZVhJZkV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZvckxvb3BFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNygpKTsgfQorKAlydWxlWEZvckxvb3BFeHByZXNzaW9uKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzcoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOCgpKTsgfQorCXJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFdoaWxlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzkoKSk7IH0KKwlydWxlWFdoaWxlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRG9XaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMCgpKTsgfQorCXJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRG9XaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRocm93RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzExKCkpOyB9CisJcnVsZVhUaHJvd0V4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVGhyb3dFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZXR1cm5FeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTIoKSk7IH0KKwlydWxlWFJldHVybkV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEyKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEzKCkpOyB9CisJcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTQoKSk7IH0KKwlydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ29sbGVjdGlvbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKygJcnVsZVhDbG9zdXJlKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhCb29sZWFuTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzIoKSk7IH0KKwlydWxlWEJvb2xlYW5MaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQm9vbGVhbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdW1iZXJMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorCXJ1bGVYTnVtYmVyTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bWJlckxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdWxsTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKwlydWxlWE51bGxMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorCXJ1bGVYU3RyaW5nTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFN0cmluZ0xpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhUeXBlTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKwlydWxlWFR5cGVMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYVHlwZUxpdGVyYWxQYXJzZXJSdWxlQ2FsbF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYU2V0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWFNldExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYU2V0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWExpc3RMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CisocnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKyhydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWENhc2VQYXJ0X19BbHRlcm5hdGl2ZXNfMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorKHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSgpKTsgfQorKHJ1bGVfX1hDYXNlUGFydF9fRmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fV3JpdGVhYmxlQXNzaWdubWVudF8xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVBc3NpZ25tZW50XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRWYWxLZXl3b3JkXzFfMSgpKTsgfQorCisJJ3ZhbCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFZhbEtleXdvcmRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzJfMSgpKTsgfQorKHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKSk7IH0KKyhydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzNfMV8xKCkpOyB9CisocnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVWYWxpZElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMSgpKTsgfQorCisJJ2V4dGVuZHMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuZHNLZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRTdGF0aWNLZXl3b3JkXzIoKSk7IH0KKworCSdzdGF0aWMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFN0YXRpY0tleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMygpKTsgfQorCisJJ2ltcG9ydCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uS2V5d29yZF80KCkpOyB9CisKKwknZXh0ZW5zaW9uJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbnNpb25LZXl3b3JkXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEZlYXR1cmVDYWxsSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZUZlYXR1cmVDYWxsSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0U3VwZXJLZXl3b3JkXzEoKSk7IH0KKworCSdzdXBlcicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRTdXBlcktleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF80XzFfMCgpKTsgfQorKHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80XzFfMSgpKTsgfQorKHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRHcm91cF80XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRGYWxzZUtleXdvcmRfMV8wKCkpOyB9CisKKwknZmFsc2UnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0RmFsc2VLZXl3b3JkXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0SXNUcnVlQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMSgpKTsgfQorKHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEhFWFRlcm1pbmFsUnVsZUNhbGxfMCgpKTsgfQorCVJVTEVfSEVYCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SEVYVGVybWluYWxSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fTnVtYmVyX19Hcm91cF8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlc18xXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMF8wKCkpOyB9CisJUlVMRV9JTlQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgfQorCVJVTEVfREVDSU1BTAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzAoKSk7IH0KKwlSVUxFX0lOVAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMSgpKTsgfQorCVJVTEVfREVDSU1BTAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRYRnVuY3Rpb25UeXBlUmVmUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYRnVuY3Rpb25UeXBlUmVmCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFhGdW5jdGlvblR5cGVSZWZQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVKdm1UeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKyhydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMl8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19JbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMigpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMV8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMV8wXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzc2lnbm1lbnRfMV8wXzNfMCgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVBc3NpZ25tZW50XzFfMF8zXzEoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX01lbWJlck5hbWVBc3NpZ25tZW50XzFfMF8zXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRJTlNJREVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ2luc2lkZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldElOU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldElOU0lERV9HUklERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdpbnNpZGUtZ3JpZCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldElOU0lERV9HUklERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0T1VUU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknb3V0c2lkZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldE9VVFNJREVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRPVVRTSURFX0dSSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ291dHNpZGUtZ3JpZCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldE9VVFNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1RvZ2dsZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknbm9ybWFsJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9nZ2xlVHlwZUVudW1BY2Nlc3MoKS5nZXRTTE9XRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdzbG93JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldFNMT1dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRvZ2dsZVR5cGVFbnVtQWNjZXNzKCkuZ2V0RkFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknZmFzdCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VG9nZ2xlVHlwZUVudW1BY2Nlc3MoKS5nZXRGQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fVG9vbHRpcExvY2F0aW9uRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CisoCSdub3J0aCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0Tk9SVEhfRUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgfQorKAknbm9ydGgtZWFzdCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRFQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdlYXN0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0RUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldFNPVVRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ3NvdXRoLWVhc3QnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRTT1VUSF9FQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKygJJ3NvdXRoJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRTT1VUSF9XRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl81KCkpOyB9CisoCSdzb3V0aC13ZXN0JyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldFdFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzYoKSk7IH0KKygJJ3dlc3QnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRXRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0Tk9SVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNygpKTsgfQorKAknbm9ydGgtd2VzdCcgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX1dFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19SZW5kZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRDQVRFR09SWUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknY2F0ZWdvcnknIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0Q0FURUdPUllFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0TElORUFSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdsaW5lYXInIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0TElORUFSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldERBVEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IH0KKygJJ2RhdGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0REFURUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRMT0dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ2xvZ2FyaXRobWljJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldExPR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRQWVJBTUlERW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisoCSdweXJhbWlkJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldFBZUkFNSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldENoYXJ0UGFja2FnZUFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRDaGFydFBhY2thZ2VBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IH0KKworCSdwYWNrYWdlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fQ2hhcnRQYWNrYWdlX19OYW1lQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldE5hbWVBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKyhydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfM19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzFfX0ltcGwKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0SW1wb3J0c0Fzc2lnbm1lbnRfM18xKCkpOyB9CisocnVsZV9fQ2hhcnRQYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF8zXzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNBc3NpZ25tZW50XzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzJfX0ltcGwKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Q2hhcnRzQXNzaWdubWVudF8zXzIoKSk7IH0KKyhydWxlX19DaGFydFBhY2thZ2VfX0NoYXJ0c0Fzc2lnbm1lbnRfM18yKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRDaGFydHNBc3NpZ25tZW50XzNfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwXzNfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF8zX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpKTsgfQorCisJJ30nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0X19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0X19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0Q2hhcnRBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydEFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldENoYXJ0S2V5d29yZF8xKCkpOyB9CisKKwknY2hhcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydEtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydF9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19DaGFydF9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fQ2hhcnRfX05hbWVBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fNAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKyhydWxlX19DaGFydF9fR3JvdXBfM19fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fNF9fSW1wbAorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fNQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEFzS2V5d29yZF80KCkpOyB9CisKKwknYXMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRBc0tleXdvcmRfNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydF9fR3JvdXBfXzVfX0ltcGwKKwlydWxlX19DaGFydF9fR3JvdXBfXzYKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRfX0dyb3VwX181X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydHR5cGVBc3NpZ25tZW50XzUoKSk7IH0KKyhydWxlX19DaGFydF9fQ2hhcnR0eXBlQXNzaWdubWVudF81KQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0Q2hhcnR0eXBlQXNzaWdubWVudF81KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfXzYKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fNl9fSW1wbAorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fNworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfXzZfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKyhydWxlX19DaGFydF9fR3JvdXBfNl9fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfXzcKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF9fN19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfXzdfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEdyb3VwXzcoKSk7IH0KKyhydWxlX19DaGFydF9fR3JvdXBfN19fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRHcm91cF83KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0X19Hcm91cF8zX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydF9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0X19Hcm91cF8zX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0X19Hcm91cF8zX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkpOyB9CisocnVsZV9fQ2hhcnRfX0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydF9fR3JvdXBfM19fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRfX0dyb3VwXzNfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRfX0dyb3VwXzNfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0X19EZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXREZXNjcmlwdGlvblZhbHVlQXNzaWdubWVudF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fQ2hhcnRfX0dyb3VwXzZfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF82X18wX19JbXBsCisJcnVsZV9fQ2hhcnRfX0dyb3VwXzZfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRfX0dyb3VwXzZfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldFBvbGxpbmdBc3NpZ25tZW50XzZfMCgpKTsgfQorKHJ1bGVfX0NoYXJ0X19Qb2xsaW5nQXNzaWdubWVudF82XzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRQb2xsaW5nQXNzaWdubWVudF82XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0X19Hcm91cF82X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydF9fR3JvdXBfNl9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfNl9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0UG9sbGluZ1RpbWVBc3NpZ25tZW50XzZfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0X19Qb2xsaW5nVGltZUFzc2lnbm1lbnRfNl8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0UG9sbGluZ1RpbWVBc3NpZ25tZW50XzZfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19DaGFydF9fR3JvdXBfN19fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRfX0dyb3VwXzdfXzBfX0ltcGwKKwlydWxlX19DaGFydF9fR3JvdXBfN19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydF9fR3JvdXBfN19fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0VXNpbmdLZXl3b3JkXzdfMCgpKTsgfQorCisJJ3VzaW5nJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0VXNpbmdLZXl3b3JkXzdfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRfX0dyb3VwXzdfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0X19Hcm91cF83X18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0X19Hcm91cF83X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRTb3VyY2VBc3NpZ25tZW50XzdfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0X19Tb3VyY2VBc3NpZ25tZW50XzdfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldFNvdXJjZUFzc2lnbm1lbnRfN18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0Q2hhcnRCYXJBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRDaGFydEJhckFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEJhcl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEJhcl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldEJhcktleXdvcmRfMSgpKTsgfQorCisJJ2JhcicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldEJhcktleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEJhcl9fR3JvdXBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOyB9CisocnVsZV9fQ2hhcnRCYXJfX1Vub3JkZXJlZEdyb3VwXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19DaGFydExpbmVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydExpbmVfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydExpbmVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q2hhcnRMaW5lQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldENoYXJ0TGluZUFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydExpbmVfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydExpbmVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydExpbmVfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0TGluZUtleXdvcmRfMSgpKTsgfQorCisJJ2xpbmUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0TGluZUtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydExpbmVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsgfQorKHJ1bGVfX0NoYXJ0TGluZV9fVW5vcmRlcmVkR3JvdXBfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19DaGFydExpbmVfX0dyb3VwXzJfM19fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzBfX0ltcGwKKwlydWxlX19DaGFydExpbmVfX0dyb3VwXzJfM19fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydExpbmVfX0dyb3VwXzJfM19fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEN1cnNvckFzc2lnbm1lbnRfMl8zXzAoKSk7IH0KKyhydWxlX19DaGFydExpbmVfX0N1cnNvckFzc2lnbm1lbnRfMl8zXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q3Vyc29yQXNzaWdubWVudF8yXzNfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfMl8zX18xX19JbXBsCisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRab29tQXNzaWdubWVudF8yXzNfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0TGluZV9fWm9vbUFzc2lnbm1lbnRfMl8zXzEpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFpvb21Bc3NpZ25tZW50XzJfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydExpbmVfX0dyb3VwXzJfM19fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF8yXzNfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRUb29sdGlwQXNzaWdubWVudF8yXzNfMigpKTsgfQorKHJ1bGVfX0NoYXJ0TGluZV9fVG9vbHRpcEFzc2lnbm1lbnRfMl8zXzIpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFRvb2x0aXBBc3NpZ25tZW50XzJfM18yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19DaGFydFBpZV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0UGllX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0UGllX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFBpZV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldENoYXJ0UGllQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0Q2hhcnRQaWVBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFBpZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19DaGFydFBpZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVBY2Nlc3MoKS5nZXRQaWVLZXl3b3JkXzEoKSk7IH0KKworCSdwaWUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVBY2Nlc3MoKS5nZXRQaWVLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0UGllX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0UGllX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0RW1wdHlBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19DaGFydFBpZV9fRW1wdHlBc3NpZ25tZW50XzIpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0RW1wdHlBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydERvbnV0X19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldENoYXJ0RG9udXRBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldENoYXJ0RG9udXRBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldERvbnV0S2V5d29yZF8xKCkpOyB9CisKKwknZG9udXQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldERvbnV0S2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0Q2hhcnRCdWJibGVBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRDaGFydEJ1YmJsZUFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEJ1YmJsZUtleXdvcmRfMSgpKTsgfQorCisJJ2J1YmJsZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEJ1YmJsZUtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOyB9CisocnVsZV9fQ2hhcnRCdWJibGVfX1Vub3JkZXJlZEdyb3VwXzIpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwXzJfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwXzJfMF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF8yXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwXzJfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0TXVsdGlwbGllckFzc2lnbm1lbnRfMl8wXzAoKSk7IH0KKyhydWxlX19DaGFydEJ1YmJsZV9fTXVsdGlwbGllckFzc2lnbm1lbnRfMl8wXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyQXNzaWdubWVudF8yXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwXzJfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwXzJfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfMl8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyVmFsdWVBc3NpZ25tZW50XzJfMF8xKCkpOyB9CisocnVsZV9fQ2hhcnRCdWJibGVfX011bHRpcGxpZXJWYWx1ZUFzc2lnbm1lbnRfMl8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyVmFsdWVBc3NpZ25tZW50XzJfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldENoYXJ0R2F1Z2VBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldENoYXJ0R2F1Z2VBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0R2F1Z2VLZXl3b3JkXzEoKSk7IH0KKworCSdnYXVnZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0R2F1Z2VLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOyB9CisocnVsZV9fQ2hhcnRHYXVnZV9fVW5vcmRlcmVkR3JvdXBfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzBfXzBfX0ltcGwKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldExhYmVsZWRBc3NpZ25tZW50XzJfMF8wKCkpOyB9CisocnVsZV9fQ2hhcnRHYXVnZV9fTGFiZWxlZEFzc2lnbm1lbnRfMl8wXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldExhYmVsZWRBc3NpZ25tZW50XzJfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEoKSk7IH0KKyhydWxlX19DaGFydEdhdWdlX19MYWJlbFZhbHVlQXNzaWdubWVudF8yXzBfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzBfX0ltcGwKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEhhc1RpY2tzQXNzaWdubWVudF8yXzFfMCgpKTsgfQorKHJ1bGVfX0NoYXJ0R2F1Z2VfX0hhc1RpY2tzQXNzaWdubWVudF8yXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SGFzVGlja3NBc3NpZ25tZW50XzJfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMV9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMV9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWluaW11bUtleXdvcmRfMl8xXzEoKSk7IH0KKworCSdtaW5pbXVtJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNaW5pbXVtS2V5d29yZF8yXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzJfX0ltcGwKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldE1pblZhbHVlQXNzaWdubWVudF8yXzFfMigpKTsgfQorKHJ1bGVfX0NoYXJ0R2F1Z2VfX01pblZhbHVlQXNzaWdubWVudF8yXzFfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWluVmFsdWVBc3NpZ25tZW50XzJfMV8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMV9fM19fSW1wbAorCXJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMV9fNAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWF4aW11bUtleXdvcmRfMl8xXzMoKSk7IH0KKworCSdtYXhpbXVtJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNYXhpbXVtS2V5d29yZF8yXzFfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX180CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzFfXzRfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8xX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldE1heFZhbHVlQXNzaWdubWVudF8yXzFfNCgpKTsgfQorKHJ1bGVfX0NoYXJ0R2F1Z2VfX01heFZhbHVlQXNzaWdubWVudF8yXzFfNCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWF4VmFsdWVBc3NpZ25tZW50XzJfMV80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18wX19JbXBsCisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRIYXNJbnRlcnZhbHNBc3NpZ25tZW50XzJfMl8wKCkpOyB9CisocnVsZV9fQ2hhcnRHYXVnZV9fSGFzSW50ZXJ2YWxzQXNzaWdubWVudF8yXzJfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SGFzSW50ZXJ2YWxzQXNzaWdubWVudF8yXzJfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzJfXzFfX0ltcGwKKwlydWxlX19DaGFydEdhdWdlX19Hcm91cF8yXzJfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8xKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMl8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18yX19JbXBsCisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRJbnRlcnZhbHNBc3NpZ25tZW50XzJfMl8yKCkpOyB9CisocnVsZV9fQ2hhcnRHYXVnZV9fSW50ZXJ2YWxzQXNzaWdubWVudF8yXzJfMikqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfMl8yX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwXzJfMl9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMl8yXzMoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfMl8yXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19DaGFydFRyZWVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFRyZWVfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFRyZWVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0Q2hhcnRUcmVlQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldENoYXJ0VHJlZUFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydFRyZWVfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFRyZWVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFRyZWVfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0VHJlZUtleXdvcmRfMSgpKTsgfQorCisJJ3RyZWUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0VHJlZUtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFRyZWVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSk7IH0KKyhydWxlX19DaGFydFRyZWVfX0FsdGVybmF0aXZlc18yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldEFsdGVybmF0aXZlc18yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRDaGFydE51bWJlckludGVydmFsQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRDaGFydE51bWJlckludGVydmFsQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldFVwVG9LZXl3b3JkXzEoKSk7IH0KKworCSd1cCB0bycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0VXBUb0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX051bWJlckludGVydmFsVmFsdWVBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlckludGVydmFsVmFsdWVBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJSYW5nZUFzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX051bWJlclJhbmdlQXNzaWdubWVudF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJSYW5nZUFzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0S2V5d29yZF8wKCkpOyB9CisKKwknZGF0YW1hcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0S2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXREYXRhbWFydFJlZkFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0RhdGFtYXJ0UmVmQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXREYXRhbWFydFJlZkFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsgfQorCisJJ3snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fQ2hhcnREYXRhbWFydF9fRWxlbWVudHNBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CisKKwknfScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRMZWdlbmRLZXl3b3JkXzAoKSk7IH0KKworCSdsZWdlbmQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRMZWdlbmRLZXl3b3JkXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0UGxhY2VtZW50QXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fQ2hhcnRMZWdlbmRfX1BsYWNlbWVudEFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFBsYWNlbWVudEFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyB9CisocnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF8yX18wX19JbXBsCisJcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFRvZ2dsZUFzc2lnbm1lbnRfMl8wKCkpOyB9CisocnVsZV9fQ2hhcnRMZWdlbmRfX1RvZ2dsZUFzc2lnbm1lbnRfMl8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0VG9nZ2xlQXNzaWdubWVudF8yXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF8yX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfMl9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF8yX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF8yX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRSZXBsb3RBc3NpZ25tZW50XzJfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0TGVnZW5kX19SZXBsb3RBc3NpZ25tZW50XzJfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFJlcGxvdEFzc2lnbm1lbnRfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfMl9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwXzJfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFRvZ2dsZVR5cGVBc3NpZ25tZW50XzJfMigpKTsgfQorKHJ1bGVfX0NoYXJ0TGVnZW5kX19Ub2dnbGVUeXBlQXNzaWdubWVudF8yXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRUb2dnbGVUeXBlQXNzaWdubWVudF8yXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldFRvb2x0aXBLZXl3b3JkXzAoKSk7IH0KKworCSd0b29sdGlwJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRUb29sdGlwS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRMb2NhdGlvbkFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0xvY2F0aW9uQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRMb2NhdGlvbkFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IH0KKyhydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF8yX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRHcm91cF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF8yX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF8yX18wX19JbXBsCisJcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfMl9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF8yX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldFRvb2x0aXBBbHdheXNBc3NpZ25tZW50XzJfMCgpKTsgfQorKHJ1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX1Rvb2x0aXBBbHdheXNBc3NpZ25tZW50XzJfMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldFRvb2x0aXBBbHdheXNBc3NpZ25tZW50XzJfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfMl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfMl9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF8yX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldEluc2lkZUNoYXJ0QXNzaWdubWVudF8yXzEoKSk7IH0KKyhydWxlX19DaGFydEhpZ2hsaWdodGVyX19JbnNpZGVDaGFydEFzc2lnbm1lbnRfMl8xKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0SW5zaWRlQ2hhcnRBc3NpZ25tZW50XzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19DaGFydEF4aXNfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEF4aXNfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEF4aXNfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QXhpc0tleXdvcmRfMCgpKTsgfQorCisJJ2F4aXMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QXhpc0tleXdvcmRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldEF4aXNBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19DaGFydEF4aXNfX0F4aXNBc3NpZ25tZW50XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QXhpc0Fzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMl9fSW1wbAorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFJlbmRlcnNLZXl3b3JkXzIoKSk7IH0KKworCSdyZW5kZXJzJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFJlbmRlcnNLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzNfX0ltcGwKKwlydWxlX19DaGFydEF4aXNfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRSZW5kZXJUeXBlQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fQ2hhcnRBeGlzX19SZW5kZXJUeXBlQXNzaWdubWVudF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFJlbmRlclR5cGVBc3NpZ25tZW50XzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzRfX0ltcGwKKwlydWxlX19DaGFydEF4aXNfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRTaG9ydExhYmVsQXNzaWdubWVudF80KCkpOyB9CisocnVsZV9fQ2hhcnRBeGlzX19TaG9ydExhYmVsQXNzaWdubWVudF80KT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRTaG9ydExhYmVsQXNzaWdubWVudF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydEF4aXNfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEF4aXNfX0dyb3VwX181X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzVfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CisocnVsZV9fQ2hhcnRBeGlzX19Hcm91cF81X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworCisKKworCitydWxlX19DaGFydEF4aXNfX0dyb3VwXzVfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfNV9fMF9fSW1wbAorCXJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfNV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydEF4aXNfX0dyb3VwXzVfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRUaWNrYW5nbGVLZXl3b3JkXzVfMCgpKTsgfQorCisJJ3RpY2thbmdsZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRUaWNrYW5nbGVLZXl3b3JkXzVfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF81X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEF4aXNfX0dyb3VwXzVfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF81X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0QW5nbGVBc3NpZ25tZW50XzVfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0QXhpc19fQW5nbGVBc3NpZ25tZW50XzVfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBbmdsZUFzc2lnbm1lbnRfNV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRTZWdtZW50Q29sb3JfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRTZWdtZW50Q29sb3JfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0U2VnbWVudGNvbG9yS2V5d29yZF8wKCkpOyB9CisKKwknc2VnbWVudGNvbG9yJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0U2VnbWVudGNvbG9yS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvckFjY2VzcygpLmdldFJnYkFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19SZ2JBc3NpZ25tZW50XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKS5nZXRSZ2JBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fQ2hhcnRJbXBvcnRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydEltcG9ydF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19DaGFydEltcG9ydF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQ2hhcnRJbXBvcnRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7IH0KKworCSdpbXBvcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRJbXBvcnRfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19DaGFydEltcG9ydF9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzAoKSk7IH0KKygKKwknLScgCispPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzEoKSk7IH0KKwlSVUxFX0lOVAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlUXVhbGlmaWVkTmFtZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSk7IH0KKworCScuJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8xXzEoKSk7IH0KKworCScqJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOyB9CisKKwknQCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Bbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fM19fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wKCkpOyB9CisoCisJJygnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSk7IH0KKworCScpJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMF8xXzAoKSk7IH0KKworCScsJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19WYWx1ZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRBc3NpZ25tZW50XzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19FbGVtZW50QXNzaWdubWVudF8wXzBfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50QXNzaWdubWVudF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMF8wXzEoKSk7IH0KKworCSc9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IH0KKworCSddJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgfQorCisJJyMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorCisJJ1snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IH0KKworCScsJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IH0KKwlydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgfQorKQorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCkpOyB9CispCispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyB9CisKKwknXScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKworCScjJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorCisJJ1snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhBc3NpZ25tZW50QWN0aW9uXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFjdGlvbl8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IH0KKwlydWxlT3BTaW5nbGVBc3NpZ24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8wXzMoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8wXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgfQorCXJ1bGVYT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbAorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMCgpKTsgfQorCisJJzwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsCisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyB9CisKKwknPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IH0KKworCSc9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF81XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbAorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMSgpKTsgfQorKAorCSc+JyAKKyk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNl8yKCkpOyB9CisKKwknPj0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhBbmRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWEVxdWFsaXR5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CisocnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IH0KKykKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLnRva2VucyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC50b2tlbnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI3NzFlZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC50b2tlbnMKQEAgLTAsMCArMSwyODkgQEAKKychJz00MAorJyE9Jz0yMgorJyE9PSc9MjQKKycjJz05OQorJyUnPTM5CisnJT0nPTIwCisnJiYnPTE1CisnJic9MTIyCisnKCc9OTUKKycpJz05NgorJyonPTM2CisnKionPTM3CisnKj0nPTE4CisnKyc9MzQKKycrKyc9NDEKKycrPSc9MTYKKycsJz05NworJy0nPTM1CisnLS0nPTQyCisnLT0nPTE3CisnLT4nPTI4CisnLic9NDMKKycuLic9MzAKKycuLjwnPTI5CisnLyc9MzgKKycvPSc9MTkKKyc6Jz0xMDYKKyc6Oic9MTQ4CisnOyc9MTAyCisnPCc9MjcKKyc8Pic9MzIKKyc9Jz0xMworJz09Jz0yMQorJz09PSc9MjMKKyc9Pic9MzEKKyc+Jz0yNgorJz49Jz0yNQorJz8nPTEyMQorJz8uJz0xNDkKKyc/Oic9MzMKKydAJz05NAorJ1snPTEwMAorJ10nPTk4CisnYWx3YXlzJz0xNDYKKydhbmltYXRlZCc9MTI2CisnYXMnPTc1CisnYXhpcyc9OTAKKydiYXInPTc3CisnYnViYmxlJz04MQorJ2Nhc2UnPTEwOAorJ2NhdGNoJz0xMjAKKydjYXRlZ29yeSc9NjYKKydjaGFydCc9NzQKKydjb2xsYXBzaWJsZSc9MTQzCisnY3Vyc29yJz0xMzEKKydkYXRhbWFydCc9ODcKKydkYXRlJz02OAorJ2RlZmF1bHQnPTEwNworJ2Rlc2NyaWJlZCBieSc9MTIzCisnZG8nPTExMQorJ2RvbnV0Jz04MAorJ2Vhc3QnPTYwCisnZWxzZSc9MTA0CisnZW1wdHknPTEzNQorJ2V4dGVuZHMnPTQ1CisnZXh0ZW5zaW9uJz00OAorJ2ZhbHNlJz01MAorJ2Zhc3QnPTU3CisnZmlsbFplcm8nPTEzMworJ2ZpbGxlZCc9MTM0CisnZmluYWxseSc9MTE4CisnZm9yJz0xMDkKKydnYXVnZSc9ODIKKydncmFkaWVudCc9MTM3CisnaGFzVGlja3MnPTE0MAorJ2lmJz0xMDMKKydpbXBvcnQnPTQ3CisnaW5zaWRlJz01MQorJ2luc2lkZS1ncmlkJz01MgorJ2luc3RhbmNlb2YnPTEwMQorJ2ludGVydmFscyc9MTQxCisnbGFiZWwnPTEzOQorJ2xlZ2VuZCc9ODgKKydsaW5lJz03OAorJ2xpbmVhcic9NjcKKydsb2dhcml0aG1pYyc9NjkKKydtYXAnPTE0MgorJ21heGltdW0nPTg0CisnbWluaW11bSc9ODMKKydtdWx0aXBsaWVyJz0xMzYKKyduZXcnPTExMgorJ25vcm1hbCc9NTUKKydub3J0aCc9NTgKKydub3J0aC1lYXN0Jz01OQorJ25vcnRoLXdlc3QnPTY1CisnbnVsbCc9MTEzCisnb3V0c2lkZSc9NTMKKydvdXRzaWRlLWdyaWQnPTU0CisncGFja2FnZSc9NzEKKydwaWUnPTc5CisncG9sbGluZyc9MTI0CisncHlyYW1pZCc9NzAKKydyZW5kZXJzJz05MQorJ3JlcGxvdCc9MTQ1CisncmV0dXJuJz0xMTYKKydzZWdtZW50Y29sb3InPTkzCisnc2hhZGVkJz0xMjUKKydzaG9ydExhYmVsJz0xNDcKKydzaG93TWFya2VyJz0xMjkKKydzbG93Jz01NgorJ3NvdXRoJz02MgorJ3NvdXRoLWVhc3QnPTYxCisnc291dGgtd2VzdCc9NjMKKydzdGFja2VkJz0xMjgKKydzdGF0aWMnPTQ2Cisnc3VwZXInPTQ5Cisnc3dhcHBlZCc9MTI3Cisnc3dpdGNoJz0xMDUKKydzeW5jaHJvbml6ZWQnPTExOQorJ3Rocm93Jz0xMTUKKyd0aWNrYW5nbGUnPTkyCisndG9nZ2xlJz0xNDQKKyd0b29sdGlwJz04OQorJ3RyYW5zcGFyZW50Jz0xMzgKKyd0cmVlJz04NQorJ3RyZW5kTGluZSc9MTMwCisndHJ1ZSc9MTUyCisndHJ5Jz0xMTcKKyd0eXBlb2YnPTExNAorJ3VwIHRvJz04NgorJ3VzaW5nJz03NgorJ3ZhbCc9NDQKKyd2YXInPTE1MQorJ3dlc3QnPTY0Cisnd2hpbGUnPTExMAorJ3pvb20nPTEzMgorJ3snPTcyCisnfCc9MTUwCisnfHwnPTE0CisnfSc9NzMKK1JVTEVfQU5ZX09USEVSPTEyCitSVUxFX0RFQ0lNQUw9OAorUlVMRV9IRVg9NgorUlVMRV9JRD01CitSVUxFX0lOVD03CitSVUxFX01MX0NPTU1FTlQ9OQorUlVMRV9TTF9DT01NRU5UPTEwCitSVUxFX1NUUklORz00CitSVUxFX1dTPTExCitUX18xMDA9MTAwCitUX18xMDE9MTAxCitUX18xMDI9MTAyCitUX18xMDM9MTAzCitUX18xMDQ9MTA0CitUX18xMDU9MTA1CitUX18xMDY9MTA2CitUX18xMDc9MTA3CitUX18xMDg9MTA4CitUX18xMDk9MTA5CitUX18xMTA9MTEwCitUX18xMTE9MTExCitUX18xMTI9MTEyCitUX18xMTM9MTEzCitUX18xMTQ9MTE0CitUX18xMTU9MTE1CitUX18xMTY9MTE2CitUX18xMTc9MTE3CitUX18xMTg9MTE4CitUX18xMTk9MTE5CitUX18xMjA9MTIwCitUX18xMjE9MTIxCitUX18xMjI9MTIyCitUX18xMjM9MTIzCitUX18xMjQ9MTI0CitUX18xMjU9MTI1CitUX18xMjY9MTI2CitUX18xMjc9MTI3CitUX18xMjg9MTI4CitUX18xMjk9MTI5CitUX18xMzA9MTMwCitUX18xMzE9MTMxCitUX18xMzI9MTMyCitUX18xMzM9MTMzCitUX18xMzQ9MTM0CitUX18xMzU9MTM1CitUX18xMzY9MTM2CitUX18xMzc9MTM3CitUX18xMzg9MTM4CitUX18xMzk9MTM5CitUX18xMz0xMworVF9fMTQwPTE0MAorVF9fMTQxPTE0MQorVF9fMTQyPTE0MgorVF9fMTQzPTE0MworVF9fMTQ0PTE0NAorVF9fMTQ1PTE0NQorVF9fMTQ2PTE0NgorVF9fMTQ3PTE0NworVF9fMTQ4PTE0OAorVF9fMTQ5PTE0OQorVF9fMTQ9MTQKK1RfXzE1MD0xNTAKK1RfXzE1MT0xNTEKK1RfXzE1Mj0xNTIKK1RfXzE1PTE1CitUX18xNj0xNgorVF9fMTc9MTcKK1RfXzE4PTE4CitUX18xOT0xOQorVF9fMjA9MjAKK1RfXzIxPTIxCitUX18yMj0yMgorVF9fMjM9MjMKK1RfXzI0PTI0CitUX18yNT0yNQorVF9fMjY9MjYKK1RfXzI3PTI3CitUX18yOD0yOAorVF9fMjk9MjkKK1RfXzMwPTMwCitUX18zMT0zMQorVF9fMzI9MzIKK1RfXzMzPTMzCitUX18zND0zNAorVF9fMzU9MzUKK1RfXzM2PTM2CitUX18zNz0zNworVF9fMzg9MzgKK1RfXzM5PTM5CitUX180MD00MAorVF9fNDE9NDEKK1RfXzQyPTQyCitUX180Mz00MworVF9fNDQ9NDQKK1RfXzQ1PTQ1CitUX180Nj00NgorVF9fNDc9NDcKK1RfXzQ4PTQ4CitUX180OT00OQorVF9fNTA9NTAKK1RfXzUxPTUxCitUX181Mj01MgorVF9fNTM9NTMKK1RfXzU0PTU0CitUX181NT01NQorVF9fNTY9NTYKK1RfXzU3PTU3CitUX181OD01OAorVF9fNTk9NTkKK1RfXzYwPTYwCitUX182MT02MQorVF9fNjI9NjIKK1RfXzYzPTYzCitUX182ND02NAorVF9fNjU9NjUKK1RfXzY2PTY2CitUX182Nz02NworVF9fNjg9NjgKK1RfXzY5PTY5CitUX183MD03MAorVF9fNzE9NzEKK1RfXzcyPTcyCitUX183Mz03MworVF9fNzQ9NzQKK1RfXzc1PTc1CitUX183Nj03NgorVF9fNzc9NzcKK1RfXzc4PTc4CitUX183OT03OQorVF9fODA9ODAKK1RfXzgxPTgxCitUX184Mj04MgorVF9fODM9ODMKK1RfXzg0PTg0CitUX184NT04NQorVF9fODY9ODYKK1RfXzg3PTg3CitUX184OD04OAorVF9fODk9ODkKK1RfXzkwPTkwCitUX185MT05MQorVF9fOTI9OTIKK1RfXzkzPTkzCitUX185ND05NAorVF9fOTU9OTUKK1RfXzk2PTk2CitUX185Nz05NworVF9fOTg9OTgKK1RfXzk5PTk5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0xMZXhlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMTGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGY4MjFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMTGV4ZXIuamF2YQpAQCAtMCwwICsxLDYwMzAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxDaGFydERTTExleGVyIGV4dGVuZHMgTGV4ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0ND0xNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQzPTE0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDY9MTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ1PTE0NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDA9MTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Mj0xNDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQxPTE0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzc9MTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUyPTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNj0xMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM5PTEzOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzg9MTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMz0xMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMyPTEzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzU9MTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYxPTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzND0xMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMT0xMzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMwPTEzMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lOVD03OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY2PTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY3PTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOT0xMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI2PTEyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjU9MTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY0PTY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOD0xMjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI3PTEyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTE9MTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MD0xNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUyPTE1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDg9MTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQxPTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nz0xNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ5PTE0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjI9MTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcwPTcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMT0xMjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI0PTEyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjM9MTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMD0xMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE5PTExOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTg9MTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc5PTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzczPTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNT0xMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExND0xMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzU9NzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE3PTExNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTY9MTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTM9MTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMj0xMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDg9MTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg5PTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA5PTEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDQ9MTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg1PTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMz0xMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODY9ODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDU9MTA1OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisgICAgcHVibGljIEludGVybmFsQ2hhcnREU0xMZXhlcigpIHs7fSAKKyAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTExleGVyKENoYXJTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIEludGVybmFsQ2hhcnREU0xMZXhlcihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsc3RhdGUpOworCisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTo3OiAoICc9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTo5OiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI6NzogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOjk6ICd8fCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ8fCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM6NzogKCAnJiYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOjk6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCImJiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ6NzogKCAnKz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Ojk6ICcrPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU6NzogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1Ojk6ICctPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY6NzogKCAnKj0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2Ojk6ICcqPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc6NzogKCAnLz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3Ojk6ICcvPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg6NzogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4Ojk6ICclPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIlPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk6NzogKCAnPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5Ojk6ICc9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA6NzogKCAnIT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOjk6ICchPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE6NzogKCAnPT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTo5OiAnPT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj09PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI6NzogKCAnIT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjo5OiAnIT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM6NzogKCAnPj0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOjk6ICc+PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI+PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ6NzogKCAnPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ6OTogJz4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Ojc6ICggJzwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Ojk6ICc8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzwnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjo3OiAoICctPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY6OTogJy0+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzo3OiAoICcuLjwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3Ojk6ICcuLjwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLi48Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODo3OiAoICcuLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg6OTogJy4uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTo3OiAoICc9PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk6OTogJz0+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj0+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDo3OiAoICc8PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA6OTogJzw+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjw+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTo3OiAoICc/OicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE6OTogJz86JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj86Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjo3OiAoICcrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjo5OiAnKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcrJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM6NzogKCAnLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM6OTogJy0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0Ojc6ICggJyonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0Ojk6ICcqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNTo3OiAoICcqKicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU6OTogJyoqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIioqIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNjo3OiAoICcvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNjo5OiAnLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcvJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzc6NzogKCAnJScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzc6OTogJyUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM4Ojc6ICggJyEnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM4Ojk6ICchJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyEnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozOTo3OiAoICcrKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzk6OTogJysrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIisrIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MDo3OiAoICctLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDA6OTogJy0tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTo3OiAoICcuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTo5OiAnLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDI6NzogKCAndmFsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Mjo5OiAndmFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDM6NzogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDM6OTogJ2V4dGVuZHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXh0ZW5kcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDQ6NzogKCAnc3RhdGljJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NDo5OiAnc3RhdGljJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YXRpYyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDU6NzogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTo5OiAnaW1wb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImltcG9ydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDY6NzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Njo5OiAnZXh0ZW5zaW9uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVuc2lvbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDc6NzogKCAnc3VwZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ3Ojk6ICdzdXBlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdXBlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDg6NzogKCAnZmFsc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4Ojk6ICdmYWxzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmYWxzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDk6NzogKCAnaW5zaWRlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0OTo5OiAnaW5zaWRlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImluc2lkZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTA6NzogKCAnaW5zaWRlLWdyaWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUwOjk6ICdpbnNpZGUtZ3JpZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnNpZGUtZ3JpZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTE6NzogKCAnb3V0c2lkZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTE6OTogJ291dHNpZGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgib3V0c2lkZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTI6NzogKCAnb3V0c2lkZS1ncmlkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mjo5OiAnb3V0c2lkZS1ncmlkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm91dHNpZGUtZ3JpZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTM6NzogKCAnbm9ybWFsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzo5OiAnbm9ybWFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5vcm1hbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQ6NzogKCAnc2xvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQ6OTogJ3Nsb3cnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2xvdyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTU6NzogKCAnZmFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTU6OTogJ2Zhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmFzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTY6NzogKCAnbm9ydGgnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2Ojk6ICdub3J0aCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub3J0aCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTc6NzogKCAnbm9ydGgtZWFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTc6OTogJ25vcnRoLWVhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibm9ydGgtZWFzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTg6NzogKCAnZWFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTg6OTogJ2Vhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZWFzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTk6NzogKCAnc291dGgtZWFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTk6OTogJ3NvdXRoLWVhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic291dGgtZWFzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjA6NzogKCAnc291dGgnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwOjk6ICdzb3V0aCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzb3V0aCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjE6NzogKCAnc291dGgtd2VzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjE6OTogJ3NvdXRoLXdlc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic291dGgtd2VzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI6NzogKCAnd2VzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI6OTogJ3dlc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgid2VzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM6NzogKCAnbm9ydGgtd2VzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM6OTogJ25vcnRoLXdlc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibm9ydGgtd2VzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjQ6NzogKCAnY2F0ZWdvcnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0Ojk6ICdjYXRlZ29yeScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXRlZ29yeSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjU6NzogKCAnbGluZWFyJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NTo5OiAnbGluZWFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxpbmVhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY6NzogKCAnZGF0ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY6OTogJ2RhdGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGF0ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njc6NzogKCAnbG9nYXJpdGhtaWMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY3Ojk6ICdsb2dhcml0aG1pYycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsb2dhcml0aG1pYyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njg6NzogKCAncHlyYW1pZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njg6OTogJ3B5cmFtaWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHlyYW1pZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njk6NzogKCAncGFja2FnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njk6OTogJ3BhY2thZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFja2FnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzA6NzogKCAneycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzA6OTogJ3snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgneycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzczIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcxOjc6ICggJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcxOjk6ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ30nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzczIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mjo3OiAoICdjaGFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzI6OTogJ2NoYXJ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNoYXJ0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mzo3OiAoICdhcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzM6OTogJ2FzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NDo3OiAoICd1c2luZycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzQ6OTogJ3VzaW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzaW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NTo3OiAoICdiYXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc1Ojk6ICdiYXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYmFyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Njo3OiAoICdsaW5lJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Njo5OiAnbGluZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsaW5lIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Nzo3OiAoICdwaWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3Ojk6ICdwaWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGllIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3ODo3OiAoICdkb251dCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzg6OTogJ2RvbnV0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRvbnV0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3OTo3OiAoICdidWJibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc5Ojk6ICdidWJibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYnViYmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDo3OiAoICdnYXVnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA6OTogJ2dhdWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdhdWdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MTo3OiAoICdtaW5pbXVtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MTo5OiAnbWluaW11bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtaW5pbXVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mjo3OiAoICdtYXhpbXVtJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mjo5OiAnbWF4aW11bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtYXhpbXVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mzo3OiAoICd0cmVlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mzo5OiAndHJlZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cmVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NDo3OiAoICd1cCB0bycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODQ6OTogJ3VwIHRvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVwIHRvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTo3OiAoICdkYXRhbWFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU6OTogJ2RhdGFtYXJ0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRhdGFtYXJ0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Njo3OiAoICdsZWdlbmQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2Ojk6ICdsZWdlbmQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibGVnZW5kIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Nzo3OiAoICd0b29sdGlwJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Nzo5OiAndG9vbHRpcCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0b29sdGlwIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4ODo3OiAoICdheGlzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4ODo5OiAnYXhpcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJheGlzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OTo3OiAoICdyZW5kZXJzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OTo5OiAncmVuZGVycycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZW5kZXJzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MDo3OiAoICd0aWNrYW5nbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwOjk6ICd0aWNrYW5nbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGlja2FuZ2xlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MTo3OiAoICdzZWdtZW50Y29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkxOjk6ICdzZWdtZW50Y29sb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2VnbWVudGNvbG9yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5Mjo3OiAoICdAJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5Mjo5OiAnQCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTM6NzogKCAnKCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTM6OTogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk0Ojc6ICggJyknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk0Ojk6ICcpJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyknKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTo3OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTo5OiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTY6NzogKCAnXScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTY6OTogJ10nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnXScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk3Ojc6ICggJyMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk3Ojk6ICcjJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5ODo4OiAoICdbJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5ODoxMDogJ1snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnWycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5OTo4OiAoICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5OToxMDogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMDo4OiAoICc7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDA6MTA6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAxOjg6ICggJ2lmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDE6MTA6ICdpZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMjo4OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDI6MTA6ICdlbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDM6ODogKCAnc3dpdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDM6MTA6ICdzd2l0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA0Ojg6ICggJzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNDoxMDogJzonCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnOicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDU6ODogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1OjEwOiAnZGVmYXVsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA2Ojg6ICggJ2Nhc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNjoxMDogJ2Nhc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNzo4OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNzoxMDogJ2ZvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDg6ODogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODoxMDogJ3doaWxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTExIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTExOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA5Ojg6ICggJ2RvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDk6MTA6ICdkbycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDo4OiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDoxMDogJ25ldycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJuZXciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTE6ODogKCAnbnVsbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTExOjEwOiAnbnVsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEyOjg6ICggJ3R5cGVvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEyOjEwOiAndHlwZW9mJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInR5cGVvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzo4OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzOjEwOiAndGhyb3cnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidGhyb3ciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTQ6ODogKCAncmV0dXJuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTQ6MTA6ICdyZXR1cm4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE1Ojg6ICggJ3RyeScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE1OjEwOiAndHJ5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyeSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNjo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTY6MTA6ICdmaW5hbGx5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZpbmFsbHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc6ODogKCAnc3luY2hyb25pemVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc6MTA6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTIwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE4Ojg6ICggJ2NhdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTg6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXRjaCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExOTo4OiAoICc/JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTk6MTA6ICc/JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz8nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwOjg6ICggJyYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDoxMDogJyYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTIyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjE6ODogKCAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjE6MTA6ICdkZXNjcmliZWQgYnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGVzY3JpYmVkIGJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyOjg6ICggJ3BvbGxpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMjoxMDogJ3BvbGxpbmcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicG9sbGluZyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMzo4OiAoICdzaGFkZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMzoxMDogJ3NoYWRlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaGFkZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjQ6ODogKCAnYW5pbWF0ZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNDoxMDogJ2FuaW1hdGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFuaW1hdGVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI1Ojg6ICggJ3N3YXBwZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNToxMDogJ3N3YXBwZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dhcHBlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNjo4OiAoICdzdGFja2VkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjY6MTA6ICdzdGFja2VkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YWNrZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjc6ODogKCAnc2hvd01hcmtlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI3OjEwOiAnc2hvd01hcmtlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaG93TWFya2VyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI4Ojg6ICggJ3RyZW5kTGluZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI4OjEwOiAndHJlbmRMaW5lJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyZW5kTGluZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOTo4OiAoICdjdXJzb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOToxMDogJ2N1cnNvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjdXJzb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzA6ODogKCAnem9vbScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMwOjEwOiAnem9vbScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ6b29tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxOjg6ICggJ2ZpbGxaZXJvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzE6MTA6ICdmaWxsWmVybycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmaWxsWmVybyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMjo4OiAoICdmaWxsZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMjoxMDogJ2ZpbGxlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmaWxsZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzM6ODogKCAnZW1wdHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMzoxMDogJ2VtcHR5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVtcHR5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM0Ojg6ICggJ211bHRpcGxpZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNDoxMDogJ211bHRpcGxpZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibXVsdGlwbGllciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNTo4OiAoICdncmFkaWVudCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM1OjEwOiAnZ3JhZGllbnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZ3JhZGllbnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzY6ODogKCAndHJhbnNwYXJlbnQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNjoxMDogJ3RyYW5zcGFyZW50JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRyYW5zcGFyZW50Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM3Ojg6ICggJ2xhYmVsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzc6MTA6ICdsYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsYWJlbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzODo4OiAoICdoYXNUaWNrcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM4OjEwOiAnaGFzVGlja3MnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaGFzVGlja3MiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzk6ODogKCAnaW50ZXJ2YWxzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzk6MTA6ICdpbnRlcnZhbHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW50ZXJ2YWxzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQwOjg6ICggJ21hcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQwOjEwOiAnbWFwJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1hcCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MTo4OiAoICdjb2xsYXBzaWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQxOjEwOiAnY29sbGFwc2libGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY29sbGFwc2libGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDI6ODogKCAndG9nZ2xlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDI6MTA6ICd0b2dnbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9nZ2xlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQzOjg6ICggJ3JlcGxvdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQzOjEwOiAncmVwbG90JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJlcGxvdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDo4OiAoICdhbHdheXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDoxMDogJ2Fsd2F5cycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbHdheXMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDU6ODogKCAnc2hvcnRMYWJlbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ1OjEwOiAnc2hvcnRMYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaG9ydExhYmVsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ2Ojg6ICggJzo6JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY6MTA6ICc6OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Nzo4OiAoICc/LicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ3OjEwOiAnPy4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPy4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDg6ODogKCAnfCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4OjEwOiAnfCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd8Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0OTo4OiAoICd2YXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0OToxMDogJ3ZhcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YXIiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTA6ODogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUwOjEwOiAndHJ1ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9IRVgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSEVYKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSEVYOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NjU6MTA6ICggKCAnMHgnIHwgJzBYJyApICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY1OjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY1OjEyOiAoICcweCcgfCAnMFgnICkKKyAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExXzA9PScwJykgKSB7CisgICAgICAgICAgICAgICAgaW50IExBMV8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMT09J3gnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMV8xPT0nWCcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMSwgMSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY1OjEzOiAnMHgnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjB4Iik7IAorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2NToxODogJzBYJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIwWCIpOyAKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NjU6MjQ6ICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrCisgICAgICAgICAgICBpbnQgY250Mj0wOworICAgICAgICAgICAgbG9vcDI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTJfMD49JzAnICYmIExBMl8wPD0nOScpfHwoTEEyXzA+PSdBJyAmJiBMQTJfMDw9J0YnKXx8TEEyXzA9PSdfJ3x8KExBMl8wPj0nYScgJiYgTEEyXzA8PSdmJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J0YnKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSdmJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDIgPj0gMSApIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2NTo1ODogKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ0PTI7CisgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE0XzA9PScjJykgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NjU6NTk6ICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCcjJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2NTo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PSdCJ3x8TEEzXzA9PSdiJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTNfMD09J0wnfHxMQTNfMD09J2wnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2NTo2NDogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nSSd8fGlucHV0LkxBKDEpPT0naScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY1Ojg0OiAoICdsJyB8ICdMJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9IRVgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0lOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY3OjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY3OjEyOiAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hSYW5nZSgnMCcsJzknKTsgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2NzoyMTogKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICBsb29wNToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBNV8wPj0nMCcgJiYgTEE1XzA8PSc5Jyl8fExBNV8wPT0nXycpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ1PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHxpbnB1dC5MQSgxKT09J18nICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9JTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfREVDSU1BTCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9ERUNJTUFMKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfREVDSU1BTDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY5OjE0OiAoIFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Njk6MTY6IFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY5OjI1OiAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8KKyAgICAgICAgICAgIGludCBhbHQ3PTI7CisgICAgICAgICAgICBpbnQgTEE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE3XzA9PSdFJ3x8TEE3XzA9PSdlJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Njk6MjY6ICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRSd8fGlucHV0LkxBKDEpPT0nZScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY5OjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTZfMD09JysnfHxMQTZfMD09Jy0nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PScrJ3x8aW5wdXQuTEEoMSk9PSctJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Njk6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgaW50IGFsdDg9MzsKKyAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQThfMD09J0InfHxMQThfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBOF8wPT0nRCd8fExBOF8wPT0nRid8fExBOF8wPT0nTCd8fExBOF8wPT0nZCd8fExBOF8wPT0nZid8fExBOF8wPT0nbCcpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY5OjU5OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdJJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdpJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzY5Ojg3OiAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0QnfHxpbnB1dC5MQSgxKT09J0YnfHxpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2QnfHxpbnB1dC5MQSgxKT09J2YnfHxpbnB1dC5MQSgxKT09J2wnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0RFQ0lNQUwiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSUQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JRDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzcxOjk6ICggKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzcxOjExOiAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzcxOjExOiAoICdeJyApPworICAgICAgICAgICAgaW50IGFsdDk9MjsKKyAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTlfMD09J14nKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3MToxMTogJ14nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ14nKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nWicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J3onKSApIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzcxOjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgbG9vcDEwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMD0yOworICAgICAgICAgICAgICAgIGludCBMQTEwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMTBfMD09JyQnfHwoTEExMF8wPj0nMCcgJiYgTEExMF8wPD0nOScpfHwoTEExMF8wPj0nQScgJiYgTEExMF8wPD0nWicpfHxMQTEwXzA9PSdfJ3x8KExBMTBfMD49J2EnICYmIExBMTBfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBpbnB1dC5MQSgxKT09JyQnfHwoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU1RSSU5HIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NUUklORzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzczOjEzOiAoICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NzM6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzczOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICBpbnQgYWx0MTU9MjsKKyAgICAgICAgICAgIGludCBMQTE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0nXCInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE1XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3MzoxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3MzoyMDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMToKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDExPTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTFfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTFfMD49J1x1MDAwMCcgJiYgTEExMV8wPD0nIScpfHwoTEExMV8wPj0nIycgJiYgTEExMV8wPD0nWycpfHwoTEExMV8wPj0nXScgJiYgTEExMV8wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMSkgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3MzoyMTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3MzoyODogfiAoICggJ1xcXFwnIHwgJ1wiJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nIScpfHwoaW5wdXQuTEEoMSk+PScjJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3Mzo0NDogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMl8wPT0nXCInKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3Mzo0NDogJ1wiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3Mzo0OTogJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3Mzo1NDogKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTM6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMz0zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEzXzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTEzXzA+PSdcdTAwMDAnICYmIExBMTNfMDw9JyYnKXx8KExBMTNfMD49JygnICYmIExBMTNfMDw9J1snKXx8KExBMTNfMD49J10nICYmIExBMTNfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMz0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTMpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NzM6NTU6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NzM6NjI6IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PScmJyl8fChpbnB1dC5MQSgxKT49JygnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzczOjc5OiAoICdcXCcnICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxND0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNF8wPT0nXCcnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3Mzo3OTogJ1xcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NUUklORyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9NTF9DT01NRU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX01MX0NPTU1FTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3NzU6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3NToxOTogJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi8qIik7IAorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3NToyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCisgICAgICAgICAgICBsb29wMTY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8wPT0nKicpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNl8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8xPT0nLycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTE2XzE+PSdcdTAwMDAnICYmIExBMTZfMTw9Jy4nKXx8KExBMTZfMT49JzAnICYmIExBMTZfMTw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMD49J1x1MDAwMCcgJiYgTEExNl8wPD0nKScpfHwoTEExNl8wPj0nKycgJiYgTEExNl8wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc1OjUyOiAuCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG1hdGNoKCIqLyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX01MX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU0xfQ09NTUVOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9TTF9DT01NRU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU0xfQ09NTUVOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc3OjE3OiAoICcvLycgKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqICggKCAnXFxyJyApPyAnXFxuJyApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3NzoxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLy8iKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc3OjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKKyAgICAgICAgICAgIGxvb3AxNzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExN18wPj0nXHUwMDAwJyAmJiBMQTE3XzA8PSdcdCcpfHwoTEExN18wPj0nXHUwMDBCJyAmJiBMQTE3XzA8PSdcZicpfHwoTEExN18wPj0nXHUwMDBFJyAmJiBMQTE3XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE3PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Nzc6MjQ6IH4gKCAoICdcXG4nIHwgJ1xccicgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nXHQnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBCJyAmJiBpbnB1dC5MQSgxKTw9J1xmJyl8fChpbnB1dC5MQSgxKT49J1x1MDAwRScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Nzc6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgaW50IGFsdDE5PTI7CisgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTlfMD09J1xuJ3x8TEExOV8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc3OjQxOiAoICdcXHInICk/ICdcXG4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Nzc6NDE6ICggJ1xccicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE4PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE4XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE4XzA9PSdccicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTg9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc3OjQxOiAnXFxyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXHInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcbicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9TTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1dTIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1dTKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfV1M7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc3OTo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Nzc5OjExOiAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY3Nzk6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICBpbnQgY250MjA9MDsKKyAgICAgICAgICAgIGxvb3AyMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyMF8wPj0nXHQnICYmIExBMjBfMDw9J1xuJyl8fExBMjBfMD09J1xyJ3x8TEEyMF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHQnICYmIGlucHV0LkxBKDEpPD0nXG4nKXx8aW5wdXQuTEEoMSk9PSdccid8fGlucHV0LkxBKDEpPT0nICcgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDIwID49IDEgKSBicmVhayBsb29wMjA7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIwLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDIwKys7CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1dTIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0FOWV9PVEhFUiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9BTllfT1RIRVIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9BTllfT1RIRVI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc4MToxNjogKCAuICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzgxOjE4OiAuCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9BTllfT1RIRVIiCisKKyAgICBwdWJsaWMgdm9pZCBtVG9rZW5zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4OiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFRfXzExNSB8IFRfXzExNiB8IFRfXzExNyB8IFRfXzExOCB8IFRfXzExOSB8IFRfXzEyMCB8IFRfXzEyMSB8IFRfXzEyMiB8IFRfXzEyMyB8IFRfXzEyNCB8IFRfXzEyNSB8IFRfXzEyNiB8IFRfXzEyNyB8IFRfXzEyOCB8IFRfXzEyOSB8IFRfXzEzMCB8IFRfXzEzMSB8IFRfXzEzMiB8IFRfXzEzMyB8IFRfXzEzNCB8IFRfXzEzNSB8IFRfXzEzNiB8IFRfXzEzNyB8IFRfXzEzOCB8IFRfXzEzOSB8IFRfXzE0MCB8IFRfXzE0MSB8IFRfXzE0MiB8IFRfXzE0MyB8IFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKQorICAgICAgICBpbnQgYWx0MjE9MTQ5OworICAgICAgICBhbHQyMSA9IGRmYTIxLnByZWRpY3QoaW5wdXQpOworICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7CisgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTA6IFRfXzEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxNjogVF9fMTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjIyOiBUX18xNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mjg6IFRfXzE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozNDogVF9fMTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQwOiBUX18xOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDY6IFRfXzE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1MjogVF9fMjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU4OiBUX18yMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY0OiBUX18yMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcwOiBUX18yMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc2OiBUX18yNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgyOiBUX18yNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg4OiBUX18yNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjk0OiBUX18yNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjEwMDogVF9fMjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxMDY6IFRfXzI5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTEyOiBUX18zMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjExODogVF9fMzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxMjQ6IFRfXzMyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTMwOiBUX18zMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjEzNjogVF9fMzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxNDI6IFRfXzM1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTQ4OiBUX18zNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjE1NDogVF9fMzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxNjA6IFRfXzM4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTY2OiBUX18zOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjE3MjogVF9fNDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxNzg6IFRfXzQxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTg0OiBUX180MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjE5MDogVF9fNDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxOTY6IFRfXzQ0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjAyOiBUX180NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjIwODogVF9fNDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyMTQ6IFRfXzQ3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjIwOiBUX180OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjIyNjogVF9fNDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyMzI6IFRfXzUwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjM4OiBUX181MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjI0NDogVF9fNTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyNTA6IFRfXzUzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjU2OiBUX181NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjI2MjogVF9fNTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyNjg6IFRfXzU2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mjc0OiBUX181NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjI4MDogVF9fNTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyODY6IFRfXzU5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjkyOiBUX182MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjI5ODogVF9fNjEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozMDQ6IFRfXzYyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzEwOiBUX182MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjMxNjogVF9fNjQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozMjI6IFRfXzY1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzI4OiBUX182NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjMzNDogVF9fNjcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozNDA6IFRfXzY4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzQ2OiBUX182OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjM1MjogVF9fNzAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozNTg6IFRfXzcxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzY0OiBUX183MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjM3MDogVF9fNzMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzczKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozNzY6IFRfXzc0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzgyOiBUX183NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjM4ODogVF9fNzYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTozOTQ6IFRfXzc3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDAwOiBUX183OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQwNjogVF9fNzkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0MTI6IFRfXzgwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDE4OiBUX184MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQyNDogVF9fODIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0MzA6IFRfXzgzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDM2OiBUX184NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDczIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQ0MjogVF9fODUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0NDg6IFRfXzg2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDU0OiBUX184NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQ2MDogVF9fODgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0NjY6IFRfXzg5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDcyOiBUX185MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQ3ODogVF9fOTEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0ODQ6IFRfXzkyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDkwOiBUX185MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQ5NjogVF9fOTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1MDI6IFRfXzk1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTA4OiBUX185NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjUxNDogVF9fOTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1MjA6IFRfXzk4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTI2OiBUX185OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjUzMjogVF9fMTAwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjUzOTogVF9fMTAxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU0NjogVF9fMTAyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU1MzogVF9fMTAzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU2MDogVF9fMTA0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU2NzogVF9fMTA1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU3NDogVF9fMTA2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU4MTogVF9fMTA3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU4ODogVF9fMTA4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU5NTogVF9fMTA5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYwMjogVF9fMTEwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYwOTogVF9fMTExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo2MTY6IFRfXzExMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NjIzOiBUX18xMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYzMDogVF9fMTE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo2Mzc6IFRfXzExNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NjQ0OiBUX18xMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY1MTogVF9fMTE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo2NTg6IFRfXzExOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTE4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NjY1OiBUX18xMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzExOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY3MjogVF9fMTIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo2Nzk6IFRfXzEyMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTIxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Njg2OiBUX18xMjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTExIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY5MzogVF9fMTIzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3MDA6IFRfXzEyNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NzA3OiBUX18xMjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcxNDogVF9fMTI2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3MjE6IFRfXzEyNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTI3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NzI4OiBUX18xMjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEyOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjczNTogVF9fMTI5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3NDI6IFRfXzEzMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NzQ5OiBUX18xMzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc1NjogVF9fMTMyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3NjM6IFRfXzEzMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NzcwOiBUX18xMzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc3NzogVF9fMTM1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3ODQ6IFRfXzEzNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NzkxOiBUX18xMzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc5ODogVF9fMTM4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4MDU6IFRfXzEzOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTM5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODEyOiBUX18xNDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTI5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgxOTogVF9fMTQxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4MjY6IFRfXzE0MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODMzOiBUX18xNDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg0MDogVF9fMTQ0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4NDc6IFRfXzE0NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODU0OiBUX18xNDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTM1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg2MTogVF9fMTQ3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4Njg6IFRfXzE0OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQ4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODc1OiBUX18xNDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTM4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg4MjogVF9fMTUwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4ODk6IFRfXzE1MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODk2OiBUX18xNTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE1MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjkwMzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTEyOiBSVUxFX0lOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo5MjE6IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTM0OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTQyOiBSVUxFX1NUUklORworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9TVFJJTkcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo5NTQ6IFJVTEVfTUxfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTcwOiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjk4NjogUlVMRV9XUworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9XUygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjk5NDogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDcwXDFcNzJcMVw3NFwxXDc3XDFcMTAzXDFcMTA2XDFcMTEyXDFcMTE0XDFcMTE2XDFcMTIwIisKKyAgICAgICAgIlwxXDEyMlwxXDEyNFwxXDEyN1wxNFwxMzFcMlx1ZmZmZlw3XDEzMVwxMFx1ZmZmZlwxXHUwMDlmXDJcMTMxXDIiKworICAgICAgICAiXHUwMGE0XDFcNjVcNVx1ZmZmZlwxXHUwMGE5XDI2XHVmZmZmXDFcdTAwYWJcNVx1ZmZmZlwxXHUwMGFkXDRcdWZmZmYiKworICAgICAgICAiXDFcMTMxXDFcdWZmZmZcMTZcMTMxXDFcdTAwYzFcMjJcMTMxXDFcdTAwZDhcNVwxMzFcMlx1ZmZmZlwxXHUwMGRmIisKKyAgICAgICAgIlwyMlwxMzFcMTJcdWZmZmZcMlwxMzFcMVx1ZmZmZlwxXHUwMGE0XDEyXHVmZmZmXDFcdTAwZmJcMVx1MDBmYyIrCisgICAgICAgICJcMjFcMTMxXDFcdWZmZmZcMlwxMzFcMVx1MDExM1w0XDEzMVwxXHUwMTE5XDE2XDEzMVwxXHVmZmZmXDRcMTMxIisKKyAgICAgICAgIlwxXHUwMTJlXDFcMTMxXDFcdWZmZmZcNFwxMzFcMVx1ZmZmZlwxXHUwMTM0XDVcMTMxXDFcdTAxM2FcMlwxMzEiKworICAgICAgICAiXDFcdTAxM2VcMTRcMTMxXDJcdWZmZmZcMVwxMzFcMVx1MDE0Y1wxXHUwMTRkXDRcMTMxXDFcdTAxNTJcMTVcMTMxIisKKyAgICAgICAgIlwxXHUwMTYwXDFcdWZmZmZcNVwxMzFcMVx1ZmZmZlwxXHUwMTY3XDFcdTAxNjhcM1wxMzFcMVx1MDE2Y1wzXDEzMSIrCisgICAgICAgICJcMVx1MDE3MVwzXDEzMVwxXHUwMTc1XDZcMTMxXDFcdWZmZmZcMVwxMzFcMVx1MDE3ZFwzXDEzMVwxXHVmZmZmIisKKyAgICAgICAgIlw1XDEzMVwxXHVmZmZmXDFcMTMxXDFcdTAxODdcMVwxMzFcMVx1ZmZmZlwxXDEzMVwxXHUwMThhXDEwXDEzMSIrCisgICAgICAgICJcMVx1MDE5M1wyXDEzMVwyXHVmZmZmXDFcdTAxOTdcMlwxMzFcMVx1MDE5YVwxXHVmZmZmXDFcdTAxOWNcMTMiKworICAgICAgICAiXDEzMVwxXHUwMWE4XDFcdWZmZmZcNVwxMzFcMVx1MDFhZlwyXHVmZmZmXDFcdTAxYjBcMVwxMzFcMVx1MDFiMiIrCisgICAgICAgICJcMVx1ZmZmZlwxXHUwMWIzXDNcMTMxXDFcdWZmZmZcMlwxMzFcMVx1MDFiOVwxXHVmZmZmXDFcMTMxXDFcdTAxYmIiKworICAgICAgICAiXDVcMTMxXDFcdWZmZmZcMlwxMzFcMVx1MDFjM1wxXDEzMVwxXHUwMWM1XDRcMTMxXDFcdWZmZmZcMlwxMzFcMSIrCisgICAgICAgICJcdWZmZmZcNFwxMzFcMVx1MDFkMFwzXDEzMVwxXHVmZmZmXDNcMTMxXDFcdWZmZmZcMVx1MDFkN1wxXDEzMVwzIisKKyAgICAgICAgIlx1ZmZmZlwxXDEzMVwxXHUwMWRjXDJcMTMxXDFcdTAxZGZcMlwxMzFcMVx1MDFlMlwxXHUwMWU0XDJcMTMxXDEiKworICAgICAgICAiXHVmZmZmXDJcMTMxXDFcdTAxZTlcMVwxMzFcMVx1MDFlYlwzXHVmZmZmXDFcMTMxXDJcdWZmZmZcMVx1MDFlZiIrCisgICAgICAgICJcMVwxMzFcMVx1MDFmMVwxXDEzMVwxXHUwMWYzXDFcdWZmZmZcMVwxMzFcMVx1ZmZmZlw2XDEzMVwxXHUwMWZiIisKKyAgICAgICAgIlwxXHVmZmZmXDFcdTAxZmNcMVx1ZmZmZlw3XDEzMVwxXHUwMjA0XDFcMTMxXDFcdTAyMDZcMVx1ZmZmZlwxXDEzMSIrCisgICAgICAgICJcMVx1MDIwOFwxXHUwMjA5XDFcMTMxXDFcdTAyMGJcMVwxMzFcMVx1ZmZmZlwxXHUwMjBkXDJcdWZmZmZcMVwxMzEiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDIwZlwxXDEzMVwxXHVmZmZmXDJcMTMxXDNcdWZmZmZcMlwxMzFcMVx1MDIxNVwxXDEzMSIrCisgICAgICAgICJcMVx1ZmZmZlwxXHUwMjE4XDNcdWZmZmZcMVwxMzFcMVx1ZmZmZlwxXDEzMVwxXHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAiXDFcMTMxXDFcdTAyMWRcMVwxMzFcMVx1MDIxZlwxXHUwMjIwXDFcdTAyMjFcMVwxMzFcMlx1ZmZmZlwxXDEzMSIrCisgICAgICAgICJcMVx1MDIyNFwxXHUwMjI1XDNcMTMxXDFcdTAyMjlcMVx1ZmZmZlwxXDEzMVwxXHVmZmZmXDFcdTAyMmJcMlx1ZmZmZiIrCisgICAgICAgICJcMVwxMzFcMVx1ZmZmZlwxXDEzMVwxXHVmZmZmXDFcMTMxXDFcdWZmZmZcNVwxMzFcMVx1ZmZmZlwxXHUwMjM0IisKKyAgICAgICAgIlwyXHVmZmZmXDFcdTAyMzVcMlwxMzFcMVx1MDIzOFwxXHVmZmZmXDFcMTMxXDNcdWZmZmZcMVx1MDIzYVwxXHUwMjNiIisKKyAgICAgICAgIlwyXHVmZmZmXDNcMTMxXDFcdWZmZmZcMVwxMzFcMVx1ZmZmZlwxXHUwMjQwXDFcdTAyNDFcNVwxMzFcMVx1MDI0NyIrCisgICAgICAgICJcMlx1ZmZmZlwyXDEzMVwxXHVmZmZmXDFcMTMxXDJcdWZmZmZcMVwxMzFcMVx1MDI0Y1wxXDEzMVwxXHUwMjRlIisKKyAgICAgICAgIlwyXHVmZmZmXDJcMTMxXDFcdTAyNTFcMVx1MDI1MlwxXHUwMjUzXDFcdWZmZmZcMlwxMzFcMVx1ZmZmZlwxXHUwMjU2IisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTMxXDFcdWZmZmZcMlwxMzFcM1x1ZmZmZlwxXHUwMjVhXDFcdTAyNWJcMVx1ZmZmZlwxXHUwMjVjIisKKyAgICAgICAgIlwxXHUwMjVkXDFcdTAyNWVcNVx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KKyAgICAgICAgIlx1MDI1Zlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9taW5TID0KKyAgICAgICAgIlwxXDBcMVw3NVwxXDE3NFwxXDQ2XDFcNTNcMVw1NVwyXDUyXDNcNzVcMVw3NlwyXDU2XDJcMTQxXDFcMTQ1IisKKyAgICAgICAgIlwxXDE0NlwxXDE0MVwxXDE2NVwyXDE0NVw0XDE0MVwyXHVmZmZmXDFcMTU0XDFcMTYwXDNcMTQxXDFcMTUwXDEiKworICAgICAgICAiXDE0NVwxMFx1ZmZmZlwxXDcyXDFcMTU3XDFcMTQxXDJcNjBcMVw0NFw1XHVmZmZmXDFcNzVcMjZcdWZmZmZcMSIrCisgICAgICAgICJcNzVcNVx1ZmZmZlwxXDc0XDRcdWZmZmZcMVwxNTRcMVx1ZmZmZlwxXDE2NFwyXDE2M1wxXDE2MFwxXDE0MVwxIisKKyAgICAgICAgIlwxNjBcMVwxNTdcMVwxNjVcMVwxNDdcMVwxNDFcMVwxNTZcMVwxNDFcMVwxNjBcMVwxNjNcMVw0NFwxXDE1NCIrCisgICAgICAgICJcMVwxNjJcMVwxNTRcMVwxNjRcMVwxNjJcMVwxNjdcMVwxNTRcMVwxNjNcMVwxNTFcMVwxNjNcMVwxNDFcMVwxNjIiKworICAgICAgICAiXDFcMTU0XDFcMTU2XDJcMTQ3XDFcMTQyXDFcMTY0XDFcNDRcMVwxNDZcMVwxNjJcMVwxNDNcMVwxNDVcMVwxNTQiKworICAgICAgICAiXDJcdWZmZmZcMVw0NFwyXDE1MVwxXDE2N1wxXDE1MVwxXDQwXDFcMTYyXDFcMTQyXDFcMTY1XDFcMTQxXDFcMTU2IisKKyAgICAgICAgIlwxXDE2MFwxXDE1NFwxXDE0MVwxXDE0N1wxXDE0M1wxXDE2MFwxXDE2MlwxXDE1NlwxMlx1ZmZmZlwxXDE1NyIrCisgICAgICAgICJcMVwxNjNcMVx1ZmZmZlwxXDYwXDEyXHVmZmZmXDJcNDRcMVwxNDVcMVwxNjRcMVwxNDVcMVwxNjRcMVwxNDMiKworICAgICAgICAiXDFcMTQ1XDFcMTY3XDFcMTY0XDFcMTU1XDFcMTY0XDFcMTYwXDFcMTQzXDFcMTQ0XDFcMTYyXDFcMTU3XDFcMTUxIisKKyAgICAgICAgIlwxXDE0NVwxXHVmZmZmXDFcMTYzXDFcMTY0XDFcNDRcMVwxNDFcMVwxNTRcMVwxNjNcMVwxNTVcMVw0NFwxXDE1NCIrCisgICAgICAgICJcMVwxNjRcMVwxNTRcMVwxNDNcMVwxNDVcMVwxNjJcMVwxNjNcMVwxNTRcMVwxNDVcMVwxNDFcMlwxNDVcMVwxNDEiKworICAgICAgICAiXDFcMTY1XDFcdWZmZmZcMVwxNDFcMVwxNDNcMVwxNDFcMVwxNTNcMVw0NFwxXDE1NFwxXHVmZmZmXDFcMTYzIisKKyAgICAgICAgIlwxXDE1NVwxXDE0MVwxXDE1NlwxXHVmZmZmXDFcNDRcMVwxNDJcMVwxNDdcMVwxNDRcMlwxNTFcMVw0NFwxXDE2NCIrCisgICAgICAgICJcMVwxNDVcMVw0NFwxXDE1NlwxXDE0NVwxXDE1NFwxXDE0N1wxXDE1M1wxXDE0NVwxXDE1N1wxXDE0NFwxXDE2NSIrCisgICAgICAgICJcMVwxNTRcMVwxNTVcMVwxMjRcMlx1ZmZmZlwxXDE1NlwyXDQ0XDFcMTcxXDFcMTUxXDFcMTUzXDFcMTYyXDEiKworICAgICAgICAiXDQ0XDFcMTUwXDFcMTQ1XDFcMTQzXDFcMTYwXDFcMTUwXDFcMTQ1XDFcMTE1XDFcMTY0XDFcMTYyXDFcMTQ0IisKKyAgICAgICAgIlwxXDE0MVwxXDE2MlwxXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNTRcMVwxMzJcMVwxNTFcMVwxNDFcMVwxNTBcMSIrCisgICAgICAgICJcdWZmZmZcMlw0NFwxXDE0NVwxXDE0N1wxXDE1MFwxXDQ0XDFcMTY0XDFcMTU3XDFcMTQxXDFcNDRcMVwxNjIiKworICAgICAgICAiXDFcMTU2XDFcMTU0XDFcNDRcMVwxNTVcMVwxNjRcMVwxNjVcMVwxNjJcMVwxNTVcMVwxNDFcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNTFcMVw0NFwxXDE0MVwxXDE3MVwxXDE0N1wxXHVmZmZmXDFcMTU0XDFcMTQ1XDFcMTUxXDJcMTU1XDFcdWZmZmYiKworICAgICAgICAiXDFcMTUxXDFcNDRcMVwxNDRcMVx1ZmZmZlwxXDE2M1wxXDQ0XDFcMTY0XDFcMTU0XDFcMTQxXDFcMTU3XDFcMTY3IisKKyAgICAgICAgIlwxXDE0NVwxXDE2MlwxXDE1N1wxXDQ0XDFcMTUxXDFcMTQ0XDJcdWZmZmZcMVw0NFwxXDE0M1wxXDE0NVwxXDQ0IisKKyAgICAgICAgIlwxXHVmZmZmXDFcNDRcMVwxNTZcMVwxNTBcMVwxNDVcMVwxNjJcMVwxNDRcMVwxNDFcMVwxMTRcMVwxNjRcMSIrCisgICAgICAgICJcMTQ1XDFcMTU2XDFcMTY2XDFcNDRcMVx1ZmZmZlwxXDE1NFwxXDE0NVwyXDE0NFwxXDE1NFwxXDQ0XDJcdWZmZmYiKworICAgICAgICAiXDFcNDRcMVwxNTdcMVw0NFwxXHVmZmZmXDFcNDRcMVwxNjJcMVwxNjBcMVwxNjJcMVx1ZmZmZlwxXDE1MVwxIisKKyAgICAgICAgIlwxNDRcMVw0NFwxXHVmZmZmXDFcMTQxXDFcNDRcMVwxNTRcMlwxNTFcMVwxNDdcMVwxNTZcMVx1ZmZmZlwxXDE2NCIrCisgICAgICAgICJcMVwxNjNcMVw0NFwxXDE0NVwxXDQ0XDFcMTQ1XDJcMTY1XDFcMTYwXDFcdWZmZmZcMVwxMTRcMVwxNjBcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMVwxNDVcMVwxNTZcMVwxNDZcMVw0NFwxXDE2MlwxXDE1NlwxXDE2NFwxXHVmZmZmXDFcMTQzXDEiKworICAgICAgICAiXDE2M1wxXDE1MVwxXHVmZmZmXDFcNDRcMVwxNDRcMVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTY0XDFcNDRcMSIrCisgICAgICAgICJcMTQ0XDFcMTU3XDFcNDRcMVwxNjJcMVwxNDFcMlw0NFwxXDE0M1wxXDE0MVwxXHVmZmZmXDFcMTcxXDFcMTYyIisKKyAgICAgICAgIlwxXDQ0XDFcMTQ1XDFcNDRcMVwxNDVcMlx1ZmZmZlwxXDE2MlwyXHVmZmZmXDFcNDRcMVwxNjNcMVw0NFwxXDE2NCIrCisgICAgICAgICJcMVw0NFwxXHVmZmZmXDFcMTYyXDFcdWZmZmZcMVwxNjRcMVwxNDJcMVwxNDRcMVwxNDVcMVwxNDdcMVwxNDUiKworICAgICAgICAiXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNTZcMlwxNTVcMVwxNTRcMVwxNTFcMVwxNDFcMVwxNjBcMSIrCisgICAgICAgICJcNDRcMVwxNDdcMVw0NFwxXHVmZmZmXDFcMTYzXDJcNDRcMVwxNTNcMVw0NFwxXDE1N1wxXHVmZmZmXDFcNDQiKworICAgICAgICAiXDJcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxXDQ0XDFcMTU2XDFcdWZmZmZcMVwxNTNcMVwxNDJcM1x1ZmZmZlwxIisKKyAgICAgICAgIlwxNDVcMVwxNTRcMVw0NFwxXDE1N1wxXHVmZmZmXDFcNDRcM1x1ZmZmZlwxXDE3MVwxXHVmZmZmXDFcMTUxXDEiKworICAgICAgICAiXHVmZmZmXDFcMTUwXDFcdWZmZmZcMVwxNjRcMVw0NFwxXDE0NVwzXDQ0XDFcMTQ0XDJcdWZmZmZcMVwxNjRcMiIrCisgICAgICAgICJcNDRcMVwxNTFcMVwxNTZcMVwxNjJcMVw0NFwxXHVmZmZmXDFcMTU0XDFcdWZmZmZcMVw0NFwyXHVmZmZmXDEiKworICAgICAgICAiXDE2M1wxXHVmZmZmXDFcMTU2XDFcdWZmZmZcMVwxNTdcMVx1ZmZmZlwxXDE1MVwyXDE0NVwxXDE1N1wxXDE2MyIrCisgICAgICAgICJcMVx1ZmZmZlwxXDQ0XDJcdWZmZmZcMVw0NFwxXDE0MlwxXDE1NVwxXDQ0XDFcdWZmZmZcMVwxNDRcM1x1ZmZmZiIrCisgICAgICAgICJcMlw0NFwyXHVmZmZmXDNcMTQ1XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwyXDQ0XDFcMTU0XDFcMTcyXDFcMTYyIisKKyAgICAgICAgIlwxXDE1NFwxXDE0NlwxXDQ0XDJcdWZmZmZcMVwxNTRcMVwxNTFcMVx1ZmZmZlwxXDQwXDJcdWZmZmZcMVwxNjIiKworICAgICAgICAiXDFcNDRcMVwxNTZcMVw0NFwyXHVmZmZmXDFcMTU3XDFcMTQ1XDNcNDRcMVx1ZmZmZlwxXDE0NVwxXDE0M1wxIisKKyAgICAgICAgIlx1ZmZmZlwxXDQ0XDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDE2MlwxXDE0NFwzXHVmZmZmXDJcNDRcMVx1ZmZmZiIrCisgICAgICAgICJcM1w0NFw1XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21heFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw3NlwxXDE3NFwxXDQ2XDFcNzVcMVw3Nlw1XDc1XDFcNzZcMVw1NlwxXDcyXDFcMTQxXDEiKworICAgICAgICAiXDE3MFwxXDE3MVwxXDE1NlwxXDE1N1wyXDE2NVwxXDE1MFwxXDE2NVwyXDE1N1wxXDE3MVwyXHVmZmZmXDFcMTcwIisKKyAgICAgICAgIlwxXDE2M1wxXDE2NVwxXDE2MlwxXDE2NVwxXDE3MVwxXDE0NVwxMFx1ZmZmZlwxXDcyXDFcMTU3XDFcMTQxXDEiKworICAgICAgICAiXDE3MFwxXDE1NFwxXDE3Mlw1XHVmZmZmXDFcNzVcMjZcdWZmZmZcMVw3NVw1XHVmZmZmXDFcNzRcNFx1ZmZmZiIrCisgICAgICAgICJcMVwxNjJcMVx1ZmZmZlwxXDE2NFwyXDE2M1wxXDE2MFwxXDE0MVwxXDE2MFwxXDE1N1wxXDE2NVwxXDE0N1wxIisKKyAgICAgICAgIlwxNTFcMVwxNTZcMVwxNTdcMVwxNjBcMVwxNjRcMVwxNzJcMVwxNjNcMVwxNjJcMVwxNTZcMVwxNjRcMVwxNjIiKworICAgICAgICAiXDFcMTY3XDFcMTU0XDFcMTYzXDFcMTUxXDFcMTY0XDFcMTQxXDFcMTYyXDFcMTU0XDFcMTU2XDJcMTQ3XDFcMTQyIisKKyAgICAgICAgIlwxXDE2NFwxXDE3MlwxXDE2M1wxXDE2MlwxXDE0M1wxXDE0NVwxXDE1NFwyXHVmZmZmXDFcMTcyXDJcMTUxXDEiKworICAgICAgICAiXDE2N1wxXDE1MVwxXDQwXDFcMTYyXDFcMTQyXDFcMTY1XDFcMTQxXDFcMTU2XDFcMTcwXDFcMTU0XDFcMTcxIisKKyAgICAgICAgIlwxXDE1N1wxXDE0M1wxXDE2MFwxXDE2MlwxXDE2NFwxMlx1ZmZmZlwxXDE1N1wxXDE2M1wxXHVmZmZmXDFcMTU0IisKKyAgICAgICAgIlwxMlx1ZmZmZlwyXDE3MlwxXDE0NVwxXDE2NFwxXDE0NVwyXDE2NFwxXDE0NVwxXDE2N1wxXDE2NFwxXDE1NSIrCisgICAgICAgICJcMVwxNjRcMVwxNjBcMVwxNDNcMVwxNDRcMVwxNjdcMVwxNTdcMVwxNjRcMVwxNDVcMVx1ZmZmZlwxXDE2M1wxIisKKyAgICAgICAgIlwxNjRcMVwxNzJcMVwxNDFcMVwxNTRcMVwxNjNcMVwxNjRcMVwxNzJcMVwxNTRcMVwxNjRcMVwxNTRcMlwxNDUiKworICAgICAgICAiXDFcMTYyXDFcMTYzXDFcMTU0XDFcMTQ1XDFcMTQxXDNcMTQ1XDFcMTY1XDFcdWZmZmZcMVwxNDFcMVwxNDNcMSIrCisgICAgICAgICJcMTQxXDFcMTUzXDFcMTcyXDFcMTU0XDFcdWZmZmZcMVwxNjNcMVwxNTVcMVwxNDFcMVwxNTZcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNzJcMVwxNDJcMVwxNDdcMVwxNDRcMlwxNTFcMVwxNzJcMVwxNjRcMVwxNTZcMVwxNzJcMVwxNTZcMVwxNDUiKworICAgICAgICAiXDFcMTU0XDFcMTQ3XDFcMTUzXDFcMTQ1XDFcMTU3XDFcMTQ0XDFcMTY1XDFcMTU0XDFcMTU1XDFcMTI0XDJcdWZmZmYiKworICAgICAgICAiXDFcMTU2XDJcMTcyXDFcMTcxXDFcMTUxXDFcMTUzXDFcMTYyXDFcMTcyXDFcMTUwXDFcMTQ1XDFcMTQzXDFcMTYwIisKKyAgICAgICAgIlwxXDE1MFwxXDE0NVwxXDExNVwxXDE2NFwxXDE2MlwxXDE0NFwxXDE0MVwxXDE2MlwxXDE0NVwxXDE3MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE1NFwxXDE0NVwxXDE1MVwxXDE0MVwxXDE1MFwxXHVmZmZmXDJcMTcyXDFcMTQ1XDFcMTQ3XDFcMTUwXDEiKworICAgICAgICAiXDE3MlwxXDE2NFwxXDE1N1wxXDE0MVwxXDE3MlwxXDE2MlwxXDE1NlwxXDE1NFwxXDE3MlwxXDE1NVwxXDE2NCIrCisgICAgICAgICJcMVwxNjVcMVwxNjJcMVwxNTVcMVwxNDFcMVx1ZmZmZlwxXDE1MVwxXDE3MlwxXDE0MVwxXDE3MVwxXDE0N1wxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE1NFwxXDE0NVwxXDE1MVwyXDE1NVwxXHVmZmZmXDFcMTUxXDFcMTcyXDFcMTQ0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTYzXDFcMTcyXDFcMTY0XDFcMTU0XDFcMTQxXDFcMTU3XDFcMTY3XDFcMTQ1XDFcMTYyXDFcMTU3XDFcMTcyIisKKyAgICAgICAgIlwxXDE1MVwxXDE2M1wyXHVmZmZmXDFcMTcyXDFcMTQzXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNzJcMVwxNTYiKworICAgICAgICAiXDFcMTUwXDFcMTQ1XDFcMTYyXDFcMTQ0XDFcMTQxXDFcMTE0XDFcMTY0XDFcMTQ1XDFcMTU2XDFcMTY2XDFcMTcyIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTU0XDFcMTQ1XDJcMTQ0XDFcMTU0XDFcMTcyXDJcdWZmZmZcMVwxNzJcMVwxNTdcMVwxNzIiKworICAgICAgICAiXDFcdWZmZmZcMVwxNzJcMVwxNjJcMVwxNjBcMVwxNjJcMVx1ZmZmZlwxXDE1MVwxXDE0NFwxXDE3MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MVwxXDE3MlwxXDE1NFwyXDE1MVwxXDE0N1wxXDE1NlwxXHVmZmZmXDFcMTY0XDFcMTYzXDFcMTcyXDEiKworICAgICAgICAiXDE0NVwxXDE3MlwxXDE0NVwyXDE2NVwxXDE2MFwxXHVmZmZmXDFcMTE0XDFcMTYwXDFcdWZmZmZcMVwxNTFcMSIrCisgICAgICAgICJcMTQ1XDFcMTU2XDFcMTQ2XDFcMTcyXDFcMTYyXDFcMTU2XDFcMTY0XDFcdWZmZmZcMVwxNDNcMVwxNjNcMVwxNTEiKworICAgICAgICAiXDFcdWZmZmZcMVwxNzJcMVwxNDRcMVx1ZmZmZlwxXDE2N1wxXHVmZmZmXDFcMTY0XDFcMTcyXDFcMTQ0XDFcMTU3IisKKyAgICAgICAgIlwxXDE3MlwxXDE2MlwxXDE0MVwyXDE3MlwxXDE0M1wxXDE0MVwxXHVmZmZmXDFcMTcxXDFcMTYyXDFcMTcyXDEiKworICAgICAgICAiXDE0NVwxXDE3MlwxXDE2N1wyXHVmZmZmXDFcMTYyXDJcdWZmZmZcMVwxNzJcMVwxNjNcMVwxNzJcMVwxNjRcMSIrCisgICAgICAgICJcMTcyXDFcdWZmZmZcMVwxNjJcMVx1ZmZmZlwxXDE2NFwxXDE0MlwxXDE0NFwxXDE0NVwxXDE0N1wxXDE0NVwxIisKKyAgICAgICAgIlwxNzJcMVx1ZmZmZlwxXDE3MlwxXHVmZmZmXDFcMTU2XDJcMTU1XDFcMTU0XDFcMTUxXDFcMTQxXDFcMTYwXDEiKworICAgICAgICAiXDE3MlwxXDE0N1wxXDE3MlwxXHVmZmZmXDFcMTYzXDJcMTcyXDFcMTUzXDFcMTcyXDFcMTU3XDFcdWZmZmZcMSIrCisgICAgICAgICJcMTcyXDJcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxXDE3MlwxXDE1NlwxXHVmZmZmXDFcMTUzXDFcMTQyXDNcdWZmZmYiKworICAgICAgICAiXDFcMTQ1XDFcMTU0XDFcMTcyXDFcMTU3XDFcdWZmZmZcMVwxNzJcM1x1ZmZmZlwxXDE3MVwxXHVmZmZmXDFcMTUxIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTUwXDFcdWZmZmZcMVwxNjRcMVwxNzJcMVwxNDVcM1wxNzJcMVwxNDRcMlx1ZmZmZlwxXDE2NCIrCisgICAgICAgICJcMlwxNzJcMVwxNTFcMVwxNTZcMVwxNjJcMVwxNzJcMVx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTcyXDJcdWZmZmYiKworICAgICAgICAiXDFcMTYzXDFcdWZmZmZcMVwxNTZcMVx1ZmZmZlwxXDE1N1wxXHVmZmZmXDFcMTUxXDJcMTQ1XDFcMTU3XDFcMTYzIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTcyXDJcdWZmZmZcMVwxNzJcMVwxNDJcMVwxNTVcMVwxNzJcMVx1ZmZmZlwxXDE0NFwzXHVmZmZmIisKKyAgICAgICAgIlwyXDE3MlwyXHVmZmZmXDNcMTQ1XDFcdWZmZmZcMVwxNDVcMVx1ZmZmZlwyXDE3MlwxXDE1NFwxXDE3MlwxXDE2MiIrCisgICAgICAgICJcMVwxNTRcMVwxNDZcMVwxNzJcMlx1ZmZmZlwxXDE1NFwxXDE1MVwxXHVmZmZmXDFcNDBcMlx1ZmZmZlwxXDE2MiIrCisgICAgICAgICJcMVwxNzJcMVwxNTZcMVwxNzJcMlx1ZmZmZlwxXDE1N1wxXDE0NVwzXDE3MlwxXHVmZmZmXDFcMTQ1XDFcMTQzIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDE2MlwxXDE0NFwzXHVmZmZmXDJcMTcyXDEiKworICAgICAgICAiXHVmZmZmXDNcMTcyXDVcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfYWNjZXB0UyA9CisgICAgICAgICJcMzJcdWZmZmZcMVw3NFwxXDc1XDdcdWZmZmZcMVwxMjJcMVwxMjNcMVwxMjRcMVwxMjVcMVwxMjZcMVwxMjciKworICAgICAgICAiXDFcMTMwXDFcMTMyXDZcdWZmZmZcMVx1MDA5MFwyXHUwMDkxXDFcdTAwOTRcMVx1MDA5NVwxXHVmZmZmXDFcMjMiKworICAgICAgICAiXDFcMVwxXDJcMVx1MDA4YVwxXDNcMVwxNTZcMVw0XDFcMzVcMVwyNlwxXDVcMVwyMFwxXDM2XDFcMjdcMVw2IisKKyAgICAgICAgIlwxXDMxXDFcMzBcMVw3XDFcdTAwOTJcMVx1MDA5M1wxXDMyXDFcMTBcMVwzM1wxXHVmZmZmXDFcMzRcMVwxNSIrCisgICAgICAgICJcMVwxNlwxXDI0XDFcMTdcMVx1ZmZmZlwxXDM3XDFcMjVcMVx1MDA4OVwxXDE1NVwxXHVmZmZmXDFcdTAwOTAiKworICAgICAgICAiXDQ3XHVmZmZmXDFcNzRcMVw3NVwyM1x1ZmZmZlwxXDEyMlwxXDEyM1wxXDEyNFwxXDEyNVwxXDEyNlwxXDEyNyIrCisgICAgICAgICJcMVwxMzBcMVwxMzJcMVx1MDA4OFwxXDEzNlwyXHVmZmZmXDFcdTAwOGRcMVx1ZmZmZlwxXHUwMDhlXDFcdTAwOGYiKworICAgICAgICAiXDFcdTAwOTFcMVx1MDA5NFwxXDEzXDFcMTFcMVwxNFwxXDEyXDFcMjFcMVwyMlwyM1x1ZmZmZlwxXDEzM1wyNiIrCisgICAgICAgICJcdWZmZmZcMVwxNDNcNlx1ZmZmZlwxXDc3XDRcdWZmZmZcMVwxMTJcMjZcdWZmZmZcMVw0MFwxXHUwMDhiXDI2IisKKyAgICAgICAgIlx1ZmZmZlwxXDE0MVw1XHVmZmZmXDFcMTQ0XDI0XHVmZmZmXDFcMTAzXDVcdWZmZmZcMVwxMDFcNVx1ZmZmZiIrCisgICAgICAgICJcMVx1MDA4MlwzXHVmZmZmXDFcMTUxXDE1XHVmZmZmXDFcNjBcMVwxMzRcNFx1ZmZmZlwxXDU0XDE1XHVmZmZmIisKKyAgICAgICAgIlwxXDU1XDZcdWZmZmZcMVwxNDVcMVw2NFwzXHVmZmZmXDFcMTQwXDRcdWZmZmZcMVwxMDJcM1x1ZmZmZlwxXDcwIisKKyAgICAgICAgIlw3XHVmZmZmXDFcMTE2XDExXHVmZmZmXDFcMTExXDJcdWZmZmZcMVx1MDA4Y1wxMFx1ZmZmZlwxXDE3MFwzXHVmZmZmIisKKyAgICAgICAgIlwxXDE3M1wyXHVmZmZmXDFcNDVcMVx1ZmZmZlwxXDYyXDEzXHVmZmZmXDFcNDZcNlx1ZmZmZlwxXDU2XDFcMTQyIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTU0XDFcNzZcNVx1ZmZmZlwxXDE3N1wxXHVmZmZmXDFcMTA0XDdcdWZmZmZcMVwxMDBcMSIrCisgICAgICAgICJcdWZmZmZcMVwxMDZcMTJcdWZmZmZcMVwxNDdcNlx1ZmZmZlwxXDQyXDFcdWZmZmZcMVw2MVwxXDYzXDFcdWZmZmYiKworICAgICAgICAiXDFcMTM1XDJcdWZmZmZcMVwxNjFcMlx1ZmZmZlwxXDQzXDFcNTBcMVw0N1w0XHVmZmZmXDFcMTcyXDFcdWZmZmYiKworICAgICAgICAiXDFcNTNcMVw1N1wxXDY1XDFcdWZmZmZcMVwxNjdcMVx1ZmZmZlwxXDY3XDFcdWZmZmZcMVwxMTRcN1x1ZmZmZiIrCisgICAgICAgICJcMVx1MDA4NlwxXDEwNVw3XHVmZmZmXDFcdTAwODRcMVx1ZmZmZlwxXDE0NlwxXHVmZmZmXDFcMTUwXDFcdTAwODUiKworICAgICAgICAiXDFcdWZmZmZcMVw0MVwxXHVmZmZmXDFcMTY0XDFcdWZmZmZcMVwxNjNcNVx1ZmZmZlwxXDE1MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDUyXDFcNTFcNFx1ZmZmZlwxXDEzN1wxXHVmZmZmXDFcNzJcMVw3M1wxXDE2MFwyXHVmZmZmXDFcMTA3XDEiKworICAgICAgICAiXDExMFwzXHVmZmZmXDFcMTE1XDFcdWZmZmZcMVwxMTdcMTBcdWZmZmZcMVwxNzFcMVw2NlwyXHVmZmZmXDFcMTEzIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTYyXDFcMTc1XDRcdWZmZmZcMVx1MDA4MFwxXDQ0XDVcdWZmZmZcMVx1MDA4MVwyXHVmZmZmIisKKyAgICAgICAgIlwxXDE1N1wxXHVmZmZmXDFcMTY2XDFcdWZmZmZcMVwxMjBcMlx1ZmZmZlwxXDE2NVwxXHUwMDg3XDFcMTMxXDIiKworICAgICAgICAiXHVmZmZmXDFcMTc0XDNcdWZmZmZcMVx1MDA4M1wxXDcxXDFcMTc2XDFcMTIxXDFcMTUzIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcdTAyNWVcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxMVw2NVwyXDY0XDJcNjVcMVw2NFwyMlw2NVwxXDY0XDFcMTFcMVw2MlwxXDUwXDFcNjFcMVwxMFwxIisKKyAgICAgICAgICAgICJcM1wxXDYzXDFcNDRcMVw0NVwxXDZcMVw0XDFcNDZcMVw1XDFcMTRcMVw3XDFcNTZcMTFcNTdcMVw1MyIrCisgICAgICAgICAgICAiXDFcNTJcMVwxM1wxXDFcMVwxMlwxXDE1XDFcNDNcMzJcNjFcMVw1MVwxXDY1XDFcNDdcMVw2MFwxXDYxIisKKyAgICAgICAgICAgICJcMVw2NVwxXDM0XDFcMzZcMVwyNlwxXDMwXDFcMTdcMVwyMlwxXDM3XDFcNTVcMVwyMVwyXDYxXDFcMjciKworICAgICAgICAgICAgIlwxXDQwXDFcMjRcMVwyM1wxXDMxXDFcNjFcMVw0MlwxXDIwXDFcNDFcMVwzNVwxXDE2XDFcMjVcMlw2MSIrCisgICAgICAgICAgICAiXDFcNTRcMVwzMlwxXDJcMVwzM1x1ZmY4Mlw2NSIsCisgICAgICAgICAgICAiXDFcNjZcMVw2NyIsCisgICAgICAgICAgICAiXDFcNzEiLAorICAgICAgICAgICAgIlwxXDczIiwKKyAgICAgICAgICAgICJcMVw3NlwyMVx1ZmZmZlwxXDc1IiwKKyAgICAgICAgICAgICJcMVwxMDJcMTdcdWZmZmZcMVwxMDBcMVwxMDEiLAorICAgICAgICAgICAgIlwxXDEwNVwyMlx1ZmZmZlwxXDEwNCIsCisgICAgICAgICAgICAiXDFcMTEwXDRcdWZmZmZcMVwxMTFcMTVcdWZmZmZcMVwxMDciLAorICAgICAgICAgICAgIlwxXDExMyIsCisgICAgICAgICAgICAiXDFcMTE1IiwKKyAgICAgICAgICAgICJcMVwxMTciLAorICAgICAgICAgICAgIlwxXDEyMSIsCisgICAgICAgICAgICAiXDFcMTIzIiwKKyAgICAgICAgICAgICJcMVwxMjZcMTNcdWZmZmZcMVwxMjUiLAorICAgICAgICAgICAgIlwxXDEzMCIsCisgICAgICAgICAgICAiXDFcMTMzXDEyXHVmZmZmXDFcMTM0XDFcMTM1XDEyXHVmZmZmXDFcMTMyIiwKKyAgICAgICAgICAgICJcMVwxNDJcMlx1ZmZmZlwxXDE0NVwzXHVmZmZmXDFcMTQwXDJcdWZmZmZcMVwxNDFcNFx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcMTM2XDFcMTM3XDFcdWZmZmZcMVwxNDNcMVx1ZmZmZlwxXDE0NCIsCisgICAgICAgICAgICAiXDFcMTUwXDZcdWZmZmZcMVwxNDZcMVwxNDciLAorICAgICAgICAgICAgIlwxXDE1MVw3XHVmZmZmXDFcMTUzXDVcdWZmZmZcMVwxNTIiLAorICAgICAgICAgICAgIlwxXDE1NCIsCisgICAgICAgICAgICAiXDFcMTU2XDExXHVmZmZmXDFcMTU1XDVcdWZmZmZcMVwxNTciLAorICAgICAgICAgICAgIlwxXDE2MFwyXHVmZmZmXDFcMTYxIiwKKyAgICAgICAgICAgICJcMVwxNjJcNlx1ZmZmZlwxXDE2M1w2XHVmZmZmXDFcMTY1XDVcdWZmZmZcMVwxNjQiLAorICAgICAgICAgICAgIlwxXDE3MVwzXHVmZmZmXDFcMTcwXDNcdWZmZmZcMVwxNjZcNVx1ZmZmZlwxXDE2NyIsCisgICAgICAgICAgICAiXDFcMTcyXDNcdWZmZmZcMVwxNzRcMTFcdWZmZmZcMVwxNzMiLAorICAgICAgICAgICAgIlwxXDE3Nlw3XHVmZmZmXDFcMTc3XDVcdWZmZmZcMVx1MDA4MFwxMVx1ZmZmZlwxXDE3NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDg2XDFcdWZmZmZcMVx1MDA4NVw0XHVmZmZmXDFcdTAwODNcNFx1ZmZmZlwxXHUwMDg0IiwKKyAgICAgICAgICAgICJcMVx1MDA4OFwyXHVmZmZmXDFcdTAwODciLAorICAgICAgICAgICAgIlwxXHUwMDg5XDIzXHVmZmZmXDFcdTAwOGEiLAorICAgICAgICAgICAgIlwxXHUwMDhiXDIwXHVmZmZmXDFcdTAwOGMiLAorICAgICAgICAgICAgIlwxXHUwMDhlXDdcdWZmZmZcMVx1MDA4ZFwxM1x1ZmZmZlwxXHUwMDhmIiwKKyAgICAgICAgICAgICJcMVx1MDA5NFwxXHUwMDkyXDVcdWZmZmZcMVx1MDA5MVwyXHVmZmZmXDFcdTAwOTBcNlx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcdTAwOTMiLAorICAgICAgICAgICAgIlwxXHUwMDk1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwOWUiLAorICAgICAgICAgICAgIlwxXHUwMGEwIiwKKyAgICAgICAgICAgICJcMVx1MDBhMSIsCisgICAgICAgICAgICAiXDEyXHUwMGEzXDEwXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwzXHUwMGE1XDVcdWZmZmZcMVx1MDBhNSIrCisgICAgICAgICAgICAiXDEzXHVmZmZmXDFcdTAwYTJcNlx1ZmZmZlwxXHUwMGEzXDJcdWZmZmZcMVx1MDBhNVwxXHVmZmZmXDMiKworICAgICAgICAgICAgIlx1MDBhNVw1XHVmZmZmXDFcdTAwYTVcMTNcdWZmZmZcMVx1MDBhMiIsCisgICAgICAgICAgICAiXDEyXHUwMGEzXDEwXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwzXHUwMGE1XDVcdWZmZmZcMVx1MDBhNSIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwYTNcMlx1ZmZmZlwxXHUwMGE1XDFcdWZmZmZcM1x1MDBhNVw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBhNSIsCisgICAgICAgICAgICAiXDFcMTMxXDM0XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmZcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYTgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYWEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhZVw1XHVmZmZmXDFcdTAwYWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYjAiLAorICAgICAgICAgICAgIlwxXHUwMGIxIiwKKyAgICAgICAgICAgICJcMVx1MDBiMiIsCisgICAgICAgICAgICAiXDFcdTAwYjMiLAorICAgICAgICAgICAgIlwxXHUwMGI0IiwKKyAgICAgICAgICAgICJcMVx1MDBiNSIsCisgICAgICAgICAgICAiXDFcdTAwYjYiLAorICAgICAgICAgICAgIlwxXHUwMGI3IiwKKyAgICAgICAgICAgICJcMVx1MDBiOCIsCisgICAgICAgICAgICAiXDFcdTAwYmFcN1x1ZmZmZlwxXHUwMGI5IiwKKyAgICAgICAgICAgICJcMVx1MDBiYiIsCisgICAgICAgICAgICAiXDFcdTAwYmNcMTVcdWZmZmZcMVx1MDBiZCIsCisgICAgICAgICAgICAiXDFcdTAwYmUiLAorICAgICAgICAgICAgIlwxXHUwMGJmXDFcdTAwYzAiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDBjMlw2XHVmZmZmXDFcdTAwYzMiLAorICAgICAgICAgICAgIlwxXHUwMGM0IiwKKyAgICAgICAgICAgICJcMVx1MDBjNlwxXHVmZmZmXDFcdTAwYzUiLAorICAgICAgICAgICAgIlwxXHUwMGM3IiwKKyAgICAgICAgICAgICJcMVx1MDBjOCIsCisgICAgICAgICAgICAiXDFcdTAwYzkiLAorICAgICAgICAgICAgIlwxXHUwMGNhIiwKKyAgICAgICAgICAgICJcMVx1MDBjYiIsCisgICAgICAgICAgICAiXDFcdTAwY2MiLAorICAgICAgICAgICAgIlwxXHUwMGNlXDFcdTAwY2QiLAorICAgICAgICAgICAgIlwxXHUwMGNmIiwKKyAgICAgICAgICAgICJcMVx1MDBkMCIsCisgICAgICAgICAgICAiXDFcdTAwZDEiLAorICAgICAgICAgICAgIlwxXHUwMGQyIiwKKyAgICAgICAgICAgICJcMVx1MDBkMyIsCisgICAgICAgICAgICAiXDFcdTAwZDQiLAorICAgICAgICAgICAgIlwxXHUwMGQ1IiwKKyAgICAgICAgICAgICJcMVx1MDBkNiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwxNVwxMzFcMVx1MDBkN1wxNFwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMGQ5XDE0XHVmZmZmXDFcdTAwZGEiLAorICAgICAgICAgICAgIlwxXHUwMGRiIiwKKyAgICAgICAgICAgICJcMVx1MDBkYyIsCisgICAgICAgICAgICAiXDFcdTAwZGQiLAorICAgICAgICAgICAgIlwxXHUwMGRlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMGUwIiwKKyAgICAgICAgICAgICJcMVx1MDBlMSIsCisgICAgICAgICAgICAiXDFcdTAwZTIiLAorICAgICAgICAgICAgIlwxXHUwMGUzIiwKKyAgICAgICAgICAgICJcMVx1MDBlNCIsCisgICAgICAgICAgICAiXDFcdTAwZTUiLAorICAgICAgICAgICAgIlwxXHUwMGU2IiwKKyAgICAgICAgICAgICJcMVx1MDBlNyIsCisgICAgICAgICAgICAiXDFcdTAwZTgiLAorICAgICAgICAgICAgIlwxXHUwMGU5IiwKKyAgICAgICAgICAgICJcMVx1MDBlYlw3XHVmZmZmXDFcdTAwZWEiLAorICAgICAgICAgICAgIlwxXHUwMGVjIiwKKyAgICAgICAgICAgICJcMVx1MDBlZlwzXHVmZmZmXDFcdTAwZWRcMTdcdWZmZmZcMVx1MDBmMFwzXHVmZmZmXDFcdTAwZWUiLAorICAgICAgICAgICAgIlwxXHUwMGYyXDdcdWZmZmZcMVx1MDBmMSIsCisgICAgICAgICAgICAiXDFcdTAwZjMiLAorICAgICAgICAgICAgIlwxXHUwMGY0IiwKKyAgICAgICAgICAgICJcMVx1MDBmNSIsCisgICAgICAgICAgICAiXDFcdTAwZjZcMVx1ZmZmZlwxXHUwMGY4XDNcdWZmZmZcMVx1MDBmNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmOSIsCisgICAgICAgICAgICAiXDFcdTAwZmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXHUwMGEzXDEwXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwzXHUwMGE1XDVcdWZmZmZcMVx1MDBhNSIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwYTNcMlx1ZmZmZlwxXHUwMGE1XDFcdWZmZmZcM1x1MDBhNVw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBhNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMGZkIiwKKyAgICAgICAgICAgICJcMVx1MDBmZSIsCisgICAgICAgICAgICAiXDFcdTAwZmYiLAorICAgICAgICAgICAgIlwxXHUwMTAwIiwKKyAgICAgICAgICAgICJcMVx1MDEwMlwyMFx1ZmZmZlwxXHUwMTAxIiwKKyAgICAgICAgICAgICJcMVx1MDEwMyIsCisgICAgICAgICAgICAiXDFcdTAxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTA1IiwKKyAgICAgICAgICAgICJcMVx1MDEwNiIsCisgICAgICAgICAgICAiXDFcdTAxMDciLAorICAgICAgICAgICAgIlwxXHUwMTA4IiwKKyAgICAgICAgICAgICJcMVx1MDEwOSIsCisgICAgICAgICAgICAiXDFcdTAxMGEiLAorICAgICAgICAgICAgIlwxXHUwMTBjXDRcdWZmZmZcMVx1MDEwYiIsCisgICAgICAgICAgICAiXDFcdTAxMGQiLAorICAgICAgICAgICAgIlwxXHUwMTBlXDEyXHVmZmZmXDFcdTAxMGYiLAorICAgICAgICAgICAgIlwxXHUwMTEwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTExIiwKKyAgICAgICAgICAgICJcMVx1MDExMiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTE0IiwKKyAgICAgICAgICAgICJcMVx1MDExNSIsCisgICAgICAgICAgICAiXDFcdTAxMTYiLAorICAgICAgICAgICAgIlwxXHUwMTE3XDZcdWZmZmZcMVx1MDExOCIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTFhIiwKKyAgICAgICAgICAgICJcMVx1MDExYiIsCisgICAgICAgICAgICAiXDFcdTAxMWMiLAorICAgICAgICAgICAgIlwxXHUwMTFlXDFcdWZmZmZcMVx1MDExZCIsCisgICAgICAgICAgICAiXDFcdTAxMWYiLAorICAgICAgICAgICAgIlwxXHUwMTIwIiwKKyAgICAgICAgICAgICJcMVx1MDEyMSIsCisgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVx1MDEyNCIsCisgICAgICAgICAgICAiXDFcdTAxMjUiLAorICAgICAgICAgICAgIlwxXHUwMTI2IiwKKyAgICAgICAgICAgICJcMVx1MDEyOFwzXHVmZmZmXDFcdTAxMjciLAorICAgICAgICAgICAgIlwxXHUwMTI5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTJhIiwKKyAgICAgICAgICAgICJcMVx1MDEyYiIsCisgICAgICAgICAgICAiXDFcdTAxMmMiLAorICAgICAgICAgICAgIlwxXHUwMTJkIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxMmYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMzAiLAorICAgICAgICAgICAgIlwxXHUwMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxMzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTM1IiwKKyAgICAgICAgICAgICJcMVx1MDEzNiIsCisgICAgICAgICAgICAiXDFcdTAxMzciLAorICAgICAgICAgICAgIlwxXHUwMTM4IiwKKyAgICAgICAgICAgICJcMVx1MDEzOSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTNiIiwKKyAgICAgICAgICAgICJcMVx1MDEzY1wxMFx1ZmZmZlwxXHUwMTNkIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxM2YiLAorICAgICAgICAgICAgIlwxXHUwMTQwIiwKKyAgICAgICAgICAgICJcMVx1MDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxNDIiLAorICAgICAgICAgICAgIlwxXHUwMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDE0NCIsCisgICAgICAgICAgICAiXDFcdTAxNDUiLAorICAgICAgICAgICAgIlwxXHUwMTQ2IiwKKyAgICAgICAgICAgICJcMVx1MDE0NyIsCisgICAgICAgICAgICAiXDFcdTAxNDgiLAorICAgICAgICAgICAgIlwxXHUwMTQ5IiwKKyAgICAgICAgICAgICJcMVx1MDE0YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTRiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTRlIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZiIsCisgICAgICAgICAgICAiXDFcdTAxNTAiLAorICAgICAgICAgICAgIlwxXHUwMTUxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxNTMiLAorICAgICAgICAgICAgIlwxXHUwMTU0IiwKKyAgICAgICAgICAgICJcMVx1MDE1NSIsCisgICAgICAgICAgICAiXDFcdTAxNTYiLAorICAgICAgICAgICAgIlwxXHUwMTU3IiwKKyAgICAgICAgICAgICJcMVx1MDE1OCIsCisgICAgICAgICAgICAiXDFcdTAxNTkiLAorICAgICAgICAgICAgIlwxXHUwMTVhIiwKKyAgICAgICAgICAgICJcMVx1MDE1YiIsCisgICAgICAgICAgICAiXDFcdTAxNWMiLAorICAgICAgICAgICAgIlwxXHUwMTVkIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZSIsCisgICAgICAgICAgICAiXDFcdTAxNWYiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTYxIiwKKyAgICAgICAgICAgICJcMVx1MDE2MlwxMlx1ZmZmZlwxXHUwMTYzIiwKKyAgICAgICAgICAgICJcMVx1MDE2NCIsCisgICAgICAgICAgICAiXDFcdTAxNjUiLAorICAgICAgICAgICAgIlwxXHUwMTY2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxNjkiLAorICAgICAgICAgICAgIlwxXHUwMTZhIiwKKyAgICAgICAgICAgICJcMVx1MDE2YiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTZkIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZSIsCisgICAgICAgICAgICAiXDFcdTAxNmYiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMVx1MDE3MFwzMVwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTcyIiwKKyAgICAgICAgICAgICJcMVx1MDE3MyIsCisgICAgICAgICAgICAiXDFcdTAxNzQiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDE3NiIsCisgICAgICAgICAgICAiXDFcdTAxNzciLAorICAgICAgICAgICAgIlwxXHUwMTc4IiwKKyAgICAgICAgICAgICJcMVx1MDE3OSIsCisgICAgICAgICAgICAiXDFcdTAxN2EiLAorICAgICAgICAgICAgIlwxXHUwMTdiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTdjIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxN2UiLAorICAgICAgICAgICAgIlwxXHUwMTdmIiwKKyAgICAgICAgICAgICJcMVx1MDE4MCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4MSIsCisgICAgICAgICAgICAiXDFcdTAxODIiLAorICAgICAgICAgICAgIlwxXHUwMTgzIiwKKyAgICAgICAgICAgICJcMVx1MDE4NCIsCisgICAgICAgICAgICAiXDFcdTAxODUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxODYiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDE4OCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4OSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMThiIiwKKyAgICAgICAgICAgICJcMVx1MDE4YyIsCisgICAgICAgICAgICAiXDFcdTAxOGQiLAorICAgICAgICAgICAgIlwxXHUwMThlIiwKKyAgICAgICAgICAgICJcMVx1MDE4ZiIsCisgICAgICAgICAgICAiXDFcdTAxOTAiLAorICAgICAgICAgICAgIlwxXHUwMTkxIiwKKyAgICAgICAgICAgICJcMVx1MDE5MiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTk0IiwKKyAgICAgICAgICAgICJcMVx1MDE5NVwxNlx1ZmZmZlwxXHUwMTk2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTk4IiwKKyAgICAgICAgICAgICJcMVx1MDE5OSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEwXHVmZmZmXDFcdTAxOWJcMlx1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTMxXDFcdWZmZmZcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZCIsCisgICAgICAgICAgICAiXDFcdTAxOWUiLAorICAgICAgICAgICAgIlwxXHUwMTlmIiwKKyAgICAgICAgICAgICJcMVx1MDFhMCIsCisgICAgICAgICAgICAiXDFcdTAxYTEiLAorICAgICAgICAgICAgIlwxXHUwMWEyIiwKKyAgICAgICAgICAgICJcMVx1MDFhMyIsCisgICAgICAgICAgICAiXDFcdTAxYTQiLAorICAgICAgICAgICAgIlwxXHUwMWE1IiwKKyAgICAgICAgICAgICJcMVx1MDFhNiIsCisgICAgICAgICAgICAiXDFcdTAxYTciLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWE5IiwKKyAgICAgICAgICAgICJcMVx1MDFhYSIsCisgICAgICAgICAgICAiXDFcdTAxYWIiLAorICAgICAgICAgICAgIlwxXHUwMWFjIiwKKyAgICAgICAgICAgICJcMVx1MDFhZCIsCisgICAgICAgICAgICAiXDFcMTMxXDEwXHVmZmZmXDFcdTAxYWVcMlx1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTMxXDFcdWZmZmZcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMWIxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxYjQiLAorICAgICAgICAgICAgIlwxXHUwMWI1IiwKKyAgICAgICAgICAgICJcMVx1MDFiNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFiNyIsCisgICAgICAgICAgICAiXDFcdTAxYjgiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWJhIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxYmMiLAorICAgICAgICAgICAgIlwxXHUwMWJkIiwKKyAgICAgICAgICAgICJcMVx1MDFiZSIsCisgICAgICAgICAgICAiXDFcdTAxYmYiLAorICAgICAgICAgICAgIlwxXHUwMWMwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWMxIiwKKyAgICAgICAgICAgICJcMVx1MDFjMiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMWM0IiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxYzYiLAorICAgICAgICAgICAgIlwxXHUwMWM3IiwKKyAgICAgICAgICAgICJcMVx1MDFjOCIsCisgICAgICAgICAgICAiXDFcdTAxYzkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxY2EiLAorICAgICAgICAgICAgIlwxXHUwMWNiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWNjIiwKKyAgICAgICAgICAgICJcMVx1MDFjZCIsCisgICAgICAgICAgICAiXDFcdTAxY2UiLAorICAgICAgICAgICAgIlwxXHUwMWNmIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxZDEiLAorICAgICAgICAgICAgIlwxXHUwMWQyIiwKKyAgICAgICAgICAgICJcMVx1MDFkMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFkNCIsCisgICAgICAgICAgICAiXDFcdTAxZDUiLAorICAgICAgICAgICAgIlwxXHUwMWQ2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDFkOCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFkOVwyMVx1ZmZmZlwxXHUwMWRhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWRiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxZGQiLAorICAgICAgICAgICAgIlwxXHUwMWRlIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxZTAiLAorICAgICAgICAgICAgIlwxXHUwMWUxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEwXHVmZmZmXDFcdTAxZTNcMlx1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcMTMxXDFcdWZmZmZcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDFlNSIsCisgICAgICAgICAgICAiXDFcdTAxZTYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZTciLAorICAgICAgICAgICAgIlwxXHUwMWU4IiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxZWEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDFlY1wyMVx1ZmZmZlwxXHUwMWVkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZWUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxZjAiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDFmMiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZjQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZjUiLAorICAgICAgICAgICAgIlwxXHUwMWY2IiwKKyAgICAgICAgICAgICJcMVx1MDFmNyIsCisgICAgICAgICAgICAiXDFcdTAxZjgiLAorICAgICAgICAgICAgIlwxXHUwMWY5IiwKKyAgICAgICAgICAgICJcMVx1MDFmYSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZmQiLAorICAgICAgICAgICAgIlwxXHUwMWZlIiwKKyAgICAgICAgICAgICJcMVx1MDFmZiIsCisgICAgICAgICAgICAiXDFcdTAyMDAiLAorICAgICAgICAgICAgIlwxXHUwMjAxIiwKKyAgICAgICAgICAgICJcMVx1MDIwMiIsCisgICAgICAgICAgICAiXDFcdTAyMDMiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIwNSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMDciLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAyMGEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIwYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjBlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIxMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIxMSIsCisgICAgICAgICAgICAiXDFcdTAyMTIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjEzIiwKKyAgICAgICAgICAgICJcMVx1MDIxNCIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXHUwMjE2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxMFx1ZmZmZlwxXHUwMjE3XDJcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmYiKworICAgICAgICAgICAgIlwxXDEzMVwxXHVmZmZmXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMWEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMWIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMWMiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIxZSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAyMjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIyMyIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIyNiIsCisgICAgICAgICAgICAiXDFcdTAyMjciLAorICAgICAgICAgICAgIlwxXHUwMjI4IiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIyYSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjJjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjJkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjJlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjJmIiwKKyAgICAgICAgICAgICJcMVx1MDIzMCIsCisgICAgICAgICAgICAiXDFcdTAyMzEiLAorICAgICAgICAgICAgIlwxXHUwMjMyIiwKKyAgICAgICAgICAgICJcMVx1MDIzMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVx1MDIzNiIsCisgICAgICAgICAgICAiXDFcdTAyMzciLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjM5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIzYyIsCisgICAgICAgICAgICAiXDFcdTAyM2QiLAorICAgICAgICAgICAgIlwxXHUwMjNlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjNmIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAyNDIiLAorICAgICAgICAgICAgIlwxXHUwMjQzIiwKKyAgICAgICAgICAgICJcMVx1MDI0NCIsCisgICAgICAgICAgICAiXDFcdTAyNDUiLAorICAgICAgICAgICAgIlwxXHUwMjQ2IiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjQ4IiwKKyAgICAgICAgICAgICJcMVx1MDI0OSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI0YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjRiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcdTAyNGQiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyNGYiLAorICAgICAgICAgICAgIlwxXHUwMjUwIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjU0IiwKKyAgICAgICAgICAgICJcMVx1MDI1NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI1NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI1OCIsCisgICAgICAgICAgICAiXDFcdTAyNTkiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMzFcMTNcdWZmZmZcMTJcMTMxXDdcdWZmZmZcMzJcMTMxXDRcdWZmZmZcMVwxMzFcMVx1ZmZmZiIrCisgICAgICAgICAgICAiXDMyXDEzMSIsCisgICAgICAgICAgICAiXDFcMTMxXDEzXHVmZmZmXDEyXDEzMVw3XHVmZmZmXDMyXDEzMVw0XHVmZmZmXDFcMTMxXDFcdWZmZmYiKworICAgICAgICAgICAgIlwzMlwxMzEiLAorICAgICAgICAgICAgIlwxXDEzMVwxM1x1ZmZmZlwxMlwxMzFcN1x1ZmZmZlwzMlwxMzFcNFx1ZmZmZlwxXDEzMVwxXHVmZmZmIisKKyAgICAgICAgICAgICJcMzJcMTMxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxX21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIxX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTIxX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMjFfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjFfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIxIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyMTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMjFfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTIxX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMjFfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEyMV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjFfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIxOjE6IFRva2VucyA6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgVF9fMTEwIHwgVF9fMTExIHwgVF9fMTEyIHwgVF9fMTEzIHwgVF9fMTE0IHwgVF9fMTE1IHwgVF9fMTE2IHwgVF9fMTE3IHwgVF9fMTE4IHwgVF9fMTE5IHwgVF9fMTIwIHwgVF9fMTIxIHwgVF9fMTIyIHwgVF9fMTIzIHwgVF9fMTI0IHwgVF9fMTI1IHwgVF9fMTI2IHwgVF9fMTI3IHwgVF9fMTI4IHwgVF9fMTI5IHwgVF9fMTMwIHwgVF9fMTMxIHwgVF9fMTMyIHwgVF9fMTMzIHwgVF9fMTM0IHwgVF9fMTM1IHwgVF9fMTM2IHwgVF9fMTM3IHwgVF9fMTM4IHwgVF9fMTM5IHwgVF9fMTQwIHwgVF9fMTQxIHwgVF9fMTQyIHwgVF9fMTQzIHwgVF9fMTQ0IHwgVF9fMTQ1IHwgVF9fMTQ2IHwgVF9fMTQ3IHwgVF9fMTQ4IHwgVF9fMTQ5IHwgVF9fMTUwIHwgVF9fMTUxIHwgVF9fMTUyIHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApOyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgSW50U3RyZWFtIGlucHV0ID0gX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTIxXzA9PSc9JykgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3wnKSApIHtzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJicpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScrJykgKSB7cyA9IDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09Jy0nKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKicpICkge3MgPSA2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScvJykgKSB7cyA9IDc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyUnKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIScpICkge3MgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc+JykgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc8JykgKSB7cyA9IDExO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScuJykgKSB7cyA9IDEyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc/JykgKSB7cyA9IDEzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd2JykgKSB7cyA9IDE0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdlJykgKSB7cyA9IDE1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdzJykgKSB7cyA9IDE2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdpJykgKSB7cyA9IDE3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdmJykgKSB7cyA9IDE4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdvJykgKSB7cyA9IDE5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSduJykgKSB7cyA9IDIwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd3JykgKSB7cyA9IDIxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdjJykgKSB7cyA9IDIyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdsJykgKSB7cyA9IDIzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdkJykgKSB7cyA9IDI0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdwJykgKSB7cyA9IDI1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd7JykgKSB7cyA9IDI2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd9JykgKSB7cyA9IDI3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdhJykgKSB7cyA9IDI4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd1JykgKSB7cyA9IDI5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdiJykgKSB7cyA9IDMwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdnJykgKSB7cyA9IDMxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdtJykgKSB7cyA9IDMyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd0JykgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdyJykgKSB7cyA9IDM0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdAJykgKSB7cyA9IDM1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScoJykgKSB7cyA9IDM2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScpJykgKSB7cyA9IDM3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScsJykgKSB7cyA9IDM4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSddJykgKSB7cyA9IDM5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScjJykgKSB7cyA9IDQwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdbJykgKSB7cyA9IDQxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc7JykgKSB7cyA9IDQyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc6JykgKSB7cyA9IDQzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd6JykgKSB7cyA9IDQ0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdoJykgKSB7cyA9IDQ1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScwJykgKSB7cyA9IDQ2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nMScgJiYgTEEyMV8wPD0nOScpKSApIHtzID0gNDc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J14nKSApIHtzID0gNDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyQnfHwoTEEyMV8wPj0nQScgJiYgTEEyMV8wPD0nWicpfHxMQTIxXzA9PSdfJ3x8KExBMjFfMD49J2onICYmIExBMjFfMDw9J2snKXx8TEEyMV8wPT0ncSd8fChMQTIxXzA+PSd4JyAmJiBMQTIxXzA8PSd5JykpICkge3MgPSA0OTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCInKSApIHtzID0gNTA7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wnJykgKSB7cyA9IDUxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHQnICYmIExBMjFfMDw9J1xuJyl8fExBMjFfMD09J1xyJ3x8TEEyMV8wPT0nICcpICkge3MgPSA1Mjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x1MDAwMCcgJiYgTEEyMV8wPD0nXGInKXx8KExBMjFfMD49J1x1MDAwQicgJiYgTEEyMV8wPD0nXGYnKXx8KExBMjFfMD49J1x1MDAwRScgJiYgTEEyMV8wPD0nXHUwMDFGJyl8fExBMjFfMD09J1xcJ3x8TEEyMV8wPT0nYCd8fChMQTIxXzA+PSd+JyAmJiBMQTIxXzA8PSdcdUZGRkYnKSkgKSB7cyA9IDUzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzPj0wICkgcmV0dXJuIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbihnZXREZXNjcmlwdGlvbigpLCAyMSwgX3MsIGlucHV0KTsKKyAgICAgICAgICAgIGVycm9yKG52YWUpOworICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgfQorICAgIH0KKyAKKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0xQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODA2Yzg0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxMDAxNCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5ERkE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJ2aWNlcy5DaGFydERTTEdyYW1tYXJBY2Nlc3M7CisKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxDaGFydERTTFBhcnNlciBleHRlbmRzIEFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICInPSciLCAiJ3x8JyIsICInJiYnIiwgIicrPSciLCAiJy09JyIsICInKj0nIiwgIicvPSciLCAiJyU9JyIsICInPT0nIiwgIichPSciLCAiJz09PSciLCAiJyE9PSciLCAiJz49JyIsICInPiciLCAiJzwnIiwgIictPiciLCAiJy4uPCciLCAiJy4uJyIsICInPT4nIiwgIic8PiciLCAiJz86JyIsICInKyciLCAiJy0nIiwgIicqJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIicrKyciLCAiJy0tJyIsICInLiciLCAiJ3ZhbCciLCAiJ2V4dGVuZHMnIiwgIidzdGF0aWMnIiwgIidpbXBvcnQnIiwgIidleHRlbnNpb24nIiwgIidzdXBlciciLCAiJ2ZhbHNlJyIsICInaW5zaWRlJyIsICInaW5zaWRlLWdyaWQnIiwgIidvdXRzaWRlJyIsICInb3V0c2lkZS1ncmlkJyIsICInbm9ybWFsJyIsICInc2xvdyciLCAiJ2Zhc3QnIiwgIidub3J0aCciLCAiJ25vcnRoLWVhc3QnIiwgIidlYXN0JyIsICInc291dGgtZWFzdCciLCAiJ3NvdXRoJyIsICInc291dGgtd2VzdCciLCAiJ3dlc3QnIiwgIidub3J0aC13ZXN0JyIsICInY2F0ZWdvcnknIiwgIidsaW5lYXInIiwgIidkYXRlJyIsICInbG9nYXJpdGhtaWMnIiwgIidweXJhbWlkJyIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInY2hhcnQnIiwgIidhcyciLCAiJ3VzaW5nJyIsICInYmFyJyIsICInbGluZSciLCAiJ3BpZSciLCAiJ2RvbnV0JyIsICInYnViYmxlJyIsICInZ2F1Z2UnIiwgIidtaW5pbXVtJyIsICInbWF4aW11bSciLCAiJ3RyZWUnIiwgIid1cCB0byciLCAiJ2RhdGFtYXJ0JyIsICInbGVnZW5kJyIsICIndG9vbHRpcCciLCAiJ2F4aXMnIiwgIidyZW5kZXJzJyIsICIndGlja2FuZ2xlJyIsICInc2VnbWVudGNvbG9yJyIsICInQCciLCAiJygnIiwgIicpJyIsICInLCciLCAiJ10nIiwgIicjJyIsICInWyciLCAiJ2luc3RhbmNlb2YnIiwgIic7JyIsICInaWYnIiwgIidlbHNlJyIsICInc3dpdGNoJyIsICInOiciLCAiJ2RlZmF1bHQnIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ25ldyciLCAiJ251bGwnIiwgIid0eXBlb2YnIiwgIid0aHJvdyciLCAiJ3JldHVybiciLCAiJ3RyeSciLCAiJ2ZpbmFsbHknIiwgIidzeW5jaHJvbml6ZWQnIiwgIidjYXRjaCciLCAiJz8nIiwgIicmJyIsICInZGVzY3JpYmVkIGJ5JyIsICIncG9sbGluZyciLCAiJ3NoYWRlZCciLCAiJ2FuaW1hdGVkJyIsICInc3dhcHBlZCciLCAiJ3N0YWNrZWQnIiwgIidzaG93TWFya2VyJyIsICIndHJlbmRMaW5lJyIsICInY3Vyc29yJyIsICInem9vbSciLCAiJ2ZpbGxaZXJvJyIsICInZmlsbGVkJyIsICInZW1wdHknIiwgIidtdWx0aXBsaWVyJyIsICInZ3JhZGllbnQnIiwgIid0cmFuc3BhcmVudCciLCAiJ2xhYmVsJyIsICInaGFzVGlja3MnIiwgIidpbnRlcnZhbHMnIiwgIidtYXAnIiwgIidjb2xsYXBzaWJsZSciLCAiJ3RvZ2dsZSciLCAiJ3JlcGxvdCciLCAiJ2Fsd2F5cyciLCAiJ3Nob3J0TGFiZWwnIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJ3ZhciciLCAiJ3RydWUnIgorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ0PTE0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDM9MTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nj0xNDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDU9MTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0MD0xNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQyPTE0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDE9MTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU5PTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU1PTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU2PTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU3PTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU4PTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUxPTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNz0xMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM2PTEzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzk9MTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU0PTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzOD0xMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMzPTEzMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzI9MTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYwPTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNT0xMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM0PTEzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMxPTEzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzA9MTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI5PTEyOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjY9MTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYzPTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNT0xMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMzPTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM0PTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM1PTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM2PTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMwPTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MT0xNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUwPTE1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTI9MTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ4PTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ5PTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ0PTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ1PTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ2PTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ3PTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQwPTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0OD0xNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ3PTE0NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDk9MTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkxPTkxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMD0xMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTI9OTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTM9OTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAyPTEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185ND05NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDE9MTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkwPTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5PTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1PTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2PTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3PTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4PTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk5PTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0PTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk1PTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk2PTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk3PTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk4PTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfREVDSU1BTD04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI3PTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI4PTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI5PTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMj0xMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIxPTEyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjQ9MTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcyPTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMz0xMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIwPTEyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTk9MTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc4PTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExOD0xMTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE1PTExNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTc9MTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNj0xMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODA9ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTExPTExMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MT04MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTA9MTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMz0xMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODM9ODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEyPTExMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1dTPTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQU5ZX09USEVSPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg4PTg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOD0xMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODk9ODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA3PTEwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDk9MTA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg0PTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwND0xMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODU9ODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAzPTEwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nj04NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDY9MTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg3PTg3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNT0xMDU7CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICAvLyBkZWxlZ2F0b3JzCisKKworICAgICAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbENoYXJ0RFNMUGFyc2VyLnRva2VuTmFtZXM7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZyI7IH0KKworCisgICAgIAorICAgICAJcHJpdmF0ZSBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAgICAgCQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyQWNjZXNzKENoYXJ0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisgICAgICAgIAl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKyAgICAgICAgCXJldHVybiBncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVGb3JUb2tlbk5hbWUoU3RyaW5nIHRva2VuTmFtZSkgeworICAgICAgICAJcmV0dXJuIHRva2VuTmFtZTsKKyAgICAgICAgfQorCisKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydE1vZGVsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYxOjE6IGVudHJ5UnVsZUNoYXJ0TW9kZWwgOiBydWxlQ2hhcnRNb2RlbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0TW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI6MTogKCBydWxlQ2hhcnRNb2RlbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM6MTogcnVsZUNoYXJ0TW9kZWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydE1vZGVsX2luX2VudHJ5UnVsZUNoYXJ0TW9kZWw2Nyk7CisgICAgICAgICAgICBydWxlQ2hhcnRNb2RlbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0TW9kZWw3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRNb2RlbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRNb2RlbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MDoxOiBydWxlQ2hhcnRNb2RlbCA6ICggKCBydWxlX19DaGFydE1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQgKSogKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0TW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzQ6MjogKCAoICggcnVsZV9fQ2hhcnRNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50ICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzU6MTogKCAoIHJ1bGVfX0NoYXJ0TW9kZWxfX1BhY2thZ2VzQXNzaWdubWVudCApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NToxOiAoICggcnVsZV9fQ2hhcnRNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50ICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc2OjE6ICggcnVsZV9fQ2hhcnRNb2RlbF9fUGFja2FnZXNBc3NpZ25tZW50ICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzc6MTogKCBydWxlX19DaGFydE1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQgKSoKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMD09NzEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NzoyOiBydWxlX19DaGFydE1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydE1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnRfaW5fcnVsZUNoYXJ0TW9kZWwxMDApOworICAgICAgICAgICAgCSAgICBydWxlX19DaGFydE1vZGVsX19QYWNrYWdlc0Fzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0Fzc2lnbm1lbnQoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydE1vZGVsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0UGFja2FnZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OToxOiBlbnRyeVJ1bGVDaGFydFBhY2thZ2UgOiBydWxlQ2hhcnRQYWNrYWdlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRQYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwOjE6ICggcnVsZUNoYXJ0UGFja2FnZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTE6MTogcnVsZUNoYXJ0UGFja2FnZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRQYWNrYWdlX2luX2VudHJ5UnVsZUNoYXJ0UGFja2FnZTEyOCk7CisgICAgICAgICAgICBydWxlQ2hhcnRQYWNrYWdlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydFBhY2thZ2UxMzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0UGFja2FnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRQYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk4OjE6IHJ1bGVDaGFydFBhY2thZ2UgOiAoICggcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydFBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAyOjI6ICggKCAoIHJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMzoxOiAoICggcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMzoxOiAoICggcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNDoxOiAoIHJ1bGVfX0NoYXJ0UGFja2FnZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDU6MTogKCBydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNToyOiBydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydFBhY2thZ2VfX0dyb3VwX18wX2luX3J1bGVDaGFydFBhY2thZ2UxNjEpOworICAgICAgICAgICAgcnVsZV9fQ2hhcnRQYWNrYWdlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0UGFja2FnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc6MTogZW50cnlSdWxlQ2hhcnQgOiBydWxlQ2hhcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTg6MTogKCBydWxlQ2hhcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExOToxOiBydWxlQ2hhcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRfaW5fZW50cnlSdWxlQ2hhcnQxODgpOworICAgICAgICAgICAgcnVsZUNoYXJ0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0MTk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI2OjE6IHJ1bGVDaGFydCA6ICggKCBydWxlX19DaGFydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMwOjI6ICggKCAoIHJ1bGVfX0NoYXJ0X19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxOjE6ICggKCBydWxlX19DaGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzE6MTogKCAoIHJ1bGVfX0NoYXJ0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMjoxOiAoIHJ1bGVfX0NoYXJ0X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMzOjE6ICggcnVsZV9fQ2hhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMzoyOiBydWxlX19DaGFydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0X19Hcm91cF9fMF9pbl9ydWxlQ2hhcnQyMjEpOworICAgICAgICAgICAgcnVsZV9fQ2hhcnRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydE9wdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDU6MTogZW50cnlSdWxlQ2hhcnRPcHRpb24gOiBydWxlQ2hhcnRPcHRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydE9wdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY6MTogKCBydWxlQ2hhcnRPcHRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NzoxOiBydWxlQ2hhcnRPcHRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRPcHRpb25faW5fZW50cnlSdWxlQ2hhcnRPcHRpb24yNDgpOworICAgICAgICAgICAgcnVsZUNoYXJ0T3B0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0T3B0aW9uMjU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydE9wdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRPcHRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU0OjE6IHJ1bGVDaGFydE9wdGlvbiA6ICggKCBydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0T3B0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1ODoyOiAoICggKCBydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTk6MTogKCAoIHJ1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTk6MTogKCAoIHJ1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjA6MTogKCBydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYxOjE6ICggcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjE6MjogcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlc19pbl9ydWxlQ2hhcnRPcHRpb24yODEpOworICAgICAgICAgICAgcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0T3B0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0QmFyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MzoxOiBlbnRyeVJ1bGVDaGFydEJhciA6IHJ1bGVDaGFydEJhciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0QmFyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NDoxOiAoIHJ1bGVDaGFydEJhciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc1OjE6IHJ1bGVDaGFydEJhciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydEJhcl9pbl9lbnRyeVJ1bGVDaGFydEJhcjMwOCk7CisgICAgICAgICAgICBydWxlQ2hhcnRCYXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRCYXIzMTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0QmFyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEJhciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODI6MTogcnVsZUNoYXJ0QmFyIDogKCAoIHJ1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydEJhcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODY6MjogKCAoICggcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODc6MTogKCAoIHJ1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NzoxOiAoICggcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg4OjE6ICggcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODk6MTogKCBydWxlX19DaGFydEJhcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg5OjI6IHJ1bGVfX0NoYXJ0QmFyX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRCYXJfX0dyb3VwX18wX2luX3J1bGVDaGFydEJhcjM0MSk7CisgICAgICAgICAgICBydWxlX19DaGFydEJhcl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0QmFyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0TGluZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDE6MTogZW50cnlSdWxlQ2hhcnRMaW5lIDogcnVsZUNoYXJ0TGluZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0TGluZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDI6MTogKCBydWxlQ2hhcnRMaW5lIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDM6MTogcnVsZUNoYXJ0TGluZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRMaW5lX2luX2VudHJ5UnVsZUNoYXJ0TGluZTM2OCk7CisgICAgICAgICAgICBydWxlQ2hhcnRMaW5lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydExpbmUzNzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0TGluZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRMaW5lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMDoxOiBydWxlQ2hhcnRMaW5lIDogKCAoIHJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRMaW5lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNDoyOiAoICggKCBydWxlX19DaGFydExpbmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTU6MTogKCAoIHJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTU6MTogKCAoIHJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTY6MTogKCBydWxlX19DaGFydExpbmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE3OjE6ICggcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTc6MjogcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRMaW5lX19Hcm91cF9fMF9pbl9ydWxlQ2hhcnRMaW5lNDAxKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0TGluZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydExpbmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRQaWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI5OjE6IGVudHJ5UnVsZUNoYXJ0UGllIDogcnVsZUNoYXJ0UGllIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRQaWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMwOjE6ICggcnVsZUNoYXJ0UGllIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzE6MTogcnVsZUNoYXJ0UGllIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0UGllX2luX2VudHJ5UnVsZUNoYXJ0UGllNDI4KTsKKyAgICAgICAgICAgIHJ1bGVDaGFydFBpZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydFBpZTQzNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRQaWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0UGllIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzODoxOiBydWxlQ2hhcnRQaWUgOiAoICggcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0UGllKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MjoyOiAoICggKCBydWxlX19DaGFydFBpZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MzoxOiAoICggcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQzOjE6ICggKCBydWxlX19DaGFydFBpZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDQ6MTogKCBydWxlX19DaGFydFBpZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NToxOiAoIHJ1bGVfX0NoYXJ0UGllX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDU6MjogcnVsZV9fQ2hhcnRQaWVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydFBpZV9fR3JvdXBfXzBfaW5fcnVsZUNoYXJ0UGllNDYxKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0UGllX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRQaWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnREb251dCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTc6MTogZW50cnlSdWxlQ2hhcnREb251dCA6IHJ1bGVDaGFydERvbnV0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnREb251dCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTg6MTogKCBydWxlQ2hhcnREb251dCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU5OjE6IHJ1bGVDaGFydERvbnV0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnREb251dF9pbl9lbnRyeVJ1bGVDaGFydERvbnV0NDg4KTsKKyAgICAgICAgICAgIHJ1bGVDaGFydERvbnV0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnREb251dDQ5NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnREb251dCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnREb251dCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjY6MTogcnVsZUNoYXJ0RG9udXQgOiAoICggcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnREb251dCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzA6MjogKCAoICggcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MToxOiAoICggcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzE6MTogKCAoIHJ1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjcyOjE6ICggcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjczOjE6ICggcnVsZV9fQ2hhcnREb251dF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjczOjI6IHJ1bGVfX0NoYXJ0RG9udXRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydERvbnV0X19Hcm91cF9fMF9pbl9ydWxlQ2hhcnREb251dDUyMSk7CisgICAgICAgICAgICBydWxlX19DaGFydERvbnV0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydERvbnV0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0QnViYmxlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4NToxOiBlbnRyeVJ1bGVDaGFydEJ1YmJsZSA6IHJ1bGVDaGFydEJ1YmJsZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0QnViYmxlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4NjoxOiAoIHJ1bGVDaGFydEJ1YmJsZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg3OjE6IHJ1bGVDaGFydEJ1YmJsZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydEJ1YmJsZV9pbl9lbnRyeVJ1bGVDaGFydEJ1YmJsZTU0OCk7CisgICAgICAgICAgICBydWxlQ2hhcnRCdWJibGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRCdWJibGU1NTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0QnViYmxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEJ1YmJsZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTQ6MTogcnVsZUNoYXJ0QnViYmxlIDogKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydEJ1YmJsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTg6MjogKCAoICggcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTk6MTogKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5OToxOiAoICggcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAwOjE6ICggcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDE6MTogKCBydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAxOjI6IHJ1bGVfX0NoYXJ0QnViYmxlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRCdWJibGVfX0dyb3VwX18wX2luX3J1bGVDaGFydEJ1YmJsZTU4MSk7CisgICAgICAgICAgICBydWxlX19DaGFydEJ1YmJsZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0QnViYmxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0R2F1Z2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEzOjE6IGVudHJ5UnVsZUNoYXJ0R2F1Z2UgOiBydWxlQ2hhcnRHYXVnZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0R2F1Z2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0OjE6ICggcnVsZUNoYXJ0R2F1Z2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNToxOiBydWxlQ2hhcnRHYXVnZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0R2F1Z2VfaW5fZW50cnlSdWxlQ2hhcnRHYXVnZTYwOCk7CisgICAgICAgICAgICBydWxlQ2hhcnRHYXVnZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0R2F1Z2U2MTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0R2F1Z2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0R2F1Z2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIyOjE6IHJ1bGVDaGFydEdhdWdlIDogKCAoIHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0R2F1Z2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI2OjI6ICggKCAoIHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjc6MTogKCAoIHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI3OjE6ICggKCBydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyODoxOiAoIHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyOToxOiAoIHJ1bGVfX0NoYXJ0R2F1Z2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyOToyOiBydWxlX19DaGFydEdhdWdlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfXzBfaW5fcnVsZUNoYXJ0R2F1Z2U2NDEpOworICAgICAgICAgICAgcnVsZV9fQ2hhcnRHYXVnZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRHYXVnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFRyZWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQxOjE6IGVudHJ5UnVsZUNoYXJ0VHJlZSA6IHJ1bGVDaGFydFRyZWUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydFRyZWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQyOjE6ICggcnVsZUNoYXJ0VHJlZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQzOjE6IHJ1bGVDaGFydFRyZWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0VHJlZV9pbl9lbnRyeVJ1bGVDaGFydFRyZWU2NjgpOworICAgICAgICAgICAgcnVsZUNoYXJ0VHJlZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRUcmVlNjc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFRyZWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0VHJlZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNTA6MTogcnVsZUNoYXJ0VHJlZSA6ICggKCBydWxlX19DaGFydFRyZWVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0VHJlZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNTQ6MjogKCAoICggcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU1OjE6ICggKCBydWxlX19DaGFydFRyZWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU1OjE6ICggKCBydWxlX19DaGFydFRyZWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU2OjE6ICggcnVsZV9fQ2hhcnRUcmVlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM1NzoxOiAoIHJ1bGVfX0NoYXJ0VHJlZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU3OjI6IHJ1bGVfX0NoYXJ0VHJlZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0VHJlZV9fR3JvdXBfXzBfaW5fcnVsZUNoYXJ0VHJlZTcwMSk7CisgICAgICAgICAgICBydWxlX19DaGFydFRyZWVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRUcmVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzY5OjE6IGVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwgOiBydWxlQ2hhcnRJbnRlcnZhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzcwOjE6ICggcnVsZUNoYXJ0SW50ZXJ2YWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM3MToxOiBydWxlQ2hhcnRJbnRlcnZhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbnRlcnZhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SW50ZXJ2YWxfaW5fZW50cnlSdWxlQ2hhcnRJbnRlcnZhbDcyOCk7CisgICAgICAgICAgICBydWxlQ2hhcnRJbnRlcnZhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SW50ZXJ2YWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0SW50ZXJ2YWw3MzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0SW50ZXJ2YWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzc4OjE6IHJ1bGVDaGFydEludGVydmFsIDogKCBydWxlQ2hhcnROdW1iZXJJbnRlcnZhbCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRJbnRlcnZhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozODI6MjogKCAoIHJ1bGVDaGFydE51bWJlckludGVydmFsICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzgzOjE6ICggcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzgzOjE6ICggcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzg0OjE6IHJ1bGVDaGFydE51bWJlckludGVydmFsCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW50ZXJ2YWxBY2Nlc3MoKS5nZXRDaGFydE51bWJlckludGVydmFsUGFyc2VyUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWxfaW5fcnVsZUNoYXJ0SW50ZXJ2YWw3NjEpOworICAgICAgICAgICAgcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRJbnRlcnZhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM5NzoxOiBlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsIDogcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM5ODoxOiAoIHJ1bGVDaGFydE51bWJlckludGVydmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozOTk6MTogcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydE51bWJlckludGVydmFsX2luX2VudHJ5UnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWw3ODcpOworICAgICAgICAgICAgcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsNzk0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydE51bWJlckludGVydmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQwNjoxOiBydWxlQ2hhcnROdW1iZXJJbnRlcnZhbCA6ICggKCBydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydE51bWJlckludGVydmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQxMDoyOiAoICggKCBydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDExOjE6ICggKCBydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQxMToxOiAoICggcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTI6MTogKCBydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTM6MTogKCBydWxlX19DaGFydE51bWJlckludGVydmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTM6MjogcnVsZV9fQ2hhcnROdW1iZXJJbnRlcnZhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18wX2luX3J1bGVDaGFydE51bWJlckludGVydmFsODIwKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0TnVtYmVySW50ZXJ2YWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnREYXRhbWFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MjU6MTogZW50cnlSdWxlQ2hhcnREYXRhbWFydCA6IHJ1bGVDaGFydERhdGFtYXJ0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnREYXRhbWFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MjY6MTogKCBydWxlQ2hhcnREYXRhbWFydCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDI3OjE6IHJ1bGVDaGFydERhdGFtYXJ0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnREYXRhbWFydF9pbl9lbnRyeVJ1bGVDaGFydERhdGFtYXJ0ODQ3KTsKKyAgICAgICAgICAgIHJ1bGVDaGFydERhdGFtYXJ0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnREYXRhbWFydDg1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnREYXRhbWFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnREYXRhbWFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MzQ6MTogcnVsZUNoYXJ0RGF0YW1hcnQgOiAoICggcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnREYXRhbWFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Mzg6MjogKCAoICggcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQzOToxOiAoICggcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Mzk6MTogKCAoIHJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDQwOjE6ICggcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDQxOjE6ICggcnVsZV9fQ2hhcnREYXRhbWFydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDQxOjI6IHJ1bGVfX0NoYXJ0RGF0YW1hcnRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMF9pbl9ydWxlQ2hhcnREYXRhbWFydDg4MCk7CisgICAgICAgICAgICBydWxlX19DaGFydERhdGFtYXJ0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydERhdGFtYXJ0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0RWxlbWVudCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTM6MTogZW50cnlSdWxlQ2hhcnRFbGVtZW50IDogcnVsZUNoYXJ0RWxlbWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0RWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTQ6MTogKCBydWxlQ2hhcnRFbGVtZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTU6MTogcnVsZUNoYXJ0RWxlbWVudCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRFbGVtZW50X2luX2VudHJ5UnVsZUNoYXJ0RWxlbWVudDkwNyk7CisgICAgICAgICAgICBydWxlQ2hhcnRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydEVsZW1lbnQ5MTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0RWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2MjoxOiBydWxlQ2hhcnRFbGVtZW50IDogKCAoIHJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUNoYXJ0RWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NjY6MjogKCAoICggcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2NzoxOiAoICggcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Njc6MTogKCAoIHJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDY4OjE6ICggcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDY5OjE6ICggcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDY5OjI6IHJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydEVsZW1lbnRfX0FsdGVybmF0aXZlc19pbl9ydWxlQ2hhcnRFbGVtZW50OTQwKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0RWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydExlZ2VuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0ODE6MTogZW50cnlSdWxlQ2hhcnRMZWdlbmQgOiBydWxlQ2hhcnRMZWdlbmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydExlZ2VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0ODI6MTogKCBydWxlQ2hhcnRMZWdlbmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4MzoxOiBydWxlQ2hhcnRMZWdlbmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRMZWdlbmRfaW5fZW50cnlSdWxlQ2hhcnRMZWdlbmQ5NjcpOworICAgICAgICAgICAgcnVsZUNoYXJ0TGVnZW5kKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0TGVnZW5kOTc0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydExlZ2VuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRMZWdlbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDkwOjE6IHJ1bGVDaGFydExlZ2VuZCA6ICggKCBydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRMZWdlbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDk0OjI6ICggKCAoIHJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDk1OjE6ICggKCBydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0OTU6MTogKCAoIHJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ5NjoxOiAoIHJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDk3OjE6ICggcnVsZV9fQ2hhcnRMZWdlbmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ5NzoyOiBydWxlX19DaGFydExlZ2VuZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMF9pbl9ydWxlQ2hhcnRMZWdlbmQxMDAwKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0TGVnZW5kX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRMZWdlbmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MDk6MTogZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlciA6IHJ1bGVDaGFydEhpZ2hsaWdodGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MTA6MTogKCBydWxlQ2hhcnRIaWdobGlnaHRlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTExOjE6IHJ1bGVDaGFydEhpZ2hsaWdodGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRIaWdobGlnaHRlcl9pbl9lbnRyeVJ1bGVDaGFydEhpZ2hsaWdodGVyMTAyNyk7CisgICAgICAgICAgICBydWxlQ2hhcnRIaWdobGlnaHRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0SGlnaGxpZ2h0ZXIxMDM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydEhpZ2hsaWdodGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEhpZ2hsaWdodGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUxODoxOiBydWxlQ2hhcnRIaWdobGlnaHRlciA6ICggKCBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydEhpZ2hsaWdodGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUyMjoyOiAoICggKCBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTIzOjE6ICggKCBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUyMzoxOiAoICggcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MjQ6MTogKCBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MjU6MTogKCBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MjU6MjogcnVsZV9fQ2hhcnRIaWdobGlnaHRlcl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0SGlnaGxpZ2h0ZXJfX0dyb3VwX18wX2luX3J1bGVDaGFydEhpZ2hsaWdodGVyMTA2MCk7CisgICAgICAgICAgICBydWxlX19DaGFydEhpZ2hsaWdodGVyX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydEhpZ2hsaWdodGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0QXhpcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzc6MTogZW50cnlSdWxlQ2hhcnRBeGlzIDogcnVsZUNoYXJ0QXhpcyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUNoYXJ0QXhpcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzg6MTogKCBydWxlQ2hhcnRBeGlzIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzk6MTogcnVsZUNoYXJ0QXhpcyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRBeGlzX2luX2VudHJ5UnVsZUNoYXJ0QXhpczEwODcpOworICAgICAgICAgICAgcnVsZUNoYXJ0QXhpcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRBeGlzMTA5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRBeGlzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEF4aXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQ2OjE6IHJ1bGVDaGFydEF4aXMgOiAoICggcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydEF4aXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTUwOjI6ICggKCAoIHJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU1MToxOiAoICggcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU1MToxOiAoICggcnVsZV9fQ2hhcnRBeGlzX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU1MjoxOiAoIHJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1NTM6MTogKCBydWxlX19DaGFydEF4aXNfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU1MzoyOiBydWxlX19DaGFydEF4aXNfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydEF4aXNfX0dyb3VwX18wX2luX3J1bGVDaGFydEF4aXMxMTIwKTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0QXhpc19fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydEF4aXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRSYW5nZUVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTY1OjE6IGVudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50IDogcnVsZUNoYXJ0UmFuZ2VFbGVtZW50IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRSYW5nZUVsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTY2OjE6ICggcnVsZUNoYXJ0UmFuZ2VFbGVtZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Njc6MTogcnVsZUNoYXJ0UmFuZ2VFbGVtZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJhbmdlRWxlbWVudFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0UmFuZ2VFbGVtZW50X2luX2VudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50MTE0Nyk7CisgICAgICAgICAgICBydWxlQ2hhcnRSYW5nZUVsZW1lbnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJhbmdlRWxlbWVudFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRSYW5nZUVsZW1lbnQxMTU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRSYW5nZUVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTc0OjE6IHJ1bGVDaGFydFJhbmdlRWxlbWVudCA6ICggcnVsZUNoYXJ0U2VnbWVudENvbG9yICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVDaGFydFJhbmdlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Nzg6MjogKCAoIHJ1bGVDaGFydFNlZ21lbnRDb2xvciApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU3OToxOiAoIHJ1bGVDaGFydFNlZ21lbnRDb2xvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Nzk6MTogKCBydWxlQ2hhcnRTZWdtZW50Q29sb3IgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTgwOjE6IHJ1bGVDaGFydFNlZ21lbnRDb2xvcgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJhbmdlRWxlbWVudEFjY2VzcygpLmdldENoYXJ0U2VnbWVudENvbG9yUGFyc2VyUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0U2VnbWVudENvbG9yX2luX3J1bGVDaGFydFJhbmdlRWxlbWVudDExODApOworICAgICAgICAgICAgcnVsZUNoYXJ0U2VnbWVudENvbG9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSYW5nZUVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydFNlZ21lbnRDb2xvclBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRSYW5nZUVsZW1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTkzOjE6IGVudHJ5UnVsZUNoYXJ0U2VnbWVudENvbG9yIDogcnVsZUNoYXJ0U2VnbWVudENvbG9yIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTk0OjE6ICggcnVsZUNoYXJ0U2VnbWVudENvbG9yIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1OTU6MTogcnVsZUNoYXJ0U2VnbWVudENvbG9yIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0U2VnbWVudENvbG9yX2luX2VudHJ5UnVsZUNoYXJ0U2VnbWVudENvbG9yMTIwNik7CisgICAgICAgICAgICBydWxlQ2hhcnRTZWdtZW50Q29sb3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IxMjEzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRTZWdtZW50Q29sb3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjAyOjE6IHJ1bGVDaGFydFNlZ21lbnRDb2xvciA6ICggKCBydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRTZWdtZW50Q29sb3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjA2OjI6ICggKCAoIHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjA3OjE6ICggKCBydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MDc6MTogKCAoIHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwODoxOiAoIHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjA5OjE6ICggcnVsZV9fQ2hhcnRTZWdtZW50Q29sb3JfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwOToyOiBydWxlX19DaGFydFNlZ21lbnRDb2xvcl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMF9pbl9ydWxlQ2hhcnRTZWdtZW50Q29sb3IxMjM5KTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0U2VnbWVudENvbG9yX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRTZWdtZW50Q29sb3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjIxOjE6IGVudHJ5UnVsZUNoYXJ0SW1wb3J0IDogcnVsZUNoYXJ0SW1wb3J0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQ2hhcnRJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjIyOjE6ICggcnVsZUNoYXJ0SW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MjM6MTogcnVsZUNoYXJ0SW1wb3J0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SW1wb3J0X2luX2VudHJ5UnVsZUNoYXJ0SW1wb3J0MTI2Nik7CisgICAgICAgICAgICBydWxlQ2hhcnRJbXBvcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRJbXBvcnQxMjczKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydEltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjMwOjE6IHJ1bGVDaGFydEltcG9ydCA6ICggKCBydWxlX19DaGFydEltcG9ydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM0OjI6ICggKCAoIHJ1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM1OjE6ICggKCBydWxlX19DaGFydEltcG9ydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MzU6MTogKCAoIHJ1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzNjoxOiAoIHJ1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM3OjE6ICggcnVsZV9fQ2hhcnRJbXBvcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzNzoyOiBydWxlX19DaGFydEltcG9ydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMF9pbl9ydWxlQ2hhcnRJbXBvcnQxMjk5KTsKKyAgICAgICAgICAgIHJ1bGVfX0NoYXJ0SW1wb3J0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRJbXBvcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlU2lnbmVkTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0OToxOiBlbnRyeVJ1bGVTaWduZWROdW1iZXIgOiBydWxlU2lnbmVkTnVtYmVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlU2lnbmVkTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY1MDoxOiAoIHJ1bGVTaWduZWROdW1iZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY1MToxOiBydWxlU2lnbmVkTnVtYmVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVTaWduZWROdW1iZXJfaW5fZW50cnlSdWxlU2lnbmVkTnVtYmVyMTMyNik7CisgICAgICAgICAgICBydWxlU2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVTaWduZWROdW1iZXIxMzMzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVTaWduZWROdW1iZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVNpZ25lZE51bWJlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NTg6MTogcnVsZVNpZ25lZE51bWJlciA6ICggKCBydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVTaWduZWROdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjYyOjI6ICggKCAoIHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzAgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NjM6MTogKCAoIHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzAgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjYzOjE6ICggKCBydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2NDoxOiAoIHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzAgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY1OjE6ICggcnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMCApPworICAgICAgICAgICAgaW50IGFsdDI9MjsKKyAgICAgICAgICAgIGludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTJfMD09UlVMRV9JTlR8fExBMl8wPT0zNSkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY1OjI6IHJ1bGVfX1NpZ25lZE51bWJlcl9fR3JvdXBfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19TaWduZWROdW1iZXJfX0dyb3VwX18wX2luX3J1bGVTaWduZWROdW1iZXIxMzU5KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZV9fU2lnbmVkTnVtYmVyX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVNpZ25lZE51bWJlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njc3OjE6IGVudHJ5UnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA6IHJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njc4OjE6ICggcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njc5OjE6IHJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9lbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQxMzg3KTsKKyAgICAgICAgICAgIHJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDEzOTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY4NjoxOiBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIDogKCAoIHJ1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5MDoyOiAoICggKCBydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTE6MTogKCAoIHJ1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTE6MTogKCAoIHJ1bGVfX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTI6MTogKCBydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjkzOjE6ICggcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTM6MjogcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMF9pbl9ydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkMTQyMCk7CisgICAgICAgICAgICBydWxlX19DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MDU6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIDogcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MDY6MTogKCBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MDc6MTogcnVsZVRSQU5TTEFUQUJMRVNUUklORyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFU1RSSU5HX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORzE0NDcpOworICAgICAgICAgICAgcnVsZVRSQU5TTEFUQUJMRVNUUklORygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRVNUUklOR1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HMTQ1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVTVFJJTkciCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE0OjE6IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgOiAoIFJVTEVfU1RSSU5HICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE4OjI6ICggKCBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcxOToxOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcxOToxOiAoIFJVTEVfU1RSSU5HICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcyMDoxOiBSVUxFX1NUUklORworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVTVFJJTkdBY2Nlc3MoKS5nZXRTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HMTQ4MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVRSQU5TTEFUQUJMRVNUUklORyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MzM6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQgOiBydWxlVFJBTlNMQVRBQkxFSUQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MzQ6MTogKCBydWxlVFJBTlNMQVRBQkxFSUQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjczNToxOiBydWxlVFJBTlNMQVRBQkxFSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFSURfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQxNTA2KTsKKyAgICAgICAgICAgIHJ1bGVUUkFOU0xBVEFCTEVJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRDE1MTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NDI6MTogcnVsZVRSQU5TTEFUQUJMRUlEIDogKCBSVUxFX0lEICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NDY6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NDc6MTogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc0NzoxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzQ4OjE6IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlVFJBTlNMQVRBQkxFSUQxNTM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc2MToxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbiA6IHJ1bGVYQW5ub3RhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc2MjoxOiAoIHJ1bGVYQW5ub3RhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzYzOjE6IHJ1bGVYQW5ub3RhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbjE1NjUpOworICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uMTU3Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3MDoxOiBydWxlWEFubm90YXRpb24gOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NToxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzc1OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NzY6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NzoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Nzc6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfaW5fcnVsZVhBbm5vdGF0aW9uMTU5OCk7CisgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3ODk6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3OTA6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3OTE6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjE2MjUpOworICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyMTYzMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzk4OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODAyOjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwNToyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIxNjU4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MTc6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MTg6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODE5OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0MTY4NSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QxNjkyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgyNjoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MzA6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MzE6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgzMToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODMyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MzM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODMzOjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0MTcxOCk7CisgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODQ1OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODQ2OjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NDc6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlMTc0NSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUxNzUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU0OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1ODoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTk6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlc19pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUxNzc4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NzM6MTogZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NzQ6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg3NToxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24xODA1KTsKKyAgICAgICAgICAgIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjE4MTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4ODI6MTogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODg2OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg4NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg4NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg4ODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4ODk6MTogKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg4OToyOiBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjE4MzgpOworICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwMToxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbiA6IHJ1bGVYRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwMjoxOiAoIHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTAzOjE6IHJ1bGVYRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbjE4NjUpOworICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uMTg3Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkxMDoxOiBydWxlWEV4cHJlc3Npb24gOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTE0OjI6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MTU6MTogKCBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTE1OjE6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkxNjoxOiBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9ydWxlWEV4cHJlc3Npb24xODk4KTsKKyAgICAgICAgICAgIHJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkyOToxOiBlbnRyeVJ1bGVYQXNzaWdubWVudCA6IHJ1bGVYQXNzaWdubWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzMDoxOiAoIHJ1bGVYQXNzaWdubWVudCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTMxOjE6IHJ1bGVYQXNzaWdubWVudCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9lbnRyeVJ1bGVYQXNzaWdubWVudDE5MjQpOworICAgICAgICAgICAgcnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBc3NpZ25tZW50MTkzMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzODoxOiBydWxlWEFzc2lnbm1lbnQgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NDI6MjogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQzOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQzOjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQ0OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk0NToxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQ1OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhBc3NpZ25tZW50MTk1Nyk7CisgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFzc2lnbm1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU3OjE6IGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIDogcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU4OjE6ICggcnVsZU9wU2luZ2xlQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTk6MTogcnVsZU9wU2luZ2xlQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wU2luZ2xlQXNzaWduX2luX2VudHJ5UnVsZU9wU2luZ2xlQXNzaWduMTk4NCk7CisgICAgICAgICAgICBydWxlT3BTaW5nbGVBc3NpZ24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24xOTkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BTaW5nbGVBc3NpZ24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTY2OjE6IHJ1bGVPcFNpbmdsZUFzc2lnbiA6ICggJz0nICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NzA6MjogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk3MToxOiAoICc9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NzE6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTcyOjE6ICc9JworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzLEZPTExPV18xM19pbl9ydWxlT3BTaW5nbGVBc3NpZ24yMDE4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BTaW5nbGVBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5ODc6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiA6IHJ1bGVPcE11bHRpQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5ODg6MTogKCBydWxlT3BNdWx0aUFzc2lnbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTg5OjE6IHJ1bGVPcE11bHRpQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BNdWx0aUFzc2lnbl9pbl9lbnRyeVJ1bGVPcE11bHRpQXNzaWduMjA0Nik7CisgICAgICAgICAgICBydWxlT3BNdWx0aUFzc2lnbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24yMDUzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk5NjoxOiBydWxlT3BNdWx0aUFzc2lnbiA6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDAwOjI6ICggKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMToxOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMToxOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMjoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMzoxOiAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDAzOjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcE11bHRpQXNzaWduMjA3OSk7CisgICAgICAgICAgICBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGlBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDE1OjE6IGVudHJ5UnVsZVhPckV4cHJlc3Npb24gOiBydWxlWE9yRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhPckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAxNjoxOiAoIHJ1bGVYT3JFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDE3OjE6IHJ1bGVYT3JFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE9yRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYT3JFeHByZXNzaW9uMjEwNik7CisgICAgICAgICAgICBydWxlWE9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhPckV4cHJlc3Npb24yMTEzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMjQ6MTogcnVsZVhPckV4cHJlc3Npb24gOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDI4OjI6ICggKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDI5OjE6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMjk6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAzMDoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMzE6MTogKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDMxOjI6IHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWE9yRXhwcmVzc2lvbjIxMzkpOworICAgICAgICAgICAgcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNDM6MTogZW50cnlSdWxlT3BPciA6IHJ1bGVPcE9yIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDQ0OjE6ICggcnVsZU9wT3IgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNDU6MTogcnVsZU9wT3IgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE9yX2luX2VudHJ5UnVsZU9wT3IyMTY2KTsKKyAgICAgICAgICAgIHJ1bGVPcE9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BPcjIxNzMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wT3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wT3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1MjoxOiBydWxlT3BPciA6ICggJ3x8JyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDU2OjI6ICggKCAnfHwnICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1NzoxOiAoICd8fCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1NzoxOiAoICd8fCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1ODoxOiAnfHwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlT3BPcjIyMDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3JBY2Nlc3MoKS5nZXRWZXJ0aWNhbExpbmVWZXJ0aWNhbExpbmVLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDczOjE6IGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIDogcnVsZVhBbmRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA3NDoxOiAoIHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA3NToxOiBydWxlWEFuZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFuZEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFuZEV4cHJlc3Npb24yMjI4KTsKKyAgICAgICAgICAgIHJ1bGVYQW5kRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbjIyMzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDgyOjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4NjoyOiAoICggKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODc6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODc6MTogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODg6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODk6MTogKCBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4OToyOiBydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWEFuZEV4cHJlc3Npb24yMjYxKTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFuZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEwMToxOiBlbnRyeVJ1bGVPcEFuZCA6IHJ1bGVPcEFuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDI6MTogKCBydWxlT3BBbmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDM6MTogcnVsZU9wQW5kIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQW5kX2luX2VudHJ5UnVsZU9wQW5kMjI4OCk7CisgICAgICAgICAgICBydWxlT3BBbmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBbmQyMjk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTExMDoxOiBydWxlT3BBbmQgOiAoICcmJicgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMTQ6MjogKCAoICcmJicgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTE1OjE6ICggJyYmJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTE1OjE6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTE2OjE6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlT3BBbmQyMzIyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZEFjY2VzcygpLmdldEFtcGVyc2FuZEFtcGVyc2FuZEtleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzE6MTogZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiA6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTMyOjE6ICggcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzM6MTogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24yMzUwKTsKKyAgICAgICAgICAgIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbjIzNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE0MDoxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNDQ6MjogKCAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNDU6MTogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE0NToxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTQ2OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE0NzoxOiAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNDc6MjogcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uMjM4Myk7CisgICAgICAgICAgICBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wRXF1YWxpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE1OToxOiBlbnRyeVJ1bGVPcEVxdWFsaXR5IDogcnVsZU9wRXF1YWxpdHkgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNjA6MTogKCBydWxlT3BFcXVhbGl0eSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE2MToxOiBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wRXF1YWxpdHlfaW5fZW50cnlSdWxlT3BFcXVhbGl0eTI0MTApOworICAgICAgICAgICAgcnVsZU9wRXF1YWxpdHkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcEVxdWFsaXR5MjQxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTY4OjE6IHJ1bGVPcEVxdWFsaXR5IDogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcEVxdWFsaXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNzI6MjogKCAoICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTczOjE6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTczOjE6ICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc0OjE6ICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc1OjE6ICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNzU6MjogcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wRXF1YWxpdHkyNDQzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE4NzoxOiBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExODg6MTogKCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTg5OjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24yNDcwKTsKKyAgICAgICAgICAgIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjI0NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExOTY6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjAwOjI6ICggKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDE6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjAxOjE6ICggKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwMjoxOiAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjAzOjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjAzOjI6IHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjI1MDMpOworICAgICAgICAgICAgcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIxNToxOiBlbnRyeVJ1bGVPcENvbXBhcmUgOiBydWxlT3BDb21wYXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMTY6MTogKCBydWxlT3BDb21wYXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjE3OjE6IHJ1bGVPcENvbXBhcmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQ29tcGFyZV9pbl9lbnRyeVJ1bGVPcENvbXBhcmUyNTMwKTsKKyAgICAgICAgICAgIHJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQ29tcGFyZTI1MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BDb21wYXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMjQ6MTogcnVsZU9wQ29tcGFyZSA6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyODoyOiAoICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyOToxOiAoICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjI5OjE6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMzA6MTogKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjMxOjE6ICggcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIzMToyOiBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wQ29tcGFyZTI1NjMpOworICAgICAgICAgICAgcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BDb21wYXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjQzOjE6IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiA6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI0NDoxOiAoIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNDU6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjI1OTApOworICAgICAgICAgICAgcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uMjU5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI1MjoxOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNTY6MjogKCAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI1NzoxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNTc6MTogKCAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjU4OjE6ICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNTk6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNTk6MjogcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uMjYyMyk7CisgICAgICAgICAgICBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3RoZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI3MToxOiBlbnRyeVJ1bGVPcE90aGVyIDogcnVsZU9wT3RoZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNzI6MTogKCBydWxlT3BPdGhlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI3MzoxOiBydWxlT3BPdGhlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3RoZXJfaW5fZW50cnlSdWxlT3BPdGhlcjI2NTApOworICAgICAgICAgICAgcnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE90aGVyMjY1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPdGhlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjgwOjE6IHJ1bGVPcE90aGVyIDogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyODQ6MjogKCAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg1OjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg1OjE6ICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg2OjE6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg3OjE6ICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyODc6MjogcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wT3RoZXIyNjgzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPdGhlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOTk6MTogZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzAwOjE6ICggcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMDE6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24yNzEwKTsKKyAgICAgICAgICAgIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbjI3MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMwODoxOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMTI6MjogKCAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMTM6MTogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxMzoxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzE0OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxNToxOiAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMTU6MjogcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uMjc0Myk7CisgICAgICAgICAgICBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQWRkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMjc6MTogZW50cnlSdWxlT3BBZGQgOiBydWxlT3BBZGQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzI4OjE6ICggcnVsZU9wQWRkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzI5OjE6IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEFkZF9pbl9lbnRyeVJ1bGVPcEFkZDI3NzApOworICAgICAgICAgICAgcnVsZU9wQWRkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQWRkMjc3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BBZGQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wQWRkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMzY6MTogcnVsZU9wQWRkIDogKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM0MDoyOiAoICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzQxOjE6ICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM0MToxOiAoICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNDI6MTogKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM0MzoxOiAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM0MzoyOiBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcEFkZDI4MDMpOworICAgICAgICAgICAgcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQWRkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM1NToxOiBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNTY6MTogKCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM1NzoxOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25faW5fZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjI4MzApOworICAgICAgICAgICAgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjgzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzY0OjE6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2ODoyOiAoICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2OToxOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzY5OjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNzA6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzcxOjE6ICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM3MToyOiBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yODYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzgzOjE6IGVudHJ5UnVsZU9wTXVsdGkgOiBydWxlT3BNdWx0aSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM4NDoxOiAoIHJ1bGVPcE11bHRpIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzg1OjE6IHJ1bGVPcE11bHRpIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BNdWx0aV9pbl9lbnRyeVJ1bGVPcE11bHRpMjg5MCk7CisgICAgICAgICAgICBydWxlT3BNdWx0aSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wTXVsdGkyODk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOTI6MTogcnVsZU9wTXVsdGkgOiAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wTXVsdGkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM5NjoyOiAoICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOTc6MTogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOTc6MTogKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOTg6MTogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzOTk6MTogKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM5OToyOiBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BNdWx0aTI5MjMpOworICAgICAgICAgICAgcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE11bHRpIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDExOjE6IGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbiA6IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQxMjoxOiAoIHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MTM6MTogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbjI5NTApOworICAgICAgICAgICAgcnVsZVhVbmFyeU9wZXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uMjk1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVW5hcnlPcGVyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQyMDoxOiBydWxlWFVuYXJ5T3BlcmF0aW9uIDogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhVbmFyeU9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDI0OjI6ICggKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDI1OjE6ICggKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MjU6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQyNjoxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Mjc6MTogKCBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDI3OjI6IHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlc19pbl9ydWxlWFVuYXJ5T3BlcmF0aW9uMjk4Myk7CisgICAgICAgICAgICBydWxlX19YVW5hcnlPcGVyYXRpb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYVW5hcnlPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BVbmFyeSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDM5OjE6IGVudHJ5UnVsZU9wVW5hcnkgOiBydWxlT3BVbmFyeSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wVW5hcnkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ0MDoxOiAoIHJ1bGVPcFVuYXJ5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDQxOjE6IHJ1bGVPcFVuYXJ5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BVbmFyeV9pbl9lbnRyeVJ1bGVPcFVuYXJ5MzAxMCk7CisgICAgICAgICAgICBydWxlT3BVbmFyeSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wVW5hcnkzMDE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFVuYXJ5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFVuYXJ5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDg6MTogcnVsZU9wVW5hcnkgOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wVW5hcnkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ1MjoyOiAoICggKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NTM6MTogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NTM6MTogKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NTQ6MTogKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NTU6MTogKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ1NToyOiBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BVbmFyeTMwNDMpOworICAgICAgICAgICAgcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcFVuYXJ5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Njc6MTogZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24gOiBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY4OjE6ICggcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY5OjE6IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2FzdGVkRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbjMwNzApOworICAgICAgICAgICAgcnVsZVhDYXN0ZWRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uMzA3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NzY6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDgwOjI6ICggKCAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4MToxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4MToxOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4MjoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4MzoxOiAoIHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDgzOjI6IHJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQ2FzdGVkRXhwcmVzc2lvbjMxMDMpOworICAgICAgICAgICAgcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDk1OjE6IGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ5NjoxOiAoIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ5NzoxOiBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFBvc3RmaXhPcGVyYXRpb25faW5fZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24zMTMwKTsKKyAgICAgICAgICAgIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbjMxMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTA0OjE6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiA6ICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFBvc3RmaXhPcGVyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUwODoyOiAoICggKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MDk6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MDk6MTogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MTA6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MTE6MTogKCBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUxMToyOiBydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMF9pbl9ydWxlWFBvc3RmaXhPcGVyYXRpb24zMTYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFBvc3RmaXhPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BQb3N0Zml4IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MjM6MTogZW50cnlSdWxlT3BQb3N0Zml4IDogcnVsZU9wUG9zdGZpeCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wUG9zdGZpeCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTI0OjE6ICggcnVsZU9wUG9zdGZpeCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUyNToxOiBydWxlT3BQb3N0Zml4IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcFBvc3RmaXhfaW5fZW50cnlSdWxlT3BQb3N0Zml4MzE5MCk7CisgICAgICAgICAgICBydWxlT3BQb3N0Zml4KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFBvc3RmaXgzMTk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFBvc3RmaXgiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wUG9zdGZpeCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTMyOjE6IHJ1bGVPcFBvc3RmaXggOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MzY6MjogKCAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1Mzc6MTogKCAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUzNzoxOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTM4OjE6ICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUzOToxOiAoIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1Mzk6MjogcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcFBvc3RmaXgzMjIzKTsKKyAgICAgICAgICAgIHJ1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wUG9zdGZpeCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU1MToxOiBlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NTI6MTogKCBydWxlWE1lbWJlckZlYXR1cmVDYWxsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTUzOjE6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbF9pbl9lbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwzMjUwKTsKKyAgICAgICAgICAgIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbDMyNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE1lbWJlckZlYXR1cmVDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NjA6MTogcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCA6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTY0OjI6ICggKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NjU6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTY1OjE6ICggKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU2NjoxOiAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTY3OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTY3OjI6IHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfaW5fcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbDMyODMpOworICAgICAgICAgICAgcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU3OToxOiBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1ODA6MTogKCBydWxlWFByaW1hcnlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTgxOjE6IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24zMzEwKTsKKyAgICAgICAgICAgIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbjMzMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1ODg6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiA6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU5MjoyOiAoICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU5MzoxOiAoICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTkzOjE6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1OTQ6MTogKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTk1OjE6ICggcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU5NToyOiBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhQcmltYXJ5RXhwcmVzc2lvbjMzNDMpOworICAgICAgICAgICAgcnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFByaW1hcnlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2MDc6MTogZW50cnlSdWxlWExpdGVyYWwgOiBydWxlWExpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjA4OjE6ICggcnVsZVhMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjA5OjE6IHJ1bGVYTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYTGl0ZXJhbDMzNzApOworICAgICAgICAgICAgcnVsZVhMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhMaXRlcmFsMzM3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2MTY6MTogcnVsZVhMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYyMDoyOiAoICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjIxOjE6ICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYyMToxOiAoICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2MjI6MTogKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYyMzoxOiAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYyMzoyOiBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYTGl0ZXJhbDM0MDMpOworICAgICAgICAgICAgcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjM1OjE6IGVudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCA6IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYzNjoxOiAoIHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2Mzc6MTogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENvbGxlY3Rpb25MaXRlcmFsX2luX2VudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbDM0MzApOworICAgICAgICAgICAgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsMzQzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY0NDoxOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIDogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjQ4OjI6ICggKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjQ5OjE6ICggKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NDk6MTogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY1MDoxOiAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NTE6MTogKCBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjUxOjI6IHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlc19pbl9ydWxlWENvbGxlY3Rpb25MaXRlcmFsMzQ2Myk7CisgICAgICAgICAgICBydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFNldExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY2MzoxOiBlbnRyeVJ1bGVYU2V0TGl0ZXJhbCA6IHJ1bGVYU2V0TGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NjQ6MTogKCBydWxlWFNldExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NjU6MTogcnVsZVhTZXRMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhTZXRMaXRlcmFsX2luX2VudHJ5UnVsZVhTZXRMaXRlcmFsMzQ5MCk7CisgICAgICAgICAgICBydWxlWFNldExpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFNldExpdGVyYWwzNDk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU2V0TGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFNldExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY3MjoxOiBydWxlWFNldExpdGVyYWwgOiAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTZXRMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NzY6MjogKCAoICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjc3OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjc3OjE6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjc4OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjc5OjE6ICggcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2Nzk6MjogcnVsZV9fWFNldExpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhTZXRMaXRlcmFsMzUyMyk7CisgICAgICAgICAgICBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhTZXRMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhMaXN0TGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjkxOjE6IGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCA6IHJ1bGVYTGlzdExpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY5MjoxOiAoIHJ1bGVYTGlzdExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2OTM6MTogcnVsZVhMaXN0TGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWExpc3RMaXRlcmFsX2luX2VudHJ5UnVsZVhMaXN0TGl0ZXJhbDM1NTApOworICAgICAgICAgICAgcnVsZVhMaXN0TGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWExpc3RMaXRlcmFsMzU1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWExpc3RMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTGlzdExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcwMDoxOiBydWxlWExpc3RMaXRlcmFsIDogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWExpc3RMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MDQ6MjogKCAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcwNToxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MDU6MTogKCAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzA2OjE6ICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MDc6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MDc6MjogcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWExpc3RMaXRlcmFsMzU4Myk7CisgICAgICAgICAgICBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWExpc3RMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MTk6MTogZW50cnlSdWxlWENsb3N1cmUgOiBydWxlWENsb3N1cmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzIwOjE6ICggcnVsZVhDbG9zdXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzIxOjE6IHJ1bGVYQ2xvc3VyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2xvc3VyZV9pbl9lbnRyeVJ1bGVYQ2xvc3VyZTM2MTApOworICAgICAgICAgICAgcnVsZVhDbG9zdXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDbG9zdXJlMzYxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3Mjg6MTogcnVsZVhDbG9zdXJlIDogKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzMyOjI6ICggKCAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTczMzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTczMzoxOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTczNDoxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTczNToxOiAoIHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzM1OjI6IHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wX2luX3J1bGVYQ2xvc3VyZTM2NDMpOworICAgICAgICAgICAgcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzQ3OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc0ODoxOiAoIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc0OToxOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmVfaW5fZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUzNjcwKTsKKyAgICAgICAgICAgIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZTM2NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzU2OjE6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSA6ICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc2MDoyOiAoICggKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjE6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjE6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjI6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjM6MTogKCBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc2MzoyOiBydWxlX19YRXhwcmVzc2lvbkluQ2xvc3VyZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMF9pbl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUzNzAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFNob3J0Q2xvc3VyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzc1OjE6IGVudHJ5UnVsZVhTaG9ydENsb3N1cmUgOiBydWxlWFNob3J0Q2xvc3VyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTaG9ydENsb3N1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc3NjoxOiAoIHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzc3OjE6IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFNob3J0Q2xvc3VyZV9pbl9lbnRyeVJ1bGVYU2hvcnRDbG9zdXJlMzczMCk7CisgICAgICAgICAgICBydWxlWFNob3J0Q2xvc3VyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhTaG9ydENsb3N1cmUzNzM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU2hvcnRDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3ODQ6MTogcnVsZVhTaG9ydENsb3N1cmUgOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFNob3J0Q2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzg4OjI6ICggKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzg5OjE6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3ODk6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc5MDoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3OTE6MTogKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzkxOjI6IHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMF9pbl9ydWxlWFNob3J0Q2xvc3VyZTM3NjMpOworICAgICAgICAgICAgcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFNob3J0Q2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTgwMzoxOiBlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gOiBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MDQ6MTogKCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODA1OjE6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24zNzkwKTsKKyAgICAgICAgICAgIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjM3OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MTI6MTogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODE2OjI6ICggKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MTc6MTogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODE3OjE6ICggKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTgxODoxOiAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODE5OjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODE5OjI6IHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjM4MjMpOworICAgICAgICAgICAgcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MzE6MTogZW50cnlSdWxlWElmRXhwcmVzc2lvbiA6IHJ1bGVYSWZFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWElmRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODMyOjE6ICggcnVsZVhJZkV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MzM6MTogcnVsZVhJZkV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYSWZFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhJZkV4cHJlc3Npb24zODUwKTsKKyAgICAgICAgICAgIHJ1bGVYSWZFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWElmRXhwcmVzc2lvbjM4NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhJZkV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhJZkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg0MDoxOiBydWxlWElmRXhwcmVzc2lvbiA6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYSWZFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NDQ6MjogKCAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NDU6MTogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg0NToxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODQ2OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg0NzoxOiAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NDc6MjogcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYSWZFeHByZXNzaW9uMzg4Myk7CisgICAgICAgICAgICBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYSWZFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NTk6MTogZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24gOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODYwOjE6ICggcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODYxOjE6IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYU3dpdGNoRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbjM5MTApOworICAgICAgICAgICAgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uMzkxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTd2l0Y2hFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4Njg6MTogcnVsZVhTd2l0Y2hFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODcyOjI6ICggKCAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg3MzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg3MzoxOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg3NDoxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg3NToxOiAoIHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODc1OjI6IHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYU3dpdGNoRXhwcmVzc2lvbjM5NDMpOworICAgICAgICAgICAgcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYU3dpdGNoRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2FzZVBhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg4NzoxOiBlbnRyeVJ1bGVYQ2FzZVBhcnQgOiBydWxlWENhc2VQYXJ0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENhc2VQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4ODg6MTogKCBydWxlWENhc2VQYXJ0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODg5OjE6IHJ1bGVYQ2FzZVBhcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDYXNlUGFydF9pbl9lbnRyeVJ1bGVYQ2FzZVBhcnQzOTcwKTsKKyAgICAgICAgICAgIHJ1bGVYQ2FzZVBhcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDYXNlUGFydDM5NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhDYXNlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENhc2VQYXJ0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4OTY6MTogcnVsZVhDYXNlUGFydCA6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDYXNlUGFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTAwOjI6ICggKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MDE6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTAxOjE6ICggKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkwMjoxOiAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTAzOjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTAzOjI6IHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzBfaW5fcnVsZVhDYXNlUGFydDQwMDMpOworICAgICAgICAgICAgcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDYXNlUGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkxNToxOiBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MTY6MTogKCBydWxlWEZvckxvb3BFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTE3OjE6IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhGb3JMb29wRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb240MDMwKTsKKyAgICAgICAgICAgIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbjQwMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZvckxvb3BFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MjQ6MTogcnVsZVhGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTI4OjI6ICggKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5Mjk6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTI5OjE6ICggKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkzMDoxOiAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTMxOjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTMxOjI6IHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhGb3JMb29wRXhwcmVzc2lvbjQwNjMpOworICAgICAgICAgICAgcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTQzOjE6IGVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIDogcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk0NDoxOiAoIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk0NToxOiBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb240MDkwKTsKKyAgICAgICAgICAgIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbjQwOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTUyOjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk1NjoyOiAoICggKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTc6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTc6MTogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTg6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTk6MTogKCBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk1OToyOiBydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb240MTIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTcxOjE6IGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24gOiBydWxlWFdoaWxlRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk3MjoxOiAoIHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTczOjE6IHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFdoaWxlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uNDE1MCk7CisgICAgICAgICAgICBydWxlWFdoaWxlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb240MTU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYV2hpbGVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5ODA6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFdoaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTg0OjI6ICggKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTg1OjE6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5ODU6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk4NjoxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5ODc6MTogKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTg3OjI6IHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFdoaWxlRXhwcmVzc2lvbjQxODMpOworICAgICAgICAgICAgcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFdoaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk5OToxOiBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMDA6MTogKCBydWxlWERvV2hpbGVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDAxOjE6IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhEb1doaWxlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb240MjEwKTsKKyAgICAgICAgICAgIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbjQyMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWERvV2hpbGVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMDg6MTogcnVsZVhEb1doaWxlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhEb1doaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDEyOjI6ICggKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMTM6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDEzOjE6ICggKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAxNDoxOiAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDE1OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDE1OjI6IHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhEb1doaWxlRXhwcmVzc2lvbjQyNDMpOworICAgICAgICAgICAgcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMjc6MTogZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiA6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDI4OjE6ICggcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMjk6MTogcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQmxvY2tFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb240MjcwKTsKKyAgICAgICAgICAgIHJ1bGVYQmxvY2tFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbjQyNzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhCbG9ja0V4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAzNjoxOiBydWxlWEJsb2NrRXhwcmVzc2lvbiA6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQmxvY2tFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNDA6MjogKCAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNDE6MTogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA0MToxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDQyOjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA0MzoxOiAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNDM6MjogcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQmxvY2tFeHByZXNzaW9uNDMwMyk7CisgICAgICAgICAgICBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQmxvY2tFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDU1OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiA6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA1NjoxOiAoIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNTc6MTogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbjQzMzApOworICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uNDMzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA2NDoxOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDY4OjI6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDY5OjE6ICggKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNjk6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA3MDoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNzE6MTogKCBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDcxOjI6IHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc19pbl9ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uNDM2Myk7CisgICAgICAgICAgICBydWxlX19YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA4MzoxOiBlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiA6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwODQ6MTogKCBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwODU6MTogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uX2luX2VudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uNDM5MCk7CisgICAgICAgICAgICBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb240Mzk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA5MjoxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gOiAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOTY6MjogKCAoICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk3OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk3OjE6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk4OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk5OjE6ICggcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOTk6MjogcnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzBfaW5fcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uNDQyMyk7CisgICAgICAgICAgICBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTExOjE6IGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciA6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjExMjoxOiAoIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMTM6MTogcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtRm9ybWFsUGFyYW1ldGVyX2luX2VudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcjQ0NTApOworICAgICAgICAgICAgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyNDQ1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEyMDoxOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMjQ6MjogKCAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEyNToxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMjU6MTogKCAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTI2OjE6ICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMjc6MTogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMjc6MjogcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9pbl9ydWxlSnZtRm9ybWFsUGFyYW1ldGVyNDQ4Myk7CisgICAgICAgICAgICBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtRm9ybWFsUGFyYW1ldGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzOToxOiBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNDA6MTogKCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE0MToxOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfaW5fZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcjQ1MTApOworICAgICAgICAgICAgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyNDUxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTQ4OjE6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIDogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE1MjoyOiAoICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE1MzoxOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTUzOjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNTQ6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTU1OjE6ICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE1NToyOiBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzBfaW5fcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI0NTQzKTsKKyAgICAgICAgICAgIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZlYXR1cmVDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNjc6MTogZW50cnlSdWxlWEZlYXR1cmVDYWxsIDogcnVsZVhGZWF0dXJlQ2FsbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTY4OjE6ICggcnVsZVhGZWF0dXJlQ2FsbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE2OToxOiBydWxlWEZlYXR1cmVDYWxsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRmVhdHVyZUNhbGxfaW5fZW50cnlSdWxlWEZlYXR1cmVDYWxsNDU3MCk7CisgICAgICAgICAgICBydWxlWEZlYXR1cmVDYWxsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRmVhdHVyZUNhbGw0NTc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRmVhdHVyZUNhbGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhGZWF0dXJlQ2FsbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTc2OjE6IHJ1bGVYRmVhdHVyZUNhbGwgOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MDoyOiAoICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTgxOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MToxOiAoICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxODI6MTogKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MzoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MzoyOiBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wX2luX3J1bGVYRmVhdHVyZUNhbGw0NjAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRmVhdHVyZUNhbGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRmVhdHVyZUNhbGxJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTk1OjE6IGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQgOiBydWxlRmVhdHVyZUNhbGxJRCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE5NjoxOiAoIHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTk3OjE6IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRmVhdHVyZUNhbGxJRF9pbl9lbnRyeVJ1bGVGZWF0dXJlQ2FsbElENDYzMCk7CisgICAgICAgICAgICBydWxlRmVhdHVyZUNhbGxJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUZlYXR1cmVDYWxsSUQ0NjM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGZWF0dXJlQ2FsbElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMDQ6MTogcnVsZUZlYXR1cmVDYWxsSUQgOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUZlYXR1cmVDYWxsSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIwODoyOiAoICggKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMDk6MTogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMDk6MTogKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMTA6MTogKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMTE6MTogKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIxMToyOiBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlc19pbl9ydWxlRmVhdHVyZUNhbGxJRDQ2NjMpOworICAgICAgICAgICAgcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVGZWF0dXJlQ2FsbElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUlkT3JTdXBlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjIzOjE6IGVudHJ5UnVsZUlkT3JTdXBlciA6IHJ1bGVJZE9yU3VwZXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVJZE9yU3VwZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIyNDoxOiAoIHJ1bGVJZE9yU3VwZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMjU6MTogcnVsZUlkT3JTdXBlciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSWRPclN1cGVyX2luX2VudHJ5UnVsZUlkT3JTdXBlcjQ2OTApOworICAgICAgICAgICAgcnVsZUlkT3JTdXBlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSWRPclN1cGVyNDY5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSWRPclN1cGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVJZE9yU3VwZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIzMjoxOiBydWxlSWRPclN1cGVyIDogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjM2OjI6ICggKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjM3OjE6ICggKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMzc6MTogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIzODoxOiAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMzk6MTogKCBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjM5OjI6IHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlc19pbl9ydWxlSWRPclN1cGVyNDcyMyk7CisgICAgICAgICAgICBydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVJZE9yU3VwZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjUxOjE6IGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwgOiBydWxlWENvbnN0cnVjdG9yQ2FsbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1MjoxOiAoIHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjUzOjE6IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENvbnN0cnVjdG9yQ2FsbF9pbl9lbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsNDc1MCk7CisgICAgICAgICAgICBydWxlWENvbnN0cnVjdG9yQ2FsbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGw0NzU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ29uc3RydWN0b3JDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNjA6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjY0OjI6ICggKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjY1OjE6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNjU6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI2NjoxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNjc6MTogKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjY3OjI6IHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMF9pbl9ydWxlWENvbnN0cnVjdG9yQ2FsbDQ3ODMpOworICAgICAgICAgICAgcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWENvbnN0cnVjdG9yQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI3OToxOiBlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwgOiBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyODA6MTogKCBydWxlWEJvb2xlYW5MaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjgxOjE6IHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhCb29sZWFuTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWw0ODEwKTsKKyAgICAgICAgICAgIHJ1bGVYQm9vbGVhbkxpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbDQ4MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEJvb2xlYW5MaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyODg6MTogcnVsZVhCb29sZWFuTGl0ZXJhbCA6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhCb29sZWFuTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjkyOjI6ICggKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyOTM6MTogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjkzOjE6ICggKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI5NDoxOiAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjk1OjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjk1OjI6IHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhCb29sZWFuTGl0ZXJhbDQ4NDMpOworICAgICAgICAgICAgcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhCb29sZWFuTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTnVsbExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMwNzoxOiBlbnRyeVJ1bGVYTnVsbExpdGVyYWwgOiBydWxlWE51bGxMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE51bGxMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMDg6MTogKCBydWxlWE51bGxMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzA5OjE6IHJ1bGVYTnVsbExpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhOdWxsTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYTnVsbExpdGVyYWw0ODcwKTsKKyAgICAgICAgICAgIHJ1bGVYTnVsbExpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhOdWxsTGl0ZXJhbDQ4NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhOdWxsTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE51bGxMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMTY6MTogcnVsZVhOdWxsTGl0ZXJhbCA6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhOdWxsTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzIwOjI6ICggKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMjE6MTogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzIxOjE6ICggKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMyMjoxOiAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzIzOjE6ICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzIzOjI6IHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhOdWxsTGl0ZXJhbDQ5MDMpOworICAgICAgICAgICAgcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhOdWxsTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzM1OjE6IGVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIDogcnVsZVhOdW1iZXJMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE51bWJlckxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMzNjoxOiAoIHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMzNzoxOiBydWxlWE51bWJlckxpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE51bWJlckxpdGVyYWxfaW5fZW50cnlSdWxlWE51bWJlckxpdGVyYWw0OTMwKTsKKyAgICAgICAgICAgIHJ1bGVYTnVtYmVyTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbDQ5MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVtYmVyTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzQ0OjE6IHJ1bGVYTnVtYmVyTGl0ZXJhbCA6ICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE51bWJlckxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM0ODoyOiAoICggKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNDk6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNDk6MTogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNTA6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNTE6MTogKCBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM1MToyOiBydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWE51bWJlckxpdGVyYWw0OTYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE51bWJlckxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM2MzoxOiBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCA6IHJ1bGVYU3RyaW5nTGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNjQ6MTogKCBydWxlWFN0cmluZ0xpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNjU6MTogcnVsZVhTdHJpbmdMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhTdHJpbmdMaXRlcmFsX2luX2VudHJ5UnVsZVhTdHJpbmdMaXRlcmFsNDk5MCk7CisgICAgICAgICAgICBydWxlWFN0cmluZ0xpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFN0cmluZ0xpdGVyYWw0OTk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN0cmluZ0xpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3MjoxOiBydWxlWFN0cmluZ0xpdGVyYWwgOiAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTdHJpbmdMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNzY6MjogKCAoICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc3OjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc3OjE6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc4OjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc5OjE6ICggcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNzk6MjogcnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzBfaW5fcnVsZVhTdHJpbmdMaXRlcmFsNTAyMyk7CisgICAgICAgICAgICBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhTdHJpbmdMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUeXBlTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzkxOjE6IGVudHJ5UnVsZVhUeXBlTGl0ZXJhbCA6IHJ1bGVYVHlwZUxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM5MjoxOiAoIHJ1bGVYVHlwZUxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOTM6MTogcnVsZVhUeXBlTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFR5cGVMaXRlcmFsX2luX2VudHJ5UnVsZVhUeXBlTGl0ZXJhbDUwNTApOworICAgICAgICAgICAgcnVsZVhUeXBlTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFR5cGVMaXRlcmFsNTA1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFR5cGVMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVHlwZUxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQwMDoxOiBydWxlWFR5cGVMaXRlcmFsIDogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFR5cGVMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MDQ6MjogKCAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQwNToxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MDU6MTogKCAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDA2OjE6ICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MDc6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MDc6MjogcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWFR5cGVMaXRlcmFsNTA4Myk7CisgICAgICAgICAgICBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFR5cGVMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxOToxOiBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIDogcnVsZVhUaHJvd0V4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MjA6MTogKCBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQyMToxOiBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhUaHJvd0V4cHJlc3Npb25faW5fZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbjUxMTApOworICAgICAgICAgICAgcnVsZVhUaHJvd0V4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uNTExNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRocm93RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDI4OjE6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhUaHJvd0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQzMjoyOiAoICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQzMzoxOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDMzOjE6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MzQ6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDM1OjE6ICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQzNToyOiBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhUaHJvd0V4cHJlc3Npb241MTQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhUaHJvd0V4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ0NzoxOiBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiA6IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NDg6MTogKCBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NDk6MTogcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhSZXR1cm5FeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uNTE3MCk7CisgICAgICAgICAgICBydWxlWFJldHVybkV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb241MTc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFJldHVybkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ1NjoxOiBydWxlWFJldHVybkV4cHJlc3Npb24gOiAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhSZXR1cm5FeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NjA6MjogKCAoICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDYxOjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDYxOjE6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDYyOjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDYzOjE6ICggcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NjM6MjogcnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhSZXR1cm5FeHByZXNzaW9uNTIwMyk7CisgICAgICAgICAgICBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZXR1cm5FeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NzU6MTogZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gOiBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDc2OjE6ICggcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDc3OjE6IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbjUyMzApOworICAgICAgICAgICAgcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uNTIzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0ODQ6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDg4OjI6ICggKCAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ4OToxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ4OToxOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ5MDoxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ5MToxOiAoIHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDkxOjI6IHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbjUyNjMpOworICAgICAgICAgICAgcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTAzOjE6IGVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUwNDoxOiAoIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUwNToxOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb25faW5fZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb241MjkwKTsKKyAgICAgICAgICAgIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbjUyOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTEyOjE6IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiA6ICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUxNjoyOiAoICggKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MTc6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MTc6MTogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MTg6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MTk6MTogKCBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUxOToyOiBydWxlX19YU3luY2hyb25pemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb241MzIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENhdGNoQ2xhdXNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MzE6MTogZW50cnlSdWxlWENhdGNoQ2xhdXNlIDogcnVsZVhDYXRjaENsYXVzZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDYXRjaENsYXVzZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTMyOjE6ICggcnVsZVhDYXRjaENsYXVzZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUzMzoxOiBydWxlWENhdGNoQ2xhdXNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ2F0Y2hDbGF1c2VfaW5fZW50cnlSdWxlWENhdGNoQ2xhdXNlNTM1MCk7CisgICAgICAgICAgICBydWxlWENhdGNoQ2xhdXNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQ2F0Y2hDbGF1c2U1MzU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDYXRjaENsYXVzZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTQwOjE6IHJ1bGVYQ2F0Y2hDbGF1c2UgOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ2F0Y2hDbGF1c2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU0NDoyOiAoICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTQ1OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU0NToxOiAoICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NDY6MTogKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU0NzoxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU0NzoyOiBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wX2luX3J1bGVYQ2F0Y2hDbGF1c2U1MzgzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2F0Y2hDbGF1c2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTU5OjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWUgOiBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU2MDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTYxOjE6IHJ1bGVRdWFsaWZpZWROYW1lIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lNTQxMCk7CisgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWU1NDE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Njg6MTogcnVsZVF1YWxpZmllZE5hbWUgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTcyOjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTczOjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NzM6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU3NDoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NzU6MTogKCBydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTc1OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZTU0NDMpOworICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVOdW1iZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU4NzoxOiBlbnRyeVJ1bGVOdW1iZXIgOiBydWxlTnVtYmVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1OTE6MTogKCBydWxlTnVtYmVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTkyOjE6IHJ1bGVOdW1iZXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU51bWJlcl9pbl9lbnRyeVJ1bGVOdW1iZXI1NDc1KTsKKyAgICAgICAgICAgIHJ1bGVOdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU51bWJlcjU0ODIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU51bWJlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDI6MTogcnVsZU51bWJlciA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVOdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYwNzoyOiAoICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYwODoxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjA4OjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDk6MTogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjEwOjE6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYxMDoyOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU51bWJlcjU1MTIpOworICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisgICAgICAgICAgICAJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVOdW1iZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjI1OjE6IGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UgOiBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYyNjoxOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjI3OjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtVHlwZVJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlNTU0MSk7CisgICAgICAgICAgICBydWxlSnZtVHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2U1NTQ4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MzQ6MTogcnVsZUp2bVR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYzODoyOiAoICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Mzk6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Mzk6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NDA6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NDE6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY0MToyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc19pbl9ydWxlSnZtVHlwZVJlZmVyZW5jZTU1NzQpOworICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUFycmF5QnJhY2tldHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY1MzoxOiBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIDogcnVsZUFycmF5QnJhY2tldHMgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NTQ6MTogKCBydWxlQXJyYXlCcmFja2V0cyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY1NToxOiBydWxlQXJyYXlCcmFja2V0cyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUFycmF5QnJhY2tldHNfaW5fZW50cnlSdWxlQXJyYXlCcmFja2V0czU2MDEpOworICAgICAgICAgICAgcnVsZUFycmF5QnJhY2tldHMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBcnJheUJyYWNrZXRzNTYwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXJyYXlCcmFja2V0cyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQXJyYXlCcmFja2V0cyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjYyOjE6IHJ1bGVBcnJheUJyYWNrZXRzIDogKCAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUFycmF5QnJhY2tldHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY2NjoyOiAoICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY2NzoxOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjY3OjE6ICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2Njg6MTogKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjY5OjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY2OToyOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfaW5fcnVsZUFycmF5QnJhY2tldHM1NjM0KTsKKyAgICAgICAgICAgIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUFycmF5QnJhY2tldHMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjgxOjE6IGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYgOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY4MjoxOiAoIHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjgzOjE6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEZ1bmN0aW9uVHlwZVJlZl9pbl9lbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmNTY2MSk7CisgICAgICAgICAgICBydWxlWEZ1bmN0aW9uVHlwZVJlZigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWY1NjY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRnVuY3Rpb25UeXBlUmVmIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2OTA6MTogcnVsZVhGdW5jdGlvblR5cGVSZWYgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEZ1bmN0aW9uVHlwZVJlZigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjk0OjI6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjk1OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2OTU6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY5NjoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2OTc6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjk3OjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9pbl9ydWxlWEZ1bmN0aW9uVHlwZVJlZjU2OTQpOworICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEZ1bmN0aW9uVHlwZVJlZiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzA5OjE6IGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjcxMDoxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjcxMToxOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U1NzIxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZTU3MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzE4OjE6IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjcyMjoyOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjM6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjM6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjQ6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjU6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjcyNToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9pbl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U1NzU0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3Mzc6MTogZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzM4OjE6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjczOToxOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlNTc4MSk7CisgICAgICAgICAgICBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U1Nzg4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzQ2OjE6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NTA6MjogKCAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NTE6MTogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc1MToxOiAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzUyOjE6ICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc1MzoxOiAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NTM6MjogcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U1ODE0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc2NToxOiBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgOiBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NjY6MTogKCBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzY3OjE6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U1ODQxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTU4NDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NzQ6MTogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzc4OjI6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3Nzk6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzc5OjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc4MDoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzgxOjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzgxOjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfaW5fcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTU4NzQpOworICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3OTM6MTogZW50cnlSdWxlSnZtVXBwZXJCb3VuZCA6IHJ1bGVKdm1VcHBlckJvdW5kIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtVXBwZXJCb3VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzk0OjE6ICggcnVsZUp2bVVwcGVyQm91bmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3OTU6MTogcnVsZUp2bVVwcGVyQm91bmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1VcHBlckJvdW5kX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmQ1OTAxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1VcHBlckJvdW5kKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtVXBwZXJCb3VuZDU5MDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVVwcGVyQm91bmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgwMjoxOiBydWxlSnZtVXBwZXJCb3VuZCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1VcHBlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MDY6MjogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MDc6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgwNzoxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODA4OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgwOToxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MDk6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX2luX3J1bGVKdm1VcHBlckJvdW5kNTkzNCk7CisgICAgICAgICAgICBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1VcHBlckJvdW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODIxOjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCA6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgyMjoxOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MjM6MTogcnVsZUp2bVVwcGVyQm91bmRBbmRlZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtVXBwZXJCb3VuZEFuZGVkX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZDU5NjEpOworICAgICAgICAgICAgcnVsZUp2bVVwcGVyQm91bmRBbmRlZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkNTk2OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1VcHBlckJvdW5kQW5kZWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgzMDoxOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MzQ6MjogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgzNToxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4MzU6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODM2OjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4Mzc6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4Mzc6MjogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9pbl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkNTk5NCk7CisgICAgICAgICAgICBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtVXBwZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg0OToxOiBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIDogcnVsZUp2bUxvd2VyQm91bmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4NTA6MTogKCBydWxlSnZtTG93ZXJCb3VuZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg1MToxOiBydWxlSnZtTG93ZXJCb3VuZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bUxvd2VyQm91bmRfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZDYwMjEpOworICAgICAgICAgICAgcnVsZUp2bUxvd2VyQm91bmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Mb3dlckJvdW5kNjAyOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtTG93ZXJCb3VuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODU4OjE6IHJ1bGVKdm1Mb3dlckJvdW5kIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg2MjoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg2MzoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODYzOjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4NjQ6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODY1OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg2NToyOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfaW5fcnVsZUp2bUxvd2VyQm91bmQ2MDU0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bUxvd2VyQm91bmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4Nzc6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIDogcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODc4OjE6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg3OToxOiBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Mb3dlckJvdW5kQW5kZWRfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkNjA4MSk7CisgICAgICAgICAgICBydWxlSnZtTG93ZXJCb3VuZEFuZGVkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQ2MDg4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUxvd2VyQm91bmRBbmRlZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODg2OjE6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg5MDoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODkxOjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg5MToxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4OTI6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg5MzoxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg5MzoyOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX2luX3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQ2MTE0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTA3OjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkwODoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTA5OjE6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkNjE0Myk7CisgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ2MTUwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5MTY6MTogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTIwOjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTIxOjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5MjE6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkyMjoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5MjM6MTogKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTIzOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZDYxNzYpOworICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVWYWxpZElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5MzU6MTogZW50cnlSdWxlVmFsaWRJRCA6IHJ1bGVWYWxpZElEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTM2OjE6ICggcnVsZVZhbGlkSUQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5Mzc6MTogcnVsZVZhbGlkSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX2VudHJ5UnVsZVZhbGlkSUQ2MjAzKTsKKyAgICAgICAgICAgIHJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVmFsaWRJRDYyMTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVZhbGlkSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVZhbGlkSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk0NDoxOiBydWxlVmFsaWRJRCA6ICggUlVMRV9JRCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTQ4OjI6ICggKCBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk0OToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk0OToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk1MDoxOiBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlVmFsaWRJRDYyMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFZhbGlkSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVWYWxpZElEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTY1OjE6IGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiA6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk2NjoxOiAoIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5Njc6MTogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEltcG9ydERlY2xhcmF0aW9uX2luX2VudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbjYyNjQpOworICAgICAgICAgICAgcnVsZVhJbXBvcnREZWNsYXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uNjI3MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYSW1wb3J0RGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk3NDoxOiBydWxlWEltcG9ydERlY2xhcmF0aW9uIDogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEltcG9ydERlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5Nzg6MjogKCAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk3OToxOiAoICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5Nzk6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTgwOjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5ODE6MTogKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5ODE6MjogcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMF9pbl9ydWxlWEltcG9ydERlY2xhcmF0aW9uNjI5Nyk7CisgICAgICAgICAgICBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEltcG9ydERlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTkzOjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCA6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk5NDoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5OTU6MTogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDYzMjQpOworICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0NjMzMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAwMjoxOiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IDogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMDY6MjogKCAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAwNzoxOiAoICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMDc6MTogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDA4OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKSAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDA4OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAwOToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDEwOjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDEwOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfaW5fcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDYzNTkpOworICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAxMzoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDE0OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDE1OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApKgorICAgICAgICAgICAgbG9vcDM6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBM18wPT1SVUxFX0lEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBM18yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzI9PTQzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMTU6MjogcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzBfaW5fcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDYzNzEpOworICAgICAgICAgICAgCSAgICBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUxlZ2VuZFBsYWNlbWVudEVudW0iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAyOToxOiBydWxlTGVnZW5kUGxhY2VtZW50RW51bSA6ICggKCBydWxlX19MZWdlbmRQbGFjZW1lbnRFbnVtX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlTGVnZW5kUGxhY2VtZW50RW51bSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDMzOjE6ICggKCAoIHJ1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAzNDoxOiAoICggcnVsZV9fTGVnZW5kUGxhY2VtZW50RW51bV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAzNDoxOiAoICggcnVsZV9fTGVnZW5kUGxhY2VtZW50RW51bV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAzNToxOiAoIHJ1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzAzNjoxOiAoIHJ1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDM2OjI6IHJ1bGVfX0xlZ2VuZFBsYWNlbWVudEVudW1fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fTGVnZW5kUGxhY2VtZW50RW51bV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVMZWdlbmRQbGFjZW1lbnRFbnVtNjQxMSk7CisgICAgICAgICAgICBydWxlX19MZWdlbmRQbGFjZW1lbnRFbnVtX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUxlZ2VuZFBsYWNlbWVudEVudW0iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVRvZ2dsZVR5cGVFbnVtIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNDg6MTogcnVsZVRvZ2dsZVR5cGVFbnVtIDogKCAoIHJ1bGVfX1RvZ2dsZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlVG9nZ2xlVHlwZUVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA1MjoxOiAoICggKCBydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDUzOjE6ICggKCBydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA1MzoxOiAoICggcnVsZV9fVG9nZ2xlVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNTQ6MTogKCBydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VG9nZ2xlVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA1NToxOiAoIHJ1bGVfX1RvZ2dsZVR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA1NToyOiBydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Ub2dnbGVUeXBlRW51bV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVUb2dnbGVUeXBlRW51bTY0NDcpOworICAgICAgICAgICAgcnVsZV9fVG9nZ2xlVHlwZUVudW1fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVRvZ2dsZVR5cGVFbnVtIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUb29sdGlwTG9jYXRpb25FbnVtIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNjc6MTogcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gOiAoICggcnVsZV9fVG9vbHRpcExvY2F0aW9uRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA3MToxOiAoICggKCBydWxlX19Ub29sdGlwTG9jYXRpb25FbnVtX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNzI6MTogKCAoIHJ1bGVfX1Rvb2x0aXBMb2NhdGlvbkVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNzI6MTogKCAoIHJ1bGVfX1Rvb2x0aXBMb2NhdGlvbkVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNzM6MTogKCBydWxlX19Ub29sdGlwTG9jYXRpb25FbnVtX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNzQ6MTogKCBydWxlX19Ub29sdGlwTG9jYXRpb25FbnVtX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA3NDoyOiBydWxlX19Ub29sdGlwTG9jYXRpb25FbnVtX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1Rvb2x0aXBMb2NhdGlvbkVudW1fX0FsdGVybmF0aXZlc19pbl9ydWxlVG9vbHRpcExvY2F0aW9uRW51bTY0ODMpOworICAgICAgICAgICAgcnVsZV9fVG9vbHRpcExvY2F0aW9uRW51bV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVUb29sdGlwTG9jYXRpb25FbnVtIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSZW5kZXJUeXBlRW51bSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDg2OjE6IHJ1bGVSZW5kZXJUeXBlRW51bSA6ICggKCBydWxlX19SZW5kZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJlbmRlclR5cGVFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwOTA6MTogKCAoICggcnVsZV9fUmVuZGVyVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA5MToxOiAoICggcnVsZV9fUmVuZGVyVHlwZUVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwOTE6MTogKCAoIHJ1bGVfX1JlbmRlclR5cGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDkyOjE6ICggcnVsZV9fUmVuZGVyVHlwZUVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwOTM6MTogKCBydWxlX19SZW5kZXJUeXBlRW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwOTM6MjogcnVsZV9fUmVuZGVyVHlwZUVudW1fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUmVuZGVyVHlwZUVudW1fX0FsdGVybmF0aXZlc19pbl9ydWxlUmVuZGVyVHlwZUVudW02NTE5KTsKKyAgICAgICAgICAgIHJ1bGVfX1JlbmRlclR5cGVFbnVtX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSZW5kZXJUeXBlRW51bSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDQ6MTogcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlcyA6ICggKCBydWxlQ2hhcnRCYXIgKSB8ICggcnVsZUNoYXJ0TGluZSApIHwgKCBydWxlQ2hhcnRQaWUgKSB8ICggcnVsZUNoYXJ0RG9udXQgKSB8ICggcnVsZUNoYXJ0QnViYmxlICkgfCAoIHJ1bGVDaGFydEdhdWdlICkgfCAoIHJ1bGVDaGFydFRyZWUgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEwODoxOiAoICggcnVsZUNoYXJ0QmFyICkgfCAoIHJ1bGVDaGFydExpbmUgKSB8ICggcnVsZUNoYXJ0UGllICkgfCAoIHJ1bGVDaGFydERvbnV0ICkgfCAoIHJ1bGVDaGFydEJ1YmJsZSApIHwgKCBydWxlQ2hhcnRHYXVnZSApIHwgKCBydWxlQ2hhcnRUcmVlICkgKQorICAgICAgICAgICAgaW50IGFsdDQ9NzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA3NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9NTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDk6MTogKCBydWxlQ2hhcnRCYXIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDk6MTogKCBydWxlQ2hhcnRCYXIgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTEwOjE6IHJ1bGVDaGFydEJhcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QmFyUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QmFyX2luX3J1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXM2NTU0KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUNoYXJ0QmFyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QmFyUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMTU6NjogKCBydWxlQ2hhcnRMaW5lICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTE1OjY6ICggcnVsZUNoYXJ0TGluZSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMTY6MTogcnVsZUNoYXJ0TGluZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0TGluZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydExpbmVfaW5fcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlczY1NzEpOworICAgICAgICAgICAgICAgICAgICBydWxlQ2hhcnRMaW5lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0TGluZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTIxOjY6ICggcnVsZUNoYXJ0UGllICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTIxOjY6ICggcnVsZUNoYXJ0UGllICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEyMjoxOiBydWxlQ2hhcnRQaWUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydFBpZVBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFBpZV9pbl9ydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzNjU4OCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVDaGFydFBpZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydFBpZVBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTI3OjY6ICggcnVsZUNoYXJ0RG9udXQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMjc6NjogKCBydWxlQ2hhcnREb251dCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMjg6MTogcnVsZUNoYXJ0RG9udXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydERvbnV0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0RG9udXRfaW5fcnVsZV9fQ2hhcnRPcHRpb25fX0FsdGVybmF0aXZlczY2MDUpOworICAgICAgICAgICAgICAgICAgICBydWxlQ2hhcnREb251dCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydERvbnV0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMzM6NjogKCBydWxlQ2hhcnRCdWJibGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMzM6NjogKCBydWxlQ2hhcnRCdWJibGUgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTM0OjE6IHJ1bGVDaGFydEJ1YmJsZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QnViYmxlUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QnViYmxlX2luX3J1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXM2NjIyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUNoYXJ0QnViYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QnViYmxlUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMzk6NjogKCBydWxlQ2hhcnRHYXVnZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEzOTo2OiAoIHJ1bGVDaGFydEdhdWdlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0MDoxOiBydWxlQ2hhcnRHYXVnZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRHYXVnZV9pbl9ydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzNjYzOSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVDaGFydEdhdWdlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0NTo2OiAoIHJ1bGVDaGFydFRyZWUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNDU6NjogKCBydWxlQ2hhcnRUcmVlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0NjoxOiBydWxlQ2hhcnRUcmVlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRUcmVlUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0VHJlZV9pbl9ydWxlX19DaGFydE9wdGlvbl9fQWx0ZXJuYXRpdmVzNjY1Nik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVDaGFydFRyZWUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRUcmVlUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX0NoYXJ0T3B0aW9uX19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fQ2hhcnRCdWJibGVfX0FsdGVybmF0aXZlc18yXzEiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE1NjoxOiBydWxlX19DaGFydEJ1YmJsZV9fQWx0ZXJuYXRpdmVzXzJfMSA6ICggKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19HcmFkaWVudEFzc2lnbm1lbnRfMl8xXzAgKSApIHwgKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQ2hhcnRCdWJibGVfX0FsdGVybmF0aXZlc18yXzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE2MDoxOiAoICggKCBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wICkgKSB8ICggKCBydWxlX19DaGFydEJ1YmJsZV9fVHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xICkgKSApCisgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNV8wPT0xMzcpICkgeworICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE1XzA9PTEzOCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NT0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTYxOjE6ICggKCBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNjE6MTogKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19HcmFkaWVudEFzc2lnbm1lbnRfMl8xXzAgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNjI6MTogKCBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcmFkaWVudEFzc2lnbm1lbnRfMl8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNjM6MTogKCBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE2MzoyOiBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQ2hhcnRCdWJibGVfX0dyYWRpZW50QXNzaWdubWVudF8yXzFfMF9pbl9ydWxlX19DaGFydEJ1YmJsZV9fQWx0ZXJuYXRpdmVzXzJfMTY2ODgpOworICAgICAgICAgICAgICAgICAgICBydWxlX19DaGFydEJ1YmJsZV9fR3JhZGllbnRBc3NpZ25tZW50XzJfMV8wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEdyYWRpZW50QXNzaWdubWVudF8yXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNjc6NjogKCAoIHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE2Nzo2OiAoICggcnVsZV9fQ2hhcnRCdWJibGVfX1RyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE2ODoxOiAoIHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFRyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE2OToxOiAoIHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTY5OjI6IHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydEJ1YmJsZV9fVHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xX2luX3J1bGVfX0NoYXJ0QnViYmxlX19BbHRlcm5hdGl2ZXNfMl8xNjcwNik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX0NoYXJ0QnViYmxlX19UcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzEoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fQ2hhcnRCdWJibGVfX0FsdGVybmF0aXZlc18yXzEiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fQ2hhcnRUcmVlX19BbHRlcm5hdGl2ZXNfMiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTc4OjE6IHJ1bGVfX0NoYXJ0VHJlZV9fQWx0ZXJuYXRpdmVzXzIgOiAoICggKCBydWxlX19DaGFydFRyZWVfX01hcEFzc2lnbm1lbnRfMl8wICkgKSB8ICggKCBydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fQ2hhcnRUcmVlX19BbHRlcm5hdGl2ZXNfMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTgyOjE6ICggKCAoIHJ1bGVfX0NoYXJ0VHJlZV9fTWFwQXNzaWdubWVudF8yXzAgKSApIHwgKCAoIHJ1bGVfX0NoYXJ0VHJlZV9fQ29sbGFwc2libGVBc3NpZ25tZW50XzJfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTZfMD09MTQyKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ2PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBNl8wPT0xNDMpICkgeworICAgICAgICAgICAgICAgIGFsdDY9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA2LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE4MzoxOiAoICggcnVsZV9fQ2hhcnRUcmVlX19NYXBBc3NpZ25tZW50XzJfMCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTgzOjE6ICggKCBydWxlX19DaGFydFRyZWVfX01hcEFzc2lnbm1lbnRfMl8wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTg0OjE6ICggcnVsZV9fQ2hhcnRUcmVlX19NYXBBc3NpZ25tZW50XzJfMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldE1hcEFzc2lnbm1lbnRfMl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTg1OjE6ICggcnVsZV9fQ2hhcnRUcmVlX19NYXBBc3NpZ25tZW50XzJfMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxODU6MjogcnVsZV9fQ2hhcnRUcmVlX19NYXBBc3NpZ25tZW50XzJfMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0NoYXJ0VHJlZV9fTWFwQXNzaWdubWVudF8yXzBfaW5fcnVsZV9fQ2hhcnRUcmVlX19BbHRlcm5hdGl2ZXNfMjY3MzkpOworICAgICAgICAgICAgICAgICAgICBydWxlX19DaGFydFRyZWVfX01hcEFzc2lnbm1lbnRfMl8wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRNYXBBc3NpZ25tZW50XzJfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxODk6NjogKCAoIHJ1bGVfX0NoYXJ0VHJlZV9fQ29sbGFwc2libGVBc3NpZ25tZW50XzJfMSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTg5OjY6ICggKCBydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxOTA6MTogKCBydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRDb2xsYXBzaWJsZUFzc2lnbm1lbnRfMl8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTkxOjE6ICggcnVsZV9fQ2hhcnRUcmVlX19Db2xsYXBzaWJsZUFzc2lnbm1lbnRfMl8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE5MToyOiBydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzFfaW5fcnVsZV9fQ2hhcnRUcmVlX19BbHRlcm5hdGl2ZXNfMjY3NTcpOworICAgICAgICAgICAgICAgICAgICBydWxlX19DaGFydFRyZWVfX0NvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldENvbGxhcHNpYmxlQXNzaWdubWVudF8yXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19DaGFydFRyZWVfX0FsdGVybmF0aXZlc18yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMDA6MTogcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZUNoYXJ0QXhpcyApIHwgKCBydWxlQ2hhcnRMZWdlbmQgKSB8ICggcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX0NoYXJ0RWxlbWVudF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMDQ6MTogKCAoIHJ1bGVDaGFydEF4aXMgKSB8ICggcnVsZUNoYXJ0TGVnZW5kICkgfCAoIHJ1bGVDaGFydEhpZ2hsaWdodGVyICkgKQorICAgICAgICAgICAgaW50IGFsdDc9MzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDc9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIwNToxOiAoIHJ1bGVDaGFydEF4aXMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMDU6MTogKCBydWxlQ2hhcnRBeGlzICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIwNjoxOiBydWxlQ2hhcnRBeGlzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0QXhpc1BhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydEF4aXNfaW5fcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXM2NzkwKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUNoYXJ0QXhpcygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRBeGlzUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMTE6NjogKCBydWxlQ2hhcnRMZWdlbmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMTE6NjogKCBydWxlQ2hhcnRMZWdlbmQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjEyOjE6IHJ1bGVDaGFydExlZ2VuZAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydExlZ2VuZFBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydExlZ2VuZF9pbl9ydWxlX19DaGFydEVsZW1lbnRfX0FsdGVybmF0aXZlczY4MDcpOworICAgICAgICAgICAgICAgICAgICBydWxlQ2hhcnRMZWdlbmQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0TGVnZW5kUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMTc6NjogKCBydWxlQ2hhcnRIaWdobGlnaHRlciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIxNzo2OiAoIHJ1bGVDaGFydEhpZ2hsaWdodGVyICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIxODoxOiBydWxlQ2hhcnRIaWdobGlnaHRlcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRDaGFydEhpZ2hsaWdodGVyUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SGlnaGxpZ2h0ZXJfaW5fcnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXM2ODI0KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0SGlnaGxpZ2h0ZXJQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fQ2hhcnRFbGVtZW50X19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIyODoxOiBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjMyOjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDg9MjsKKyAgICAgICAgICAgIGFsdDggPSBkZmE4LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIzMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMzM6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIzNDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMzU6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjM1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9pbl9ydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMTY4NTYpOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjM5OjY6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMzk6NjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyNDA6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyNDE6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI0MToyOiBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMV9pbl9ydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMTY4NzQpOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8zXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjUwOjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2ludGVybmFsL0NoYXJ0RFNMQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9pbnRlcm5hbC9DaGFydERTTEFjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2FiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9pbnRlcm5hbC9DaGFydERTTEFjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5hcGFjaGUubG9nNGouTG9nZ2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC5TaGFyZWRTdGF0ZU1vZHVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51dGlsLk1vZHVsZXMyOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5NYXBzOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lk1vZHVsZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHdhcyBnZW5lcmF0ZWQuIEN1c3RvbWl6YXRpb25zIHNob3VsZCBvbmx5IGhhcHBlbiBpbiBhIG5ld2x5CisgKiBpbnRyb2R1Y2VkIHN1YmNsYXNzLiAKKyAqLworcHVibGljIGNsYXNzIENoYXJ0RFNMQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9DSEFSVF9DSEFSVERTTCA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIjsKKwkKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihDaGFydERTTEFjdGl2YXRvci5jbGFzcyk7CisJCisJcHJpdmF0ZSBzdGF0aWMgQ2hhcnREU0xBY3RpdmF0b3IgSU5TVEFOQ0U7CisJCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbmplY3Rvcj4gaW5qZWN0b3JzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKE1hcHMuPFN0cmluZywgSW5qZWN0b3I+IG5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDEpKTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJSU5TVEFOQ0UgPSB0aGlzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluamVjdG9ycy5jbGVhcigpOworCQlJTlNUQU5DRSA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgQ2hhcnREU0xBY3RpdmF0b3IgZ2V0SW5zdGFuY2UoKSB7CisJCXJldHVybiBJTlNUQU5DRTsKKwl9CisJCisJcHVibGljIEluamVjdG9yIGdldEluamVjdG9yKFN0cmluZyBsYW5ndWFnZSkgeworCQlzeW5jaHJvbml6ZWQgKGluamVjdG9ycykgeworCQkJSW5qZWN0b3IgaW5qZWN0b3IgPSBpbmplY3RvcnMuZ2V0KGxhbmd1YWdlKTsKKwkJCWlmIChpbmplY3RvciA9PSBudWxsKSB7CisJCQkJaW5qZWN0b3JzLnB1dChsYW5ndWFnZSwgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcihsYW5ndWFnZSkpOworCQkJfQorCQkJcmV0dXJuIGluamVjdG9yOworCQl9CisJfQorCQorCXByb3RlY3RlZCBJbmplY3RvciBjcmVhdGVJbmplY3RvcihTdHJpbmcgbGFuZ3VhZ2UpIHsKKwkJdHJ5IHsKKwkJCU1vZHVsZSBydW50aW1lTW9kdWxlID0gZ2V0UnVudGltZU1vZHVsZShsYW5ndWFnZSk7CisJCQlNb2R1bGUgc2hhcmVkU3RhdGVNb2R1bGUgPSBnZXRTaGFyZWRTdGF0ZU1vZHVsZSgpOworCQkJTW9kdWxlIHVpTW9kdWxlID0gZ2V0VWlNb2R1bGUobGFuZ3VhZ2UpOworCQkJTW9kdWxlIG1lcmdlZE1vZHVsZSA9IE1vZHVsZXMyLm1peGluKHJ1bnRpbWVNb2R1bGUsIHNoYXJlZFN0YXRlTW9kdWxlLCB1aU1vZHVsZSk7CisJCQlyZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobWVyZ2VkTW9kdWxlKTsKKwkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKwkJCWxvZ2dlci5lcnJvcigiRmFpbGVkIHRvIGNyZWF0ZSBpbmplY3RvciBmb3IgIiArIGxhbmd1YWdlKTsKKwkJCWxvZ2dlci5lcnJvcihlLmdldE1lc3NhZ2UoKSwgZSk7CisJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRmFpbGVkIHRvIGNyZWF0ZSBpbmplY3RvciBmb3IgIiArIGxhbmd1YWdlLCBlKTsKKwkJfQorCX0KKworCXByb3RlY3RlZCBNb2R1bGUgZ2V0UnVudGltZU1vZHVsZShTdHJpbmcgZ3JhbW1hcikgeworCQlpZiAoT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9DSEFSVF9DSEFSVERTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFJ1bnRpbWVNb2R1bGUoKTsKKwkJfQorCQkKKwkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihncmFtbWFyKTsKKwl9CisJCisJcHJvdGVjdGVkIE1vZHVsZSBnZXRVaU1vZHVsZShTdHJpbmcgZ3JhbW1hcikgeworCQlpZiAoT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9DSEFSVF9DSEFSVERTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5DaGFydERTTFVpTW9kdWxlKHRoaXMpOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdyYW1tYXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFNoYXJlZFN0YXRlTW9kdWxlKCkgeworCQlyZXR1cm4gbmV3IFNoYXJlZFN0YXRlTW9kdWxlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9DaGFydERTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2RhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9DaGFydERTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpOworCitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb25zdGFudHMuR2VuZXJhdG9yQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcjsKKworcHVibGljIGNsYXNzIENoYXJ0RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgZXh0ZW5kcyBCYXNpY0RTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yIHsKKwkgCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2hhcnREU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBJTlNUQU5DRSA9IG5ldyBDaGFydERTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShHZW5lcmF0b3JDb25zdGFudHMuSTE4Tl9SRVNPVVJDRV9GVUxMX0JVTkRMRV9OQU1FLCBnZXRMb2NhbGUoKSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM2YzRhYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xFT2JqZWN0SG92ZXIuamF2YQpAQCAtMCwwICsxLDI1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlcjsKKworcHVibGljIGNsYXNzIENoYXJ0RFNMRU9iamVjdEhvdmVyIGV4dGVuZHMgQmFzaWNEU0xFT2JqZWN0SG92ZXIgeworCQorCUBPdmVycmlkZQorCXB1YmxpYyBJRU9iamVjdEhvdmVyUHJvdmlkZXIgZ2V0SG92ZXJQcm92aWRlcigpIHsKKwkJcmV0dXJuIENoYXJ0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuaW5zdGFuY2UoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMyZDg1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIENoYXJ0RFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzaWNEU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgeworCSAKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciBJTlNUQU5DRTsKKworICAgIHB1YmxpYyBzdGF0aWMgQ2hhcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2hhcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIElOU1RBTkNFID0gdGhpczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgZ2V0VHJhbnNsYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIENoYXJ0RFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuaW5zdGFuY2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOTRhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL0NoYXJ0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuaHRtbC5JRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlclByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xFT2JqZWN0SG92ZXJQcm92aWRlciBleHRlbmRzIEJhc2ljRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgeworCSAKKyAgICBwcml2YXRlIHN0YXRpYyBDaGFydERTTEVPYmplY3RIb3ZlclByb3ZpZGVyIElOU1RBTkNFOworCisgICAgcHVibGljIHN0YXRpYyBDaGFydERTTEVPYmplY3RIb3ZlclByb3ZpZGVyIGluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorCisgICAgcHVibGljIENoYXJ0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIElOU1RBTkNFID0gdGhpczsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgZ2V0RG9jdW1lbnRhdGlvbkhvdmVyUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBDaGFydERTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5pbnN0YW5jZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xVaU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9DaGFydERTTFVpTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcyNGRiMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvQ2hhcnREU0xVaU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5odG1sLklFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xVaU1vZHVsZUhlbHBlcjsKKworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgd2l0aGluIHRoZSBJREUuCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydERTTFVpTW9kdWxlIGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5BYnN0cmFjdENoYXJ0RFNMVWlNb2R1bGUgeworCQorCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDaGFydERTTFVpTW9kdWxlLmNsYXNzKTsKKwkKKwlwdWJsaWMgQ2hhcnREU0xVaU1vZHVsZShBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbikgeworCQlzdXBlcihwbHVnaW4pOworCSAgICBCYXNpY0RTTFVpTW9kdWxlSGVscGVyLnVuaXRUZXN0VGVtcGxhdGVzKHBsdWdpbiwgTE9HR0VSKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkgICAgcmV0dXJuIENoYXJ0RFNMRU9iamVjdEhvdmVyLmNsYXNzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElFT2JqZWN0SG92ZXJQcm92aWRlcj4gYmluZElFT2JqZWN0SG92ZXJQcm92aWRlcigpIHsKKwkgICAgcmV0dXJuIENoYXJ0RFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuY2xhc3M7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcj4gYmluZElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIoKSB7CisJICAgICByZXR1cm4gQ2hhcnREU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L0NoYXJ0RFNMUHJvcG9zYWxQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9DaGFydERTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNiMTM4YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9DaGFydERTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwxNjIgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3R5bGVkU3RyaW5nCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5jb250ZW50YXNzaXN0LkJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5SZW5kZXJUeXBlRW51bQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQXNzaWdubWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LktleXdvcmQKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi51aS5jb250ZW50YXNzaXN0LlRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LlJlcGxhY2VtZW50VGV4dEFwcGxpZXIKKworY2xhc3MgTXlSZXBsYWNlbWVudFRleHRBcHBsaWVyIGV4dGVuZHMgUmVwbGFjZW1lbnRUZXh0QXBwbGllciB7CisJdmFyIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQKKworCWRlZiBzZXRDb250ZXh0KENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKwkJdGhpcy5jb250ZXh0ID0gY29udGV4dAorCX0KKworCS8vIHRoaXMgd2lsbCBpbmplY3QgYSBjb2xvciBwaWNrZXIgd2hlbiBzZWxlY3RpbmcgdGhlIGNvbG9yIHBpY2tlciBwcm9wb3NhbAkKKwlvdmVycmlkZSBnZXRBY3R1YWxSZXBsYWNlbWVudFN0cmluZyhDb25maWd1cmFibGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKKwkJdmFyIGRpc3BsYXkgPSBjb250ZXh0LmdldFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCk7CisJCXZhciBjb2xvckRpYWxvZyA9IG5ldyBDb2xvckRpYWxvZyhkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCkpOworCQl2YXIgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7CisJCXJldHVybiAiXCIiLmNvbmNhdChuZXdDb2xvci5yZWQudG9TdHJpbmcpLmNvbmNhdCgiLCIpLmNvbmNhdChuZXdDb2xvci5ncmVlbi50b1N0cmluZykuY29uY2F0KCIsIikuY29uY2F0KAorCQkJbmV3Q29sb3IuYmx1ZS50b1N0cmluZykuY29uY2F0KCJcIiIpOworCX0KK30KKworY2xhc3MgQ2hhcnREU0xQcm9wb3NhbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXIgeworCUBJbmplY3QgVGVybWluYWxzUHJvcG9zYWxQcm92aWRlciBwcm92aWRlcgorCUBJbmplY3QgQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyIHByb3ZpZGVySGVscGVyCisKKwlvdmVycmlkZSBwcm90ZWN0ZWQgU3R5bGVkU3RyaW5nIGdldEtleXdvcmREaXNwbGF5U3RyaW5nKEtleXdvcmQga2V5d29yZCkgeworCQlyZXR1cm4gQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyLmdldEtleXdvcmREaXNwbGF5U3RyaW5nKGtleXdvcmQsCisJCQlDaGFydERTTERvY3VtZW50YXRpb25UcmFuc2xhdG9yLmluc3RhbmNlKCkpCisJfQorCisJLyoqCisJICogVGhpcyBvdmVycmlkZSB3aWxsIGVuYWJsZSAxIGxlbmd0aCBub24gbGV0dGVyIGNoYXJhY3RlcnMgYXMga2V5d29yZC4KKwkgKi8KKwlvdmVycmlkZSBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleXdvcmRXb3J0aHlUb1Byb3Bvc2UoS2V5d29yZCBrZXl3b3JkKSB7CisJCXJldHVybiB0cnVlCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVDaGFydFNlZ21lbnRDb2xvcl9SZ2IoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29sb3JQaWNrZXJQcm9wb3NhbChtb2RlbCwgYXNzaWdubWVudCwgY29udGV4dCwgYWNjZXB0b3IpCisJfQorCisJZGVmIGNvbG9yUGlja2VyUHJvcG9zYWwoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJdmFyIHBpY2tDb2xvciA9IGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiUGljayBjb2xvci4uLiIsIGNvbnRleHQpIGFzIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbAorCQlpZiAocGlja0NvbG9yICE9IG51bGwpIHsKKwkJCXZhciBhcHBsaWVyID0gbmV3IE15UmVwbGFjZW1lbnRUZXh0QXBwbGllcigpCisJCQlhcHBsaWVyLnNldENvbnRleHQoY29udGV4dCkKKwkJCXBpY2tDb2xvci5zZXRUZXh0QXBwbGllciA9IGFwcGxpZXIKKwkJfQorCQlhY2NlcHRvci5hY2NlcHQocGlja0NvbG9yKQorCisJCS8vIHByZWRlZmluZWQgY29sb3JzCisJCWFjY2VwdG9yLmFjY2VwdChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjMwLDEyOCw2NFwiIC8qIG9yYW5nZSAqLyIsICJvcmFuZ2UiLCBudWxsLCBjb250ZXh0KSk7CisJCWFjY2VwdG9yLmFjY2VwdChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDE4MiwxODJcIiAvKiBsaWdodCByZWQgKi8iLCAibGlnaHQgcmVkIiwgbnVsbCwgY29udGV4dCkpOworCQlhY2NlcHRvci5hY2NlcHQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjI1NSwwLDBcIiAvKiByZWQgKi8iLCAicmVkIiwgbnVsbCwgY29udGV4dCkpOworCQlhY2NlcHRvci5hY2NlcHQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjIwNCwxMDIsMTAyXCIgLyogZGFyayByZWQgKi8iLCAiZGFyayByZWQiLCBudWxsLCBjb250ZXh0KSk7CisJCWFjY2VwdG9yLmFjY2VwdChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDI1NSwxMjhcIiAvKmxpZ2h0IHllbGxvdyAqLyIsICJsaWdodCB5ZWxsb3ciLCBudWxsLCBjb250ZXh0KSk7CisJCWFjY2VwdG9yLmFjY2VwdChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDI1NSwwXCIgLyogeWVsbG93ICovIiwgInllbGxvdyIsIG51bGwsIGNvbnRleHQpKTsKKwkJYWNjZXB0b3IuYWNjZXB0KGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIxMjgsMTI4LDBcIiAvKiBkYXJrIHllbGxvdyAqLyIsICJkYXJrIHllbGxvdyIsIG51bGwsIGNvbnRleHQpKTsKKwkJYWNjZXB0b3IuYWNjZXB0KGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIxMDIsMjA0LDEwMlwiIC8qIGxpZ2h0IGdyZWVuICovIiwgImxpZ2h0IGdyZWVuIiwgbnVsbCwgY29udGV4dCkpOworCQlhY2NlcHRvci5hY2NlcHQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjAsMjU1LDBcIiAvKiBncmVlbiAqLyIsICJncmVlbiIsIG51bGwsIGNvbnRleHQpKTsKKwkJYWNjZXB0b3IuYWNjZXB0KGNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIxNDcsMTgzLDk1XCIgLyogZGFyayBncmVlbiAqLyIsICJkYXJrIGdyZWVuIiwgbnVsbCwgY29udGV4dCkpOworCQlhY2NlcHRvci5hY2NlcHQoY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjAsMCwwXCIgLyogYmxhY2sgKi8iLCAiYmxhY2siLCBudWxsLCBjb250ZXh0KSk7CisJCWFjY2VwdG9yLmFjY2VwdChjcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDI1NSwyNTVcIiAvKiB3aGl0ZSAqLyIsICJ3aGl0ZSIsIG51bGwsIGNvbnRleHQpKTsKKwl9CisKKwlvdmVycmlkZSBwcm90ZWN0ZWQgaXNWYWxpZFByb3Bvc2FsKFN0cmluZyBwcm9wb3NhbCwgU3RyaW5nIHByZWZpeCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworCQl2YXIgcmVzdWx0ID0gc3VwZXIuaXNWYWxpZFByb3Bvc2FsKHByb3Bvc2FsLCBwcmVmaXgsIGNvbnRleHQpCisJCWlmIChjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpIGluc3RhbmNlb2YgQ2hhcnRBeGlzKSB7CisKKwkJCS8vIGRvIG9ubHkgYWxsb3cgc2hvcnRsYWJlbHMgb24gYSBjYXRlZ29yeSBheGlzCisJCQkvLyBBQ1RVQUxMWSBOT1QgVVNFRCEgSXTCtHMgdXNlIGhhcyB0byBiZSByZXZpZXdlZCEgCisJCQkvLwkJCWlmICgoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBhcyBDaGFydEF4aXMpLnJlbmRlclR5cGUgIT0gUmVuZGVyVHlwZUVudW0uQ0FURUdPUlkpIHsKKwkJCS8vCQkJCXJldHVybiBmYWxzZQorCQkJLy8JCQl9CisJCQlyZXR1cm4gdHJ1ZQorCQl9CisJCXJldHVybiByZXN1bHQKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9RdWFsaWZpZWROYW1lKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlckhlbHBlci5jb21wbGV0ZV9QYWNrYWdlTmFtZShtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yLCB0aGlzKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRBeGlzX0FuZ2xlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXZhciBydWxlQ2FsbCA9IChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpCisJCXZhciBmZWF0dXJlID0gcHJvdmlkZXJIZWxwZXIuZ2V0QXNzaWduZWRGZWF0dXJlKHJ1bGVDYWxsKTsKKwkJcHJvdmlkZXJIZWxwZXIuY3JlYXRlSW50UHJvcG9zYWwoY29udGV4dCwgYWNjZXB0b3IsIHJ1bGVDYWxsLCBmZWF0dXJlLCAwLCAidmFsdWUgYmV0d2VlbiAtMzYwIGFuZCAzNjAiLCB0aGlzKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRCdWJibGVfTXVsdGlwbGllclZhbHVlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwKKwkJQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVySGVscGVyLmNyZWF0ZU51bWJlclByb3Bvc2FsKGNvbnRleHQsIGFjY2VwdG9yLCAoYXNzaWdubWVudC50ZXJtaW5hbCBhcyBSdWxlQ2FsbCksIHRoaXMpCisJfQorCisJb3ZlcnJpZGUgcHVibGljIHZvaWQgY29tcGxldGVDaGFydE51bWJlckludGVydmFsX051bWJlckludGVydmFsVmFsdWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LAorCQlDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfSU5UKG1vZGVsLCAoYXNzaWdubWVudC50ZXJtaW5hbCBhcyBSdWxlQ2FsbCksIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWxlZ2F0ZXMgdG8gVGVybWluYWxzUHJvcG9zYWxQcm92aWRlciAtLS0tLS0tLS0tLS0tLS0tLQorCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lOVChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVyLmNvbXBsZXRlX0lOVChtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yKQorCX0KKworCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lEKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfSUQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9UUkFOU0xBVEFCTEVTVFJJTkcoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsCisJCUlDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfTGFiZWxWYWx1ZShFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsCisJCUNvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlwcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsIChhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkgYXMgUnVsZUNhbGwpLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvbGFiZWxpbmcvQ2hhcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2xhYmVsaW5nL0NoYXJ0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGI0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2xhYmVsaW5nL0NoYXJ0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5sYWJlbGluZworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRU9iamVjdERlc2NyaXB0aW9uCisKKy8qKgorICogUHJvdmlkZXMgbGFiZWxzIGZvciBhIElFT2JqZWN0RGVzY3JpcHRpb25zIGFuZCBJUmVzb3VyY2VEZXNjcmlwdGlvbnMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNsYWJlbFByb3ZpZGVyCisgKi8KK2NsYXNzIENoYXJ0RFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkubGFiZWxpbmcuWGJhc2VEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIgeworCisJLy8gTGFiZWxzIGFuZCBpY29ucyBjYW4gYmUgY29tcHV0ZWQgbGlrZSB0aGlzOgorCQorLy8Jb3ZlcnJpZGUgdGV4dChJRU9iamVjdERlc2NyaXB0aW9uIGVsZSkgeworLy8JCWVsZS5uYW1lCisvLwl9CisvLwkgCisvLwlvdmVycmlkZSBpbWFnZShJRU9iamVjdERlc2NyaXB0aW9uIGVsZSkgeworLy8JCWVsZS5FQ2xhc3MubmFtZSArICcuZ2lmJworLy8JfQkgCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2xhYmVsaW5nL0NoYXJ0RFNMTGFiZWxQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvbGFiZWxpbmcvQ2hhcnREU0xMYWJlbFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzOTk1MWUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2xhYmVsaW5nL0NoYXJ0RFNMTGFiZWxQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDExOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmxhYmVsaW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmxhYmVsaW5nLkJhc2ljRFNMTGFiZWxQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TW9kZWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERvbnV0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEludGVydmFsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFJhbmdlRWxlbWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRTZWdtZW50Q29sb3IKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0T3B0aW9uCisKKy8qKgorICogUHJvdmlkZXMgbGFiZWxzIGZvciBhIEVPYmplY3RzLgorICogCisgKiBzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjbGFiZWxQcm92aWRlcgorICovCitjbGFzcyBDaGFydERTTExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNpY0RTTExhYmVsUHJvdmlkZXIgeworCisJQEluamVjdAorCW5ldyhvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGUpIHsKKwkJc3VwZXIoZGVsZWdhdGUpOworCX0KKworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKioJCQlQcm92aWRlcyBvdXRsaW5lIHRleHQgZm9yIENoYXJ0LURTTC4KKwkgKgorCSAqCQkJVXNlcyBjb21tb24gKGRlZmF1bHQpIHRleHQgZm9yIHBhY2thZ2UgYW5kIGZvciBpbXBvcnQgZWxlbWVudC4KKwkgKgorCSAqCUBzZWUJQmFzaWNEU0xMYWJlbFByb3ZpZGVyLnRleHQoT2JqZWN0KQorCSAqIAorCSAqCUBwYXJhbQlvCUN1cnJlbnQgb3V0bGluZSBlbGVtZW50CisJICoKKwkgKglAcmV0dXJuCVN0cmluZyBpbnN0YW5jZS4KKwkgKgorCSAqCUBzaW5jZQlARCAxNTA5MjksIGd1CisJICoJQGRhdGUJQEQgeXltbWRkLCBuYW1lCisJICovIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkgb3ZlcnJpZGUgdGV4dCAoIE9iamVjdCBvICkgeworCQlzd2l0Y2ggKG8pIHsKKwkJCUNoYXJ0CQkJCToJZ2VuZXJhdGVUZXh0KCBvLCAnY2hhcnQnCQksIChvIGFzIENoYXJ0KS5uYW1lICkKKwkJCUNoYXJ0QmFyCQkJOglnZW5lcmF0ZVRleHQoIG8sICdvcHRpb24gYmFyJyAgICkKKwkJCUNoYXJ0TGluZQkJCToJZ2VuZXJhdGVUZXh0KCBvLCAnb3B0aW9uIGxpbmUnICApCisJCQlDaGFydFBpZQkJCToJZ2VuZXJhdGVUZXh0KCBvLCAnb3B0aW9uIHBpZScgICApCisJCQlDaGFydERvbnV0CQkJOglnZW5lcmF0ZVRleHQoIG8sICdvcHRpb24gZG9udXQnICkKKwkJCUNoYXJ0QnViYmxlCQkJOglnZW5lcmF0ZVRleHQoIG8sICdvcHRpb24gYnViYmxlJykKKwkJCUNoYXJ0R2F1Z2UJCQk6CWdlbmVyYXRlVGV4dCggbywgJ29wdGlvbiBnYXVnZScgKQorCQkJQ2hhcnRUcmVlCQkJOglnZW5lcmF0ZVRleHQoIG8sICdvcHRpb24gdHJlZScgICkKKwkJCUNoYXJ0SW50ZXJ2YWwJCToJZ2VuZXJhdGVUZXh0KCBvLCAnaW50ZXJ2YWwnICAgICApCisJCQlDaGFydFNlZ21lbnRDb2xvcgk6CWdlbmVyYXRlVGV4dCggbywgJ3NlZ21lbnQgY29sb3InLCBTdHJpbmcuZm9ybWF0KCAiUkdCKCVzKSIsIChvIGFzIENoYXJ0U2VnbWVudENvbG9yKS5yZ2IgKSApCisJCQlDaGFydFJhbmdlRWxlbWVudAk6CWdlbmVyYXRlVGV4dCggbywgJ3JhbmdlIGVsZW1lbnQnKQorCQkJQ2hhcnREYXRhbWFydAkJOglnZW5lcmF0ZVRleHQoIG8sICdkYXRhbWFydCcgICAgICwgKG8gYXMgQ2hhcnREYXRhbWFydCkuZGF0YW1hcnRSZWYubmFtZSApCisJCQlDaGFydEF4aXMJCQk6CWdlbmVyYXRlVGV4dCggbywgJ2F4aXMnICAgICAgICAgKQorCQkJQ2hhcnRMZWdlbmQJCQk6CWdlbmVyYXRlVGV4dCggbywgJ2xlZ2VuZCcgICAgICAgKQorCQkJQ2hhcnRIaWdobGlnaHRlcgk6CWdlbmVyYXRlVGV4dCggbywgJ3Rvb2x0aXAnICAgICAgKQorCQkJZGVmYXVsdAkJCQk6CXN1cGVyLnRleHQoIG8gKQorCQl9CisJfQorCisJLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCS8qKgkJCVByb3ZpZGVzIG91dGxpbmUgaW1hZ2VzIGZvciBDaGFydC1EU0wuCisJICoKKwkgKgkJCVVzZXMgY29tbW9uIChkZWZhdWx0KSBpbWFnZSBmb3IgcGFja2FnZSBhbmQgZm9yIGltcG9ydCBlbGVtZW50LgorCSAqCisJICoJQHNlZQlCYXNpY0RTTExhYmVsUHJvdmlkZXIuaW1hZ2UoT2JqZWN0KQorCSAqIAorCSAqCUBwYXJhbQlvCUN1cnJlbnQgb3V0bGluZSBlbGVtZW50CisJICoKKwkgKglAcmV0dXJuCUltYWdlIGluc3RhbmNlIGlmIHJlcXVlc3RlZCBpbWFnZSBmaWxlIHdhcyBmb3VuZCwgcmV0dXJuIHZhbHVlIG9mIG92ZXJyaWRkZW4gc3VwZXJjbGFzcworCSAqCQkJbWV0aG9kIG90aGVyd2lzZS4KKwkgKgorCSAqCUBzaW5jZQlARCAxNTA5MjksIGd1CisJICoJQGRhdGUJQEQgeXltbWRkLCBuYW1lCisJICovIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwlvdmVycmlkZSBpbWFnZSAoIE9iamVjdCBvICkgeworCQlzd2l0Y2ggKG8pIHsKKwkJCUNoYXJ0TW9kZWwJCQk6CWdldEludGVybmFsSW1hZ2UoICdtb2RlbC5wbmcnLCBzdXBlci5jbGFzcykKKwkJCUNoYXJ0CQkJCToJZ2V0SW50ZXJuYWxJbWFnZSggJ2RzbF9jaGFydC5wbmcnLCBjbGFzcykKKwkJCUNoYXJ0U2VnbWVudENvbG9yCToJZ2V0Q29sb3JPdXRsaW5lSW1hZ2UoIChvIGFzIENoYXJ0U2VnbWVudENvbG9yKS5yZ2IsIHRydWUgKQorCQkJQ2hhcnRPcHRpb24JCQk6CWdldEludGVybmFsSW1hZ2UoICdkc2xfb3B0aW9uLnBuZycsIGNsYXNzKQorCQkJQ2hhcnRJbnRlcnZhbAkJOglnZXRJbnRlcm5hbEltYWdlKCAnY2hhcnRfaW50ZXJ2YWwucG5nJywgY2xhc3MpCisJCQlDaGFydFJhbmdlRWxlbWVudAk6CWdldEludGVybmFsSW1hZ2UoICdkc2xfcmFuZ2UucG5nJywgY2xhc3MpCisJCQlDaGFydERhdGFtYXJ0CQk6CWdldEludGVybmFsSW1hZ2UoICdkc2xfZGF0YW1hcnQucG5nJywgY2xhc3MpCisJCQlDaGFydEF4aXMJCQk6CWdldEludGVybmFsSW1hZ2UoICdjaGFydF9heGlzLnBuZycsIGNsYXNzKQorCQkJQ2hhcnRMZWdlbmQJCQk6CWdldEludGVybmFsSW1hZ2UoICdjaGFydF9sZWdlbmQucG5nJywgY2xhc3MpCisJCQlDaGFydEhpZ2hsaWdodGVyCToJZ2V0SW50ZXJuYWxJbWFnZSggJ2NoYXJ0X3Rvb2x0aXAucG5nJywgY2xhc3MpCisJCQlkZWZhdWx0CQkJCToJc3VwZXIuaW1hZ2UoIG8gKQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL291dGxpbmUvQ2hhcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9vdXRsaW5lL0NoYXJ0RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWYyNWYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9vdXRsaW5lL0NoYXJ0RFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDI3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkub3V0bGluZQorCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI291dGxpbmUKKyAqLworY2xhc3MgQ2hhcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuaW1wbC5EZWZhdWx0T3V0bGluZVRyZWVQcm92aWRlciB7CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL3F1aWNrZml4L0NoYXJ0RFNMUXVpY2tmaXhQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvcXVpY2tmaXgvQ2hhcnREU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyN2MxMjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL3F1aWNrZml4L0NoYXJ0RFNMUXVpY2tmaXhQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDQwIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkucXVpY2tmaXgKKworLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4LkZpeAorLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lklzc3VlUmVzb2x1dGlvbkFjY2VwdG9yCisvL2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLklzc3VlCisKKy8qKgorICogQ3VzdG9tIHF1aWNrZml4ZXMuCisgKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI3F1aWNrZml4ZXMKKyAqLworY2xhc3MgQ2hhcnREU0xRdWlja2ZpeFByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkucXVpY2tmaXguWGJhc2VXaXRoQW5ub3RhdGlvbnNRdWlja2ZpeFByb3ZpZGVyIHsKKworLy8JQEZpeChNeURzbFZhbGlkYXRvcjo6SU5WQUxJRF9OQU1FKQorLy8JZGVmIGNhcGl0YWxpemVOYW1lKElzc3VlIGlzc3VlLCBJc3N1ZVJlc29sdXRpb25BY2NlcHRvciBhY2NlcHRvcikgeworLy8JCWFjY2VwdG9yLmFjY2VwdChpc3N1ZSwgJ0NhcGl0YWxpemUgbmFtZScsICdDYXBpdGFsaXplIHRoZSBuYW1lLicsICd1cGNhc2UucG5nJykgWworLy8JCQljb250ZXh0IHwKKy8vCQkJdmFsIHh0ZXh0RG9jdW1lbnQgPSBjb250ZXh0Lnh0ZXh0RG9jdW1lbnQKKy8vCQkJdmFsIGZpcnN0TGV0dGVyID0geHRleHREb2N1bWVudC5nZXQoaXNzdWUub2Zmc2V0LCAxKQorLy8JCQl4dGV4dERvY3VtZW50LnJlcGxhY2UoaXNzdWUub2Zmc2V0LCAxLCBmaXJzdExldHRlci50b1VwcGVyQ2FzZSkKKy8vCQldCisvLwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3RlbXBsYXRlcy9SZWFkTWUudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS90ZW1wbGF0ZXMvUmVhZE1lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjIwN2Y4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS90ZW1wbGF0ZXMvUmVhZE1lLnR4dApAQCAtMCwwICsxIEBACitwbGFjZSB0ZW1wbGF0ZXMgZm9yIGRlc2lnbnRpbWUgaGVyZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9DaGFydERTTFByb3Bvc2FsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvY29udGVudGFzc2lzdC9DaGFydERTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYwMTIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L0NoYXJ0RFNMUHJvcG9zYWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3R5bGVkU3RyaW5nOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmNvbnRlbnRhc3Npc3QuQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkuQ2hhcnREU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0Lk15UmVwbGFjZW1lbnRUZXh0QXBwbGllcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5BYnN0cmFjdEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5LZXl3b3JkOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LlJ1bGVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi51aS5jb250ZW50YXNzaXN0LlRlcm1pbmFsc1Byb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuQ29uZmlndXJhYmxlQ29tcGxldGlvblByb3Bvc2FsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvcjsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xQcm9wb3NhbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDaGFydERTTFByb3Bvc2FsUHJvdmlkZXIgeworICBASW5qZWN0CisgIHByaXZhdGUgVGVybWluYWxzUHJvcG9zYWxQcm92aWRlciBwcm92aWRlcjsKKyAgCisgIEBJbmplY3QKKyAgcHJpdmF0ZSBCYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXI7CisgIAorICBwcm90ZWN0ZWQgU3R5bGVkU3RyaW5nIGdldEtleXdvcmREaXNwbGF5U3RyaW5nKGZpbmFsIEtleXdvcmQga2V5d29yZCkgeworICAgIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgX2luc3RhbmNlID0gQ2hhcnREU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5pbnN0YW5jZSgpOworICAgIHJldHVybiBCYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIuZ2V0S2V5d29yZERpc3BsYXlTdHJpbmcoa2V5d29yZCwgX2luc3RhbmNlKTsKKyAgfQorICAKKyAgLyoqCisgICAqIFRoaXMgb3ZlcnJpZGUgd2lsbCBlbmFibGUgMSBsZW5ndGggbm9uIGxldHRlciBjaGFyYWN0ZXJzIGFzIGtleXdvcmQuCisgICAqLworICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleXdvcmRXb3J0aHlUb1Byb3Bvc2UoZmluYWwgS2V5d29yZCBrZXl3b3JkKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRTZWdtZW50Q29sb3JfUmdiKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5jb2xvclBpY2tlclByb3Bvc2FsKG1vZGVsLCBhc3NpZ25tZW50LCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbG9yUGlja2VyUHJvcG9zYWwoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBJQ29tcGxldGlvblByb3Bvc2FsIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiUGljayBjb2xvci4uLiIsIGNvbnRleHQpOworICAgIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCBwaWNrQ29sb3IgPSAoKENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCkgX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKHBpY2tDb2xvciwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBNeVJlcGxhY2VtZW50VGV4dEFwcGxpZXIgYXBwbGllciA9IG5ldyBNeVJlcGxhY2VtZW50VGV4dEFwcGxpZXIoKTsKKyAgICAgIGFwcGxpZXIuc2V0Q29udGV4dChjb250ZXh0KTsKKyAgICAgIHBpY2tDb2xvci5zZXRUZXh0QXBwbGllcihhcHBsaWVyKTsKKyAgICB9CisgICAgYWNjZXB0b3IuYWNjZXB0KHBpY2tDb2xvcik7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzEgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIyMzAsMTI4LDY0XCIgLyogb3JhbmdlICovIiwgIm9yYW5nZSIsIG51bGwsIGNvbnRleHQpOworICAgIGFjY2VwdG9yLmFjY2VwdChfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzEpOworICAgIElDb21wbGV0aW9uUHJvcG9zYWwgX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF8yID0gdGhpcy5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDE4MiwxODJcIiAvKiBsaWdodCByZWQgKi8iLCAibGlnaHQgcmVkIiwgbnVsbCwgY29udGV4dCk7CisgICAgYWNjZXB0b3IuYWNjZXB0KF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfMik7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzMgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIyNTUsMCwwXCIgLyogcmVkICovIiwgInJlZCIsIG51bGwsIGNvbnRleHQpOworICAgIGFjY2VwdG9yLmFjY2VwdChfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzMpOworICAgIElDb21wbGV0aW9uUHJvcG9zYWwgX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF80ID0gdGhpcy5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjA0LDEwMiwxMDJcIiAvKiBkYXJrIHJlZCAqLyIsICJkYXJrIHJlZCIsIG51bGwsIGNvbnRleHQpOworICAgIGFjY2VwdG9yLmFjY2VwdChfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzQpOworICAgIElDb21wbGV0aW9uUHJvcG9zYWwgX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF81ID0gdGhpcy5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDI1NSwxMjhcIiAvKmxpZ2h0IHllbGxvdyAqLyIsICJsaWdodCB5ZWxsb3ciLCBudWxsLCBjb250ZXh0KTsKKyAgICBhY2NlcHRvci5hY2NlcHQoX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF81KTsKKyAgICBJQ29tcGxldGlvblByb3Bvc2FsIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfNiA9IHRoaXMuY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjI1NSwyNTUsMFwiIC8qIHllbGxvdyAqLyIsICJ5ZWxsb3ciLCBudWxsLCBjb250ZXh0KTsKKyAgICBhY2NlcHRvci5hY2NlcHQoX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF82KTsKKyAgICBJQ29tcGxldGlvblByb3Bvc2FsIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfNyA9IHRoaXMuY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjEyOCwxMjgsMFwiIC8qIGRhcmsgeWVsbG93ICovIiwgImRhcmsgeWVsbG93IiwgbnVsbCwgY29udGV4dCk7CisgICAgYWNjZXB0b3IuYWNjZXB0KF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfNyk7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzggPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIxMDIsMjA0LDEwMlwiIC8qIGxpZ2h0IGdyZWVuICovIiwgImxpZ2h0IGdyZWVuIiwgbnVsbCwgY29udGV4dCk7CisgICAgYWNjZXB0b3IuYWNjZXB0KF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfOCk7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzkgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIwLDI1NSwwXCIgLyogZ3JlZW4gKi8iLCAiZ3JlZW4iLCBudWxsLCBjb250ZXh0KTsKKyAgICBhY2NlcHRvci5hY2NlcHQoX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF85KTsKKyAgICBJQ29tcGxldGlvblByb3Bvc2FsIF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfMTAgPSB0aGlzLmNyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIxNDcsMTgzLDk1XCIgLyogZGFyayBncmVlbiAqLyIsICJkYXJrIGdyZWVuIiwgbnVsbCwgY29udGV4dCk7CisgICAgYWNjZXB0b3IuYWNjZXB0KF9jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWxfMTApOworICAgIElDb21wbGV0aW9uUHJvcG9zYWwgX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF8xMSA9IHRoaXMuY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsKCJcIjAsMCwwXCIgLyogYmxhY2sgKi8iLCAiYmxhY2siLCBudWxsLCBjb250ZXh0KTsKKyAgICBhY2NlcHRvci5hY2NlcHQoX2NyZWF0ZUNvbXBsZXRpb25Qcm9wb3NhbF8xMSk7CisgICAgSUNvbXBsZXRpb25Qcm9wb3NhbCBfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzEyID0gdGhpcy5jcmVhdGVDb21wbGV0aW9uUHJvcG9zYWwoIlwiMjU1LDI1NSwyNTVcIiAvKiB3aGl0ZSAqLyIsICJ3aGl0ZSIsIG51bGwsIGNvbnRleHQpOworICAgIGFjY2VwdG9yLmFjY2VwdChfY3JlYXRlQ29tcGxldGlvblByb3Bvc2FsXzEyKTsKKyAgfQorICAKKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZFByb3Bvc2FsKGZpbmFsIFN0cmluZyBwcm9wb3NhbCwgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworICAgIGJvb2xlYW4gcmVzdWx0ID0gc3VwZXIuaXNWYWxpZFByb3Bvc2FsKHByb3Bvc2FsLCBwcmVmaXgsIGNvbnRleHQpOworICAgIEVPYmplY3QgX2N1cnJlbnRNb2RlbCA9IGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisgICAgaWYgKChfY3VycmVudE1vZGVsIGluc3RhbmNlb2YgQ2hhcnRBeGlzKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX1F1YWxpZmllZE5hbWUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcyk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZChmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlckhlbHBlci5jb21wbGV0ZV9QYWNrYWdlTmFtZShtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yLCB0aGlzKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVDaGFydEF4aXNfQW5nbGUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIFJ1bGVDYWxsIHJ1bGVDYWxsID0gKChSdWxlQ2FsbCkgX3Rlcm1pbmFsKTsKKyAgICBTdHJpbmcgZmVhdHVyZSA9IHRoaXMucHJvdmlkZXJIZWxwZXIuZ2V0QXNzaWduZWRGZWF0dXJlKHJ1bGVDYWxsKTsKKyAgICB0aGlzLnByb3ZpZGVySGVscGVyLmNyZWF0ZUludFByb3Bvc2FsKGNvbnRleHQsIGFjY2VwdG9yLCBydWxlQ2FsbCwgZmVhdHVyZSwgMCwgInZhbHVlIGJldHdlZW4gLTM2MCBhbmQgMzYwIiwgdGhpcyk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlQ2hhcnRCdWJibGVfTXVsdGlwbGllclZhbHVlKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgQWJzdHJhY3RFbGVtZW50IF90ZXJtaW5hbCA9IGFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKTsKKyAgICB0aGlzLnByb3ZpZGVySGVscGVyLmNyZWF0ZU51bWJlclByb3Bvc2FsKGNvbnRleHQsIGFjY2VwdG9yLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCB0aGlzKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVDaGFydE51bWJlckludGVydmFsX051bWJlckludGVydmFsVmFsdWUoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICBBYnN0cmFjdEVsZW1lbnQgX3Rlcm1pbmFsID0gYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpOworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfSU5UKG1vZGVsLCAoKFJ1bGVDYWxsKSBfdGVybWluYWwpLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lOVChmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9JTlQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lEKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX0lEKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZV9UUkFOU0xBVEFCTEVTVFJJTkcoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXIuY29tcGxldGVfU1RSSU5HKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBjb21wbGV0ZUNoYXJ0R2F1Z2VfTGFiZWxWYWx1ZShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIEFic3RyYWN0RWxlbWVudCBfdGVybWluYWwgPSBhc3NpZ25tZW50LmdldFRlcm1pbmFsKCk7CisgICAgdGhpcy5wcm92aWRlci5jb21wbGV0ZV9TVFJJTkcobW9kZWwsICgoUnVsZUNhbGwpIF90ZXJtaW5hbCksIGNvbnRleHQsIGFjY2VwdG9yKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L015UmVwbGFjZW1lbnRUZXh0QXBwbGllci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9jb250ZW50YXNzaXN0L015UmVwbGFjZW1lbnRUZXh0QXBwbGllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOTM1OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2NvbnRlbnRhc3Npc3QvTXlSZXBsYWNlbWVudFRleHRBcHBsaWVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5jb250ZW50YXNzaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db2xvckRpYWxvZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OworaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0Q29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5SZXBsYWNlbWVudFRleHRBcHBsaWVyOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBNeVJlcGxhY2VtZW50VGV4dEFwcGxpZXIgZXh0ZW5kcyBSZXBsYWNlbWVudFRleHRBcHBsaWVyIHsKKyAgcHJpdmF0ZSBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0OworICAKKyAgcHVibGljIENvbnRlbnRBc3Npc3RDb250ZXh0IHNldENvbnRleHQoZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgeworICAgIHJldHVybiB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIGdldEFjdHVhbFJlcGxhY2VtZW50U3RyaW5nKGZpbmFsIENvbmZpZ3VyYWJsZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgeworICAgIElUZXh0Vmlld2VyIF92aWV3ZXIgPSB0aGlzLmNvbnRleHQuZ2V0Vmlld2VyKCk7CisgICAgU3R5bGVkVGV4dCBfdGV4dFdpZGdldCA9IF92aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOworICAgIERpc3BsYXkgZGlzcGxheSA9IF90ZXh0V2lkZ2V0LmdldERpc3BsYXkoKTsKKyAgICBTaGVsbCBfYWN0aXZlU2hlbGwgPSBkaXNwbGF5LmdldEFjdGl2ZVNoZWxsKCk7CisgICAgQ29sb3JEaWFsb2cgY29sb3JEaWFsb2cgPSBuZXcgQ29sb3JEaWFsb2coX2FjdGl2ZVNoZWxsKTsKKyAgICBSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7CisgICAgU3RyaW5nIF9zdHJpbmcgPSBJbnRlZ2VyLnZhbHVlT2YobmV3Q29sb3IucmVkKS50b1N0cmluZygpOworICAgIFN0cmluZyBfY29uY2F0ID0gIlwiIi5jb25jYXQoX3N0cmluZyk7CisgICAgU3RyaW5nIF9jb25jYXRfMSA9IF9jb25jYXQuY29uY2F0KCIsIik7CisgICAgU3RyaW5nIF9zdHJpbmdfMSA9IEludGVnZXIudmFsdWVPZihuZXdDb2xvci5ncmVlbikudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgX2NvbmNhdF8yID0gX2NvbmNhdF8xLmNvbmNhdChfc3RyaW5nXzEpOworICAgIFN0cmluZyBfY29uY2F0XzMgPSBfY29uY2F0XzIuY29uY2F0KCIsIik7CisgICAgU3RyaW5nIF9zdHJpbmdfMiA9IEludGVnZXIudmFsdWVPZihuZXdDb2xvci5ibHVlKS50b1N0cmluZygpOworICAgIFN0cmluZyBfY29uY2F0XzQgPSBfY29uY2F0XzMuY29uY2F0KF9zdHJpbmdfMik7CisgICAgcmV0dXJuIF9jb25jYXRfNC5jb25jYXQoIlwiIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvbGFiZWxpbmcvQ2hhcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvbGFiZWxpbmcvQ2hhcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmY2MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9sYWJlbGluZy9DaGFydERTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkubGFiZWxpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5sYWJlbGluZy5YYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlcjsKKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBYYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL2xhYmVsaW5nL0NoYXJ0RFNMTGFiZWxQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9sYWJlbGluZy9DaGFydERTTExhYmVsUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmZDNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91aS9sYWJlbGluZy9DaGFydERTTExhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIzMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aS5sYWJlbGluZzsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5sYWJlbGluZy5CYXNpY0RTTExhYmVsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREb251dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0T3B0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFJhbmdlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uOworCisvKioKKyAqIFByb3ZpZGVzIGxhYmVscyBmb3IgYSBFT2JqZWN0cy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzaWNEU0xMYWJlbFByb3ZpZGVyIHsKKyAgQEluamVjdAorICBwdWJsaWMgQ2hhcnREU0xMYWJlbFByb3ZpZGVyKGZpbmFsIEFkYXB0ZXJGYWN0b3J5TGFiZWxQcm92aWRlciBkZWxlZ2F0ZSkgeworICAgIHN1cGVyKGRlbGVnYXRlKTsKKyAgfQorICAKKyAgcHVibGljIE9iamVjdCB0ZXh0KGZpbmFsIE9iamVjdCBvKSB7CisgICAgT2JqZWN0IF9zd2l0Y2hSZXN1bHQgPSBudWxsOworICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0KSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIFN0cmluZyBfbmFtZSA9ICgoQ2hhcnQpIG8pLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJjaGFydCIsIF9uYW1lKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEJhcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgIm9wdGlvbiBiYXIiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydExpbmUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJvcHRpb24gbGluZSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0UGllKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAib3B0aW9uIHBpZSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0RG9udXQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJvcHRpb24gZG9udXQiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEJ1YmJsZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgIm9wdGlvbiBidWJibGUiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEdhdWdlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAib3B0aW9uIGdhdWdlIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAib3B0aW9uIHRyZWUiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEludGVydmFsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdlbmVyYXRlVGV4dChvLCAiaW50ZXJ2YWwiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydFNlZ21lbnRDb2xvcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX3JnYiA9ICgoQ2hhcnRTZWdtZW50Q29sb3IpIG8pLmdldFJnYigpOworICAgICAgICBTdHJpbmcgX2Zvcm1hdCA9IFN0cmluZy5mb3JtYXQoIlJHQiglcykiLCBfcmdiKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJzZWdtZW50IGNvbG9yIiwgX2Zvcm1hdCk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2hhcnRSYW5nZUVsZW1lbnQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyYW5nZSBlbGVtZW50Iik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2hhcnREYXRhbWFydCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gKChDaGFydERhdGFtYXJ0KSBvKS5nZXREYXRhbWFydFJlZigpOworICAgICAgICBTdHJpbmcgX25hbWUgPSBfZGF0YW1hcnRSZWYuZ2V0TmFtZSgpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImRhdGFtYXJ0IiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0QXhpcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImF4aXMiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydExlZ2VuZCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgImxlZ2VuZCIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0SGlnaGxpZ2h0ZXIpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJ0b29sdGlwIik7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIF9zd2l0Y2hSZXN1bHQgPSBzdXBlci50ZXh0KG8pOworICAgIH0KKyAgICByZXR1cm4gX3N3aXRjaFJlc3VsdDsKKyAgfQorICAKKyAgcHVibGljIE9iamVjdCBpbWFnZShmaW5hbCBPYmplY3QgbykgeworICAgIE9iamVjdCBfc3dpdGNoUmVzdWx0ID0gbnVsbDsKKyAgICBib29sZWFuIF9tYXRjaGVkID0gZmFsc2U7CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydE1vZGVsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBCYXNpY0RTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHN1cGVyLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoIm1vZGVsLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2hhcnQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENoYXJ0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfY2hhcnQucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydFNlZ21lbnRDb2xvcikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX3JnYiA9ICgoQ2hhcnRTZWdtZW50Q29sb3IpIG8pLmdldFJnYigpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRDb2xvck91dGxpbmVJbWFnZShfcmdiLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydE9wdGlvbikgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ2hhcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9vcHRpb24ucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEludGVydmFsKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDaGFydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiY2hhcnRfaW50ZXJ2YWwucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydFJhbmdlRWxlbWVudCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQ2hhcnREU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoImRzbF9yYW5nZS5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIENoYXJ0RGF0YW1hcnQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENoYXJ0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfZGF0YW1hcnQucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEF4aXMpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENoYXJ0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJjaGFydF9heGlzLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2hhcnRMZWdlbmQpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENoYXJ0RFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJjaGFydF9sZWdlbmQucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDaGFydEhpZ2hsaWdodGVyKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBDaGFydERTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgiY2hhcnRfdG9vbHRpcC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBfc3dpdGNoUmVzdWx0ID0gc3VwZXIuaW1hZ2Uobyk7CisgICAgfQorICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL291dGxpbmUvQ2hhcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL291dGxpbmUvQ2hhcnREU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjNGNiYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvb3V0bGluZS9DaGFydERTTE91dGxpbmVUcmVlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMT3V0bGluZVRyZWVQcm92aWRlciBleHRlbmRzIERlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdWkvcXVpY2tmaXgvQ2hhcnREU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL3F1aWNrZml4L0NoYXJ0RFNMUXVpY2tmaXhQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMjFmMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3VpL3F1aWNrZml4L0NoYXJ0RFNMUXVpY2tmaXhQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudWkucXVpY2tmaXg7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy51aS5xdWlja2ZpeC5YYmFzZVdpdGhBbm5vdGF0aW9uc1F1aWNrZml4UHJvdmlkZXI7CisKKy8qKgorICogQ3VzdG9tIHF1aWNrZml4ZXMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNxdWlja2ZpeGVzCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIFhiYXNlV2l0aEFubm90YXRpb25zUXVpY2tmaXhQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0Ly5wcm9qZWN0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE1ZDg2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC8ucHJvamVjdApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0PC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5zb25hcmxpbnQuZWNsaXBzZS5jb3JlLnNvbmFybGludEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlTmF0dXJlPC9uYXR1cmU+CisJPC9uYXR1cmVzPgorPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9MSUNFTlNFLnR4dApAQCAtMCwwICsxLDE2MSBAQAorRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtdiAxLjAKKworVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OCitPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC4KKworMS4gREVGSU5JVElPTlMKKworIkNvbnRyaWJ1dGlvbiIgbWVhbnM6CisKK2EpIGluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQKKworYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOgorCitpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKworaWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTsKKword2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuCitBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUKK2FjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZQorbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdAorZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4KKworIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisiTGljZW5zZWQgUGF0ZW50cyAiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YKK2l0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisiUHJvZ3JhbSIgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMgZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50LgorCisiUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy4KKworMi4gR1JBTlQgT0YgUklHSFRTCisKK2EpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlCithbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCitmb3JtLgorCitiKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBwYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlCitDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUKK2NvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaAorYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90CithcHBseSB0byBhbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4KKworYykgUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vCithc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5CitiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKK2xpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlIHRoZQorUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS4KKworZCkgRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8KK2dyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKzMuIFJFUVVJUkVNRU5UUworCitBIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6CisKK2EpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OgorCitpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZword2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZAorZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7CisKK2lpKSBlZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKK2lpaSkgc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueQorb3RoZXIgcGFydHk7IGFuZAorCitpdikgc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0CitpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuCisKK1doZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybToKKworYSkgaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLgorCitDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uCisKK0VhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlIG9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCitzdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4KKworNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworQ29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kCit0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzCit0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbCBsaWFiaWxpdHkgZm9yCitvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvcgorKCJDb21tZXJjaWFsIENvbnRyaWJ1dG9yIikgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyIGxlZ2FsIGFjdGlvbnMKK2Jyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaAorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZy4gVGhlCitvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwKK3Byb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB0byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkKKyBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuCisKK0ZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcwordGhlbiBhIENvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlIGNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMKK3JlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLgorVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUgb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8KK3Rob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwKK3RoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuCisKKzUuIE5PIFdBUlJBTlRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IKK0NPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsCitOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IKK2RldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLCBjb21wbGlhbmNlCit3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKzYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZCisKK0VYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwKK0hPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVECitIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLgorCis3LiBHRU5FUkFMCisKK0lmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgorZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaAorcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKK0lmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKK2FsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoCitSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaCBSZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlIHN1Y2gKK2xpdGlnYXRpb24gaXMgZmlsZWQuCisKK0FsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKK2NvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoCitub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbgorb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKK0V2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudAoraXMgY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50IFN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2gKK25ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YgdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMgdGhlCityaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5Cithc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZQorZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKK3RoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUKK25ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZCBpbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCit0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuCisKK1RoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzCitvZiBBbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2UKK29mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhY2Q5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0wLDAgKzEsOTMgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgorQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorIEdlcm1hbnkpCitCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KK0J1bmRsZS1WZXJzaW9uOiAwLjkuMC5xdWFsaWZpZXIKK0J1bmRsZS1DbGFzc1BhdGg6IC4KK0J1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7c2luZ2xldG9uOj10cnVlCitCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQorUmVxdWlyZS1CdW5kbGU6IG9yZy5zbGY0ai5hcGk7YnVuZGxlLXZlcnNpb249IjEuNy4yIiwKKyBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iMi45LjAiLAorIG9yZy5lY2xpcHNlLnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZTtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZztidW5kbGUtdmVyc2lvbj0iMS4wLjQiLAorIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXM7YnVuZGxlLXZlcnNpb249IjMuNC4wIiwKKyBvcmcuZWNsaXBzZS5lbWYuY29kZWdlbi5lY29yZSwKKyBvcmcuZWNsaXBzZS5lbWYubXdlLnV0aWxzLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmU7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbiwKKyBvcmcuZWNsaXBzZS5lbWYubXdlMi5sYXVuY2g7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmFudGxyLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueGNvcmUubGliLAorIG9yZy5lY2xpcHNlLmJwbW4yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmR0by54dGV4dDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBjb20udmFhZGluLnNoYXJlZDtidW5kbGUtdmVyc2lvbj0iWzcuNS43LDcuNy4wKSIsCisgY29tLnZhYWRpbi5jbGllbnQ7YnVuZGxlLXZlcnNpb249Ils3LjUuNyw3LjcuMCkiLAorIGNvbS52YWFkaW4uc2VydmVyO2J1bmRsZS12ZXJzaW9uPSJbNy41LjcsNy43LjApIiwKKyByZWZyZXNoZXIub3NnaTtidW5kbGUtdmVyc2lvbj0iWzEuMi4zLjcsMS4yLjQpIiwKKyBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLAorIG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLndvcmtiZW5jaCwKKyBvbGFwNGoub3NnaTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMy4wKSIsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcywKKyBvcmcuZWNsaXBzZS5lbWYuZWNvcmUueGNvcmUsCisgb3JnLm9iamVjdHdlYi5hc207YnVuZGxlLXZlcnNpb249Ils1LjAuMSw2LjAuMCkiLAorIGRDaGFydHMub3NnaTtidW5kbGUtdmVyc2lvbj0iMS43LjAiLAorIG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcsCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaTtidW5kbGUtdmVyc2lvbj0iMS40LjAiLAorIG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucztidW5kbGUtdmVyc2lvbj0iMC4xMi4wIiwKKyBvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmVudGl0eS54dGV4dDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAucnVudGltZS5jb21tb247YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnJ1bnRpbWUud2ViLnZhYWRpbi5kYXRhYmluZGluZztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZnVuY3Rpb25saWJyYXJ5ZHNsO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5hcGk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5vc2dpLmh5YnJpZC5hcGk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcDt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmN1YmVkc2w7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5td2U7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC5naXRpbmZvO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlcjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hZGRvbnM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIudHlwZXMuYnVuZGxlcztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnhiYXNlLnNldHVwcztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiCitJbXBvcnQtUGFja2FnZTogamF2YXgudmFsaWRhdGlvbiwKKyBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLAorIG9yZy5hcGFjaGUubG9nNGosCisgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmRhdGFtYXJ0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5sYXlvdXQ7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLm1ldGFkYXRhO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS51c2VyO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50CitCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51dGlsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZvcm1hdHRpbmc7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuanZtbW9kZWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQucGFyc2VyLmFudGxyO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zY29waW5nO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcmlhbGl6ZXI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2VydmljZXM7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudmFsaWRhdGlvbjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC52YWx1ZWNvbnZlcnRlcjt2ZXJzaW9uPSIwLjkuMCIKK0J1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2Fib3V0Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvYWJvdXQuaW5pIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9hYm91dC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjcxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvYWJvdXQuaW5pCkBAIC0wLDAgKzEsMTcgQEAKKyMgYWJvdXQuaW5pCisjIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcworIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCisjIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKK2Fib3V0VGV4dD0lZmVhdHVyZVRleHQKKworIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQorZmVhdHVyZUltYWdlPQorCisjIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKK2FwcE5hbWU9JWZlYXR1cmVOYW1lCisKKyMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQord2VsY29tZVBhZ2U9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2Fib3V0Lm1hcHBpbmdzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9hYm91dC5tYXBwaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTExYTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9hYm91dC5tYXBwaW5ncwpAQCAtMCwwICsxLDYgQEAKKyMgYWJvdXQubWFwcGluZ3MKKyMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworMD1xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvYWJvdXQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvYWJvdXQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzlkMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9hYm91dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIworCisjIE5MU19NRVNTQUdFRk9STUFUX1ZBUgorCitmZWF0dXJlTmFtZT1vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0CisKKyMjIyMjIyMjIyMjIyMjIyMgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitmZWF0dXJlVGV4dD1cCitDb3B5cmlnaHQgKGMpIDIwMTItMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgXG5cCitBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCithcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKK3doaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAorXG5cCitDb250cmlidXRvcnM6XG5cCisgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uXG4KKyMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4N2IwMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIyAgaHR0cHsvL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisjIAorIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisjICAgCisjICBDb250cmlidXRvcnN7ICAKKyMgIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyMgIAorCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgLixcCisJCQkgICBtb2RlbC8sXAorICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCQkJICAgCitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICBzcmMtZ2VuLyxcCisgICAgICAgICAgIHh0ZW5kLWdlbi8sXAorICAgICAgICAgICBlbWYtZ2VuLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNmE2NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjaXNEZXNjcmlwdGlvbiA8ZW0+RGVzY3JpcHRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjZ2V0RGVzY3JpcHRpb25WYWx1ZSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjaXNQb2xsaW5nIDxlbT5Qb2xsaW5nPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2dldFBvbGxpbmdUaW1lIDxlbT5Qb2xsaW5nIFRpbWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjZ2V0Q2hhcnR0eXBlIDxlbT5DaGFydHR5cGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0IGV4dGVuZHMgQ2hhcnRCYXNlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldERlc2NyaXB0aW9uKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydF9EZXNjcmlwdGlvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNEZXNjcmlwdGlvbigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNpc0Rlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb248L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRGVzY3JpcHRpb24oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXREZXNjcmlwdGlvblZhbHVlKFN0cmluZykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0X0Rlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0RGVzY3JpcHRpb25WYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXREZXNjcmlwdGlvblZhbHVlIDxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERlc2NyaXB0aW9uVmFsdWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBvbGxpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBvbGxpbmc8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9sbGluZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UG9sbGluZyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRfUG9sbGluZygpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNQb2xsaW5nKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2lzUG9sbGluZyA8ZW0+UG9sbGluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UG9sbGluZzwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNQb2xsaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb2xsaW5nKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UG9sbGluZyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qb2xsaW5nIFRpbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UG9sbGluZyBUaW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRQb2xsaW5nVGltZShpbnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydF9Qb2xsaW5nVGltZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBnZXRQb2xsaW5nVGltZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXRQb2xsaW5nVGltZSA8ZW0+UG9sbGluZyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Qb2xsaW5nIFRpbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFBvbGxpbmdUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRQb2xsaW5nVGltZShpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhcnR0eXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFydHR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q2hhcnR0eXBlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRDaGFydHR5cGUoQ2hhcnRPcHRpb24pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydF9DaGFydHR5cGUoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRPcHRpb24gZ2V0Q2hhcnR0eXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2dldENoYXJ0dHlwZSA8ZW0+Q2hhcnR0eXBlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFydHR5cGU8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldENoYXJ0dHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q2hhcnR0eXBlKENoYXJ0T3B0aW9uIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlNvdXJjZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U291cmNlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0U291cmNlKENoYXJ0RGF0YW1hcnQpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydF9Tb3VyY2UoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnREYXRhbWFydCBnZXRTb3VyY2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjZ2V0U291cmNlIDxlbT5Tb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNvdXJjZTwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0U291cmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTb3VyY2UoQ2hhcnREYXRhbWFydCB2YWx1ZSk7CisKK30gLy8gQ2hhcnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0QXhpcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRBeGlzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM3YTBhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0QXhpcy5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRBeGlzOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBBeGlzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzI2dldEF4aXMgPGVtPkF4aXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzI2dldFJlbmRlclR5cGUgPGVtPlJlbmRlciBUeXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNpc1Nob3J0TGFiZWwgPGVtPlNob3J0IExhYmVsPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNnZXRBbmdsZSA8ZW0+QW5nbGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0QXhpcygpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydEF4aXMgZXh0ZW5kcyBDaGFydEVsZW1lbnQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF4aXM8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF4aXM8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXhpczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QXhpcyhEYXRhbWFydEF4aXMpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEF4aXNfQXhpcygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGFtYXJ0QXhpcyBnZXRBeGlzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNnZXRBeGlzIDxlbT5BeGlzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BeGlzPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBeGlzKERhdGFtYXJ0QXhpcyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZW5kZXIgVHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVuZGVyIFR5cGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UmVuZGVyIFR5cGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5SZW5kZXJUeXBlRW51bQorCSAqIEBzZWUgI3NldFJlbmRlclR5cGUoUmVuZGVyVHlwZUVudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEF4aXNfUmVuZGVyVHlwZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVJlbmRlclR5cGVFbnVtIGdldFJlbmRlclR5cGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzI2dldFJlbmRlclR5cGUgPGVtPlJlbmRlciBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZW5kZXIgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtCisJICogQHNlZSAjZ2V0UmVuZGVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmVuZGVyVHlwZShSZW5kZXJUeXBlRW51bSB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaG9ydCBMYWJlbDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U2hvcnQgTGFiZWw8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+U2hvcnQgTGFiZWw8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNob3J0TGFiZWwoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0QXhpc19TaG9ydExhYmVsKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1Nob3J0TGFiZWwoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzI2lzU2hvcnRMYWJlbCA8ZW0+U2hvcnQgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlNob3J0IExhYmVsPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1Nob3J0TGFiZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFNob3J0TGFiZWwoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmdsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5nbGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5nbGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFuZ2xlKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0QXhpc19BbmdsZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBnZXRBbmdsZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMjZ2V0QW5nbGUgPGVtPkFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BbmdsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0QW5nbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFuZ2xlKGludCB2YWx1ZSk7CisKK30gLy8gQ2hhcnRBeGlzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEJhci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmI4NzMyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCYXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgQmFyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTaGFkb3cgPGVtPlNoYWRvdzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc0FuaW1hdGVkIDxlbT5BbmltYXRlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc1N3YXBwZWQgPGVtPlN3YXBwZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTdGFja2VkIDxlbT5TdGFja2VkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJhcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydEJhciBleHRlbmRzIENoYXJ0T3B0aW9uIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TaGFkb3c8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNoYWRvdzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFkb3c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFNoYWRvdyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRCYXJfU2hhZG93KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1NoYWRvdygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc1NoYWRvdyA8ZW0+U2hhZG93PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaGFkb3c8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU2hhZG93KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTaGFkb3coYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BbmltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QW5pbWF0ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QW5pbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEFuaW1hdGVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJhcl9BbmltYXRlZCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNBbmltYXRlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc0FuaW1hdGVkIDxlbT5BbmltYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QW5pbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzQW5pbWF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFuaW1hdGVkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U3dhcHBlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3dhcHBlZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Td2FwcGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTd2FwcGVkKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJhcl9Td2FwcGVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1N3YXBwZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTd2FwcGVkIDxlbT5Td2FwcGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Td2FwcGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1N3YXBwZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFN3YXBwZWQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5TdGFja2VkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5TdGFja2VkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN0YWNrZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFN0YWNrZWQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0QmFyX1N0YWNrZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzU3RhY2tlZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc1N0YWNrZWQgPGVtPlN0YWNrZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlN0YWNrZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzU3RhY2tlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0U3RhY2tlZChib29sZWFuIHZhbHVlKTsKKworfSAvLyBDaGFydEJhcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZhOGZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCYXNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgQmFzZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJhc2UoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhcnRCYXNlIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TmFtZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TmFtZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJhc2VfTmFtZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBnZXROYW1lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gQ2hhcnRCYXNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEJ1YmJsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCdWJibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmJkMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRCdWJibGUuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgQnViYmxlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNNdWx0aXBsaWVyIDxlbT5NdWx0aXBsaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlI2dldE11bHRpcGxpZXJWYWx1ZSA8ZW0+TXVsdGlwbGllciBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZSNpc0dyYWRpZW50IDxlbT5HcmFkaWVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZSNpc1RyYW5zcGFyZW50IDxlbT5UcmFuc3BhcmVudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRCdWJibGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhcnRCdWJibGUgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TXVsdGlwbGllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TXVsdGlwbGllcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNdWx0aXBsaWVyKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJ1YmJsZV9NdWx0aXBsaWVyKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc011bHRpcGxpZXIoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNNdWx0aXBsaWVyIDxlbT5NdWx0aXBsaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NdWx0aXBsaWVyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc011bHRpcGxpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE11bHRpcGxpZXIoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NdWx0aXBsaWVyIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NdWx0aXBsaWVyIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk11bHRpcGxpZXIgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE11bHRpcGxpZXJWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJ1YmJsZV9NdWx0aXBsaWVyVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TXVsdGlwbGllclZhbHVlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlI2dldE11bHRpcGxpZXJWYWx1ZSA8ZW0+TXVsdGlwbGllciBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+TXVsdGlwbGllciBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TXVsdGlwbGllclZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNdWx0aXBsaWVyVmFsdWUoU3RyaW5nIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyYWRpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5HcmFkaWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFkaWVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0R3JhZGllbnQoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0QnViYmxlX0dyYWRpZW50KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0dyYWRpZW50KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlI2lzR3JhZGllbnQgPGVtPkdyYWRpZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5HcmFkaWVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNHcmFkaWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0R3JhZGllbnQoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5UcmFuc3BhcmVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJhbnNwYXJlbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwYXJlbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFRyYW5zcGFyZW50KGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEJ1YmJsZV9UcmFuc3BhcmVudCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNUcmFuc3BhcmVudCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZSNpc1RyYW5zcGFyZW50IDxlbT5UcmFuc3BhcmVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJhbnNwYXJlbnQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzVHJhbnNwYXJlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyYW5zcGFyZW50KGJvb2xlYW4gdmFsdWUpOworCit9IC8vIENoYXJ0QnViYmxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTEZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZjE1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIwNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydERTTEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydERTTEZhY3RvcnkgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBNb2RlbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgTW9kZWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0TW9kZWwgY3JlYXRlQ2hhcnRNb2RlbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydExhenlSZXNvbHZlciBjcmVhdGVDaGFydExhenlSZXNvbHZlcigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBCYXNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBCYXNlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydEJhc2UgY3JlYXRlQ2hhcnRCYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IFBhY2thZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IFBhY2thZ2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0UGFja2FnZSBjcmVhdGVDaGFydFBhY2thZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydCBjcmVhdGVDaGFydCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBCYXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IEJhcjwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRCYXIgY3JlYXRlQ2hhcnRCYXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgTGluZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgTGluZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRMaW5lIGNyZWF0ZUNoYXJ0TGluZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBQaWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IFBpZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRQaWUgY3JlYXRlQ2hhcnRQaWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgRG9udXQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IERvbnV0PC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydERvbnV0IGNyZWF0ZUNoYXJ0RG9udXQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgQnViYmxlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBCdWJibGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0QnViYmxlIGNyZWF0ZUNoYXJ0QnViYmxlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IEdhdWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBHYXVnZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRHYXVnZSBjcmVhdGVDaGFydEdhdWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IFRyZWU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IFRyZWU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0VHJlZSBjcmVhdGVDaGFydFRyZWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgTnVtYmVyIEludGVydmFsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBOdW1iZXIgSW50ZXJ2YWw8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0TnVtYmVySW50ZXJ2YWwgY3JlYXRlQ2hhcnROdW1iZXJJbnRlcnZhbCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBEYXRhbWFydDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgRGF0YW1hcnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUNoYXJ0RGF0YW1hcnQgY3JlYXRlQ2hhcnREYXRhbWFydCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBMZWdlbmQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IExlZ2VuZDwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRMZWdlbmQgY3JlYXRlQ2hhcnRMZWdlbmQoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgSGlnaGxpZ2h0ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkNoYXJ0IEhpZ2hsaWdodGVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydEhpZ2hsaWdodGVyIGNyZWF0ZUNoYXJ0SGlnaGxpZ2h0ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgQXhpczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Q2hhcnQgQXhpczwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRBeGlzIGNyZWF0ZUNoYXJ0QXhpcygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBTZWdtZW50IENvbG9yPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5DaGFydCBTZWdtZW50IENvbG9yPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydFNlZ21lbnRDb2xvciBjcmVhdGVDaGFydFNlZ21lbnRDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydERTTFBhY2thZ2UgZ2V0Q2hhcnREU0xQYWNrYWdlKCk7CisKK30gLy9DaGFydERTTEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1ZDNjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjk3MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5PU0JQVHlwZXNQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4KKyAqIEl0IGNvbnRhaW5zIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKKyAqIDx1bD4KKyAqICAgPGxpPmVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIG9wZXJhdGlvbiBvZiBlYWNoIGNsYXNzLDwvbGk+CisgKiAgIDxsaT5lYWNoIGVudW0sPC9saT4KKyAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisgKiA8L3VsPgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIGZpbGVFeHRlbnNpb25zPSdjaGFydCcgbW9kZWxOYW1lPSdDaGFydERTTCcgcHJlZml4PSdDaGFydERTTCcgY29weXJpZ2h0VGV4dD0nQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSlcclxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgXHJcbiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgXHJcbiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBcclxuIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIFxyXG5cclxuIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZVxyXG4gIFxyXG4gQ29udHJpYnV0b3JzOiAgXHJcbiBcdFx0Q2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIFxyXG4gJyBiYXNlUGFja2FnZT0nb3JnLmVjbGlwc2Uub3NicC54dGV4dCciCisgKiAgICAgICAgYW5ub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSByb290UGFja2FnZT0nY2hhcnRkc2wnIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0RFNMUGFja2FnZSBleHRlbmRzIEVQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTkFNRSA9ICJjaGFydCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMIjsKKworCS8qKgorCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfUFJFRklYID0gImNoYXJ0ZHNsIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnREU0xQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TW9kZWxJbXBsIDxlbT5DaGFydCBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydE1vZGVsSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRNb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9NT0RFTCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX01PREVMX19QQUNLQUdFUyA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTU9ERUxfRkVBVFVSRV9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTU9ERUxfT1BFUkFUSU9OX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGF6eVJlc29sdmVySW1wbCA8ZW0+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExhenlSZXNvbHZlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0TGF6eVJlc29sdmVyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX0xBWllfUkVTT0xWRVIgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IExhenkgUmVzb2x2ZXI8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCA9IDE7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJhc2VJbXBsIDxlbT5DaGFydCBCYXNlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFzZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0QmFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9CQVNFID0gMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQkFTRV9fTkFNRSA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgQmFzZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9CQVNFX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgQmFzZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9CQVNFX09QRVJBVElPTl9DT1VOVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGFja2FnZUltcGwgPGVtPkNoYXJ0IFBhY2thZ2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRQYWNrYWdlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRQYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX1BBQ0tBR0UgPSAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9QQUNLQUdFX19OQU1FID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbXBvcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9QQUNLQUdFX19JTVBPUlRTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fSU1QT1JUUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFydHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1BBQ0tBR0VfX0NIQVJUUyA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9QQUNLQUdFX0ZFQVRVUkVfQ09VTlQgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1BBQ0tBR0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgUGFja2FnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9QQUNLQUdFX09QRVJBVElPTl9DT1VOVCA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0SW1wbCA8ZW0+Q2hhcnQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVCA9IDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX19OQU1FID0gQ0hBUlRfQkFTRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX19ERVNDUklQVElPTiA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9fREVTQ1JJUFRJT05fVkFMVUUgPSBDSEFSVF9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBvbGxpbmc8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9fUE9MTElORyA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UG9sbGluZyBUaW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfX1BPTExJTkdfVElNRSA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q2hhcnR0eXBlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfX0NIQVJUVFlQRSA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U291cmNlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfX1NPVVJDRSA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDU7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRkVBVFVSRV9DT1VOVCA9IENIQVJUX0JBU0VfRkVBVFVSRV9DT1VOVCArIDY7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfQkFTRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfQkFTRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0T3B0aW9uIDxlbT5DaGFydCBPcHRpb248L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0T3B0aW9uCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydE9wdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9PUFRJT04gPSA1OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IE9wdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfT1BUSU9OX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IE9wdGlvbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9PUFRJT05fT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRCYXJJbXBsIDxlbT5DaGFydCBCYXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRCYXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydEJhcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9CQVIgPSA2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNoYWRvdzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JBUl9fU0hBRE9XID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFuaW1hdGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQkFSX19BTklNQVRFRCA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Td2FwcGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQkFSX19TV0FQUEVEID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN0YWNrZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9CQVJfX1NUQUNLRUQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgQmFyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JBUl9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JBUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9PUFRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IEJhcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9CQVJfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfT1BUSU9OX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExpbmVJbXBsIDxlbT5DaGFydCBMaW5lPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGluZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0TGluZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9MSU5FID0gNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BbmltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xJTkVfX0FOSU1BVEVEID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNob3cgTWFya2VyPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTElORV9fU0hPV19NQVJLRVIgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VHJlbmQgTGluZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xJTkVfX1RSRU5EX0xJTkUgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xJTkVfX1pPT00gPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q3Vyc29yPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTElORV9fQ1VSU09SID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvb2x0aXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MSU5FX19UT09MVElQID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkZpbGwgVG8gWmVybzwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xJTkVfX0ZJTExfVE9fWkVSTyA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5GaWxsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MSU5FX19GSUxMX0FSRUEgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDc7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgTGluZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MSU5FX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDg7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTElORV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9PUFRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IExpbmU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTElORV9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9PUFRJT05fT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGllSW1wbCA8ZW0+Q2hhcnQgUGllPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGllSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRQaWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfUElFID0gODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1BJRV9fRU1QVFkgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgUGllPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1BJRV9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1BJRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9PUFRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IFBpZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9QSUVfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfT1BUSU9OX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERvbnV0SW1wbCA8ZW0+Q2hhcnQgRG9udXQ8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREb251dEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0RG9udXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRE9OVVQgPSA5OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IERvbnV0PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0RPTlVUX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRE9OVVRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfT1BUSU9OX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5DaGFydCBEb251dDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9ET05VVF9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9PUFRJT05fT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QnViYmxlSW1wbCA8ZW0+Q2hhcnQgQnViYmxlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QnViYmxlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRCdWJibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQlVCQkxFID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGllcjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JVQkJMRV9fTVVMVElQTElFUiA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NdWx0aXBsaWVyIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyYWRpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQlVCQkxFX19HUkFESUVOVCA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc3BhcmVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JVQkJMRV9fVFJBTlNQQVJFTlQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgQnViYmxlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JVQkJMRV9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0JVQkJMRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9PUFRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IEJ1YmJsZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9CVUJCTEVfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfT1BUSU9OX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEdhdWdlSW1wbCA8ZW0+Q2hhcnQgR2F1Z2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRHYXVnZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfR0FVR0UgPSAxMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5MYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfR0FVR0VfX0xBQkVMRUQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TGFiZWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9HQVVHRV9fTEFCRUxfVkFMVUUgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIFRpY2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfR0FVR0VfX0hBU19USUNLUyA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NaW4gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9HQVVHRV9fTUlOX1ZBTFVFID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk1heCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0dBVUdFX19NQVhfVkFMVUUgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SGFzIEludGVydmFsczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0dBVUdFX19IQVNfSU5URVJWQUxTID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVydmFsczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfR0FVR0VfX0lOVEVSVkFMUyA9IENIQVJUX09QVElPTl9GRUFUVVJFX0NPVU5UICsgNjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DaGFydCBHYXVnZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9HQVVHRV9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyA3OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0dBVUdFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENIQVJUX09QVElPTl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgR2F1Z2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfR0FVR0VfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfT1BUSU9OX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydFRyZWVJbXBsIDxlbT5DaGFydCBUcmVlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0VHJlZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0VHJlZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9UUkVFID0gMTI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfVFJFRV9fTUFQID0gQ0hBUlRfT1BUSU9OX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbGxhcHNpYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfVFJFRV9fQ09MTEFQU0lCTEUgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgVHJlZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9UUkVFX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9PUFRJT05fRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfVFJFRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9PUFRJT05fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IFRyZWU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfVFJFRV9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9PUFRJT05fT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEludGVydmFsIDxlbT5DaGFydCBJbnRlcnZhbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbnRlcnZhbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRJbnRlcnZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBDSEFSVF9JTlRFUlZBTCA9IDEzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IEludGVydmFsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0lOVEVSVkFMX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0lOVEVSVkFMX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IEludGVydmFsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0lOVEVSVkFMX09QRVJBVElPTl9DT1VOVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TnVtYmVySW50ZXJ2YWxJbXBsIDxlbT5DaGFydCBOdW1iZXIgSW50ZXJ2YWw8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0TnVtYmVySW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTlVNQkVSX0lOVEVSVkFMID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyIEludGVydmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUgPSBDSEFSVF9JTlRFUlZBTF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OdW1iZXIgUmFuZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSA9IENIQVJUX0lOVEVSVkFMX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IE51bWJlciBJbnRlcnZhbDwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9OVU1CRVJfSU5URVJWQUxfRkVBVFVSRV9DT1VOVCA9IENIQVJUX0lOVEVSVkFMX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX05VTUJFUl9JTlRFUlZBTF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9JTlRFUlZBTF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgTnVtYmVyIEludGVydmFsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX05VTUJFUl9JTlRFUlZBTF9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9JTlRFUlZBTF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREYXRhbWFydEltcGwgPGVtPkNoYXJ0IERhdGFtYXJ0PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RGF0YW1hcnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydERhdGFtYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX0RBVEFNQVJUID0gMTU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGF0YW1hcnQgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfREFUQU1BUlRfX0RBVEFNQVJUX1JFRiA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudHM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0RBVEFNQVJUX19FTEVNRU5UUyA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgRGF0YW1hcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfREFUQU1BUlRfRkVBVFVSRV9DT1VOVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfREFUQU1BUlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgRGF0YW1hcnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfREFUQU1BUlRfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RWxlbWVudCA8ZW0+Q2hhcnQgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRFbGVtZW50CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydEVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRUxFTUVOVCA9IDE2OworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExlZ2VuZEltcGwgPGVtPkNoYXJ0IExlZ2VuZDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExlZ2VuZEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0TGVnZW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX0xFR0VORCA9IDE3OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlBsYWNlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xFR0VORF9fUExBQ0VNRU5UID0gQ0hBUlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ub2dnbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MRUdFTkRfX1RPR0dMRSA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVwbG90PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTEVHRU5EX19SRVBMT1QgPSBDSEFSVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlRvZ2dsZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfTEVHRU5EX19UT0dHTEVfVFlQRSA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgTGVnZW5kPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xFR0VORF9GRUFUVVJFX0NPVU5UID0gQ0hBUlRfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgNDsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9MRUdFTkRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgTGVnZW5kPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0xFR0VORF9PUEVSQVRJT05fQ09VTlQgPSBDSEFSVF9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEhpZ2hsaWdodGVySW1wbCA8ZW0+Q2hhcnQgSGlnaGxpZ2h0ZXI8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRIaWdobGlnaHRlckltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0SGlnaGxpZ2h0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfSElHSExJR0hURVIgPSAxODsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0hJR0hMSUdIVEVSX19MT0NBVElPTiA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VG9vbHRpcCBBbHdheXM8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9ISUdITElHSFRFUl9fVE9PTFRJUF9BTFdBWVMgPSBDSEFSVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc2lkZSBDaGFydDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0hJR0hMSUdIVEVSX19JTlNJREVfQ0hBUlQgPSBDSEFSVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkNoYXJ0IEhpZ2hsaWdodGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0hJR0hMSUdIVEVSX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0hJR0hMSUdIVEVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IENIQVJUX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPkNoYXJ0IEhpZ2hsaWdodGVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0hJR0hMSUdIVEVSX09QRVJBVElPTl9DT1VOVCA9IENIQVJUX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QXhpc0ltcGwgPGVtPkNoYXJ0IEF4aXM8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRBeGlzSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX0FYSVMgPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BeGlzPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfQVhJU19fQVhJUyA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UmVuZGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9BWElTX19SRU5ERVJfVFlQRSA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9BWElTX19TSE9SVF9MQUJFTCA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9BWElTX19BTkdMRSA9IENIQVJUX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDM7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgQXhpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9BWElTX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyA0OworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX0FYSVNfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgQXhpczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9BWElTX09QRVJBVElPTl9DT1VOVCA9IENIQVJUX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFJhbmdlRWxlbWVudCA8ZW0+Q2hhcnQgUmFuZ2UgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0UmFuZ2VFbGVtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IENIQVJUX1JBTkdFX0VMRU1FTlQgPSAyMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5DaGFydCBSYW5nZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1JBTkdFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCA9IENIQVJUX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQ0hBUlRfUkFOR0VfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBDSEFSVF9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5DaGFydCBSYW5nZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1JBTkdFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UID0gQ0hBUlRfTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRTZWdtZW50Q29sb3JJbXBsIDxlbT5DaGFydCBTZWdtZW50IENvbG9yPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0U2VnbWVudENvbG9ySW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRTZWdtZW50Q29sb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQ0hBUlRfU0VHTUVOVF9DT0xPUiA9IDIxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlJnYjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1NFR01FTlRfQ09MT1JfX1JHQiA9IENIQVJUX1JBTkdFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Q2hhcnQgU2VnbWVudCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9TRUdNRU5UX0NPTE9SX0ZFQVRVUkVfQ09VTlQgPSBDSEFSVF9SQU5HRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IENIQVJUX1NFR01FTlRfQ09MT1JfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQ0hBUlRfUkFOR0VfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Q2hhcnQgU2VnbWVudCBDb2xvcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBDSEFSVF9TRUdNRU5UX0NPTE9SX09QRVJBVElPTl9DT1VOVCA9IENIQVJUX1JBTkdFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5MZWdlbmRQbGFjZW1lbnRFbnVtIDxlbT5MZWdlbmQgUGxhY2VtZW50IEVudW08L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0TGVnZW5kUGxhY2VtZW50RW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBMRUdFTkRfUExBQ0VNRU5UX0VOVU0gPSAyMjsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bSA8ZW0+VG9nZ2xlIFR5cGUgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0VG9nZ2xlVHlwZUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgVE9HR0xFX1RZUEVfRU5VTSA9IDIzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0gPGVtPlRvb2x0aXAgTG9jYXRpb24gRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRUb29sdGlwTG9jYXRpb25FbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFRPT0xUSVBfTE9DQVRJT05fRU5VTSA9IDI0OworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtIDxlbT5SZW5kZXIgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRSZW5kZXJUeXBlRW51bSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBSRU5ERVJfVFlQRV9FTlVNID0gMjU7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRJbnRlcm5hbEVPYmplY3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgSU5URVJOQUxfRU9CSkVDVCA9IDI2OworCisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TW9kZWwgPGVtPkNoYXJ0IE1vZGVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydE1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsI2dldFBhY2thZ2VzIDxlbT5QYWNrYWdlczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+UGFja2FnZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TW9kZWwjZ2V0UGFja2FnZXMoKQorCSAqIEBzZWUgI2dldENoYXJ0TW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENoYXJ0TW9kZWxfUGFja2FnZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMYXp5UmVzb2x2ZXIgPGVtPkNoYXJ0IExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMYXp5UmVzb2x2ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0TGF6eVJlc29sdmVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExhenlSZXNvbHZlciNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpIDxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMYXp5UmVzb2x2ZXIjZVJlc29sdmVQcm94eShvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFT3BlcmF0aW9uIGdldENoYXJ0TGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXNlIDxlbT5DaGFydCBCYXNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IEJhc2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnRCYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5OYW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhc2UjZ2V0TmFtZSgpCisJICogQHNlZSAjZ2V0Q2hhcnRCYXNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEJhc2VfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2UgPGVtPkNoYXJ0IFBhY2thZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydFBhY2thZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZSNnZXRDaGFydHMgPGVtPkNoYXJ0czwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+Q2hhcnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2UjZ2V0Q2hhcnRzKCkKKwkgKiBAc2VlICNnZXRDaGFydFBhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENoYXJ0UGFja2FnZV9DaGFydHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQgPGVtPkNoYXJ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNpc0Rlc2NyaXB0aW9uIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNpc0Rlc2NyaXB0aW9uKCkKKwkgKiBAc2VlICNnZXRDaGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRfRGVzY3JpcHRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXREZXNjcmlwdGlvblZhbHVlIDxlbT5EZXNjcmlwdGlvbiBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXREZXNjcmlwdGlvblZhbHVlKCkKKwkgKiBAc2VlICNnZXRDaGFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRfRGVzY3JpcHRpb25WYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2lzUG9sbGluZyA8ZW0+UG9sbGluZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBvbGxpbmc8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2lzUG9sbGluZygpCisJICogQHNlZSAjZ2V0Q2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0X1BvbGxpbmcoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXRQb2xsaW5nVGltZSA8ZW0+UG9sbGluZyBUaW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UG9sbGluZyBUaW1lPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXRQb2xsaW5nVGltZSgpCisJICogQHNlZSAjZ2V0Q2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0X1BvbGxpbmdUaW1lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQjZ2V0Q2hhcnR0eXBlIDxlbT5DaGFydHR5cGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5DaGFydHR5cGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2dldENoYXJ0dHlwZSgpCisJICogQHNlZSAjZ2V0Q2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENoYXJ0X0NoYXJ0dHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0I2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlICc8ZW0+U291cmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCNnZXRTb3VyY2UoKQorCSAqIEBzZWUgI2dldENoYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDaGFydF9Tb3VyY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRPcHRpb24gPGVtPkNoYXJ0IE9wdGlvbjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGFydCBPcHRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0T3B0aW9uCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydE9wdGlvbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciA8ZW0+Q2hhcnQgQmFyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IEJhcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0QmFyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTaGFkb3cgPGVtPlNoYWRvdzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlNoYWRvdzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTaGFkb3coKQorCSAqIEBzZWUgI2dldENoYXJ0QmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEJhcl9TaGFkb3coKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc0FuaW1hdGVkIDxlbT5BbmltYXRlZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkFuaW1hdGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc0FuaW1hdGVkKCkKKwkgKiBAc2VlICNnZXRDaGFydEJhcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRCYXJfQW5pbWF0ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc1N3YXBwZWQgPGVtPlN3YXBwZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Td2FwcGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhciNpc1N3YXBwZWQoKQorCSAqIEBzZWUgI2dldENoYXJ0QmFyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEJhcl9Td2FwcGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTdGFja2VkIDxlbT5TdGFja2VkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3RhY2tlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIjaXNTdGFja2VkKCkKKwkgKiBAc2VlICNnZXRDaGFydEJhcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRCYXJfU3RhY2tlZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUgPGVtPkNoYXJ0IExpbmU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgTGluZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydExpbmUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNBbmltYXRlZCA8ZW0+QW5pbWF0ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5BbmltYXRlZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzQW5pbWF0ZWQoKQorCSAqIEBzZWUgI2dldENoYXJ0TGluZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRMaW5lX0FuaW1hdGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzU2hvd01hcmtlciA8ZW0+U2hvdyBNYXJrZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5TaG93IE1hcmtlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzU2hvd01hcmtlcigpCisJICogQHNlZSAjZ2V0Q2hhcnRMaW5lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydExpbmVfU2hvd01hcmtlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1RyZW5kTGluZSA8ZW0+VHJlbmQgTGluZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRyZW5kIExpbmU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1RyZW5kTGluZSgpCisJICogQHNlZSAjZ2V0Q2hhcnRMaW5lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydExpbmVfVHJlbmRMaW5lKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzWm9vbSA8ZW0+Wm9vbTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlpvb208L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1pvb20oKQorCSAqIEBzZWUgI2dldENoYXJ0TGluZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRMaW5lX1pvb20oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNDdXJzb3IgPGVtPkN1cnNvcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkN1cnNvcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzQ3Vyc29yKCkKKwkgKiBAc2VlICNnZXRDaGFydExpbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0TGluZV9DdXJzb3IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNUb29sdGlwIDxlbT5Ub29sdGlwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+VG9vbHRpcDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzVG9vbHRpcCgpCisJICogQHNlZSAjZ2V0Q2hhcnRMaW5lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydExpbmVfVG9vbHRpcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0ZpbGxUb1plcm8gPGVtPkZpbGwgVG8gWmVybzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkZpbGwgVG8gWmVybzwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzRmlsbFRvWmVybygpCisJICogQHNlZSAjZ2V0Q2hhcnRMaW5lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydExpbmVfRmlsbFRvWmVybygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0ZpbGxBcmVhIDxlbT5GaWxsIEFyZWE8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5GaWxsIEFyZWE8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0ZpbGxBcmVhKCkKKwkgKiBAc2VlICNnZXRDaGFydExpbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0TGluZV9GaWxsQXJlYSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBpZSA8ZW0+Q2hhcnQgUGllPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IFBpZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0UGllKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWUjaXNFbXB0eSA8ZW0+RW1wdHk8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbXB0eTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWUjaXNFbXB0eSgpCisJICogQHNlZSAjZ2V0Q2hhcnRQaWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0UGllX0VtcHR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RG9udXQgPGVtPkNoYXJ0IERvbnV0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IERvbnV0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERvbnV0CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydERvbnV0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlIDxlbT5DaGFydCBCdWJibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgQnViYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnRCdWJibGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZSNpc011bHRpcGxpZXIgPGVtPk11bHRpcGxpZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NdWx0aXBsaWVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZSNpc011bHRpcGxpZXIoKQorCSAqIEBzZWUgI2dldENoYXJ0QnViYmxlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEJ1YmJsZV9NdWx0aXBsaWVyKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjZ2V0TXVsdGlwbGllclZhbHVlIDxlbT5NdWx0aXBsaWVyIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TXVsdGlwbGllciBWYWx1ZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjZ2V0TXVsdGlwbGllclZhbHVlKCkKKwkgKiBAc2VlICNnZXRDaGFydEJ1YmJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRCdWJibGVfTXVsdGlwbGllclZhbHVlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNHcmFkaWVudCA8ZW0+R3JhZGllbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5HcmFkaWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNHcmFkaWVudCgpCisJICogQHNlZSAjZ2V0Q2hhcnRCdWJibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0QnViYmxlX0dyYWRpZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNUcmFuc3BhcmVudCA8ZW0+VHJhbnNwYXJlbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5UcmFuc3BhcmVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUjaXNUcmFuc3BhcmVudCgpCisJICogQHNlZSAjZ2V0Q2hhcnRCdWJibGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0QnViYmxlX1RyYW5zcGFyZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UgPGVtPkNoYXJ0IEdhdWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IEdhdWdlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydEdhdWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNpc0xhYmVsZWQgPGVtPkxhYmVsZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5MYWJlbGVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzTGFiZWxlZCgpCisJICogQHNlZSAjZ2V0Q2hhcnRHYXVnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRHYXVnZV9MYWJlbGVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRMYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkxhYmVsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldExhYmVsVmFsdWUoKQorCSAqIEBzZWUgI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfTGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UjaXNIYXNUaWNrcyA8ZW0+SGFzIFRpY2tzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIFRpY2tzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzSGFzVGlja3MoKQorCSAqIEBzZWUgI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfSGFzVGlja3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldE1pblZhbHVlIDxlbT5NaW4gVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NaW4gVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UjZ2V0TWluVmFsdWUoKQorCSAqIEBzZWUgI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfTWluVmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldE1heFZhbHVlIDxlbT5NYXggVmFsdWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5NYXggVmFsdWU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UjZ2V0TWF4VmFsdWUoKQorCSAqIEBzZWUgI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfTWF4VmFsdWUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzSGFzSW50ZXJ2YWxzIDxlbT5IYXMgSW50ZXJ2YWxzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SGFzIEludGVydmFsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNpc0hhc0ludGVydmFscygpCisJICogQHNlZSAjZ2V0Q2hhcnRHYXVnZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRHYXVnZV9IYXNJbnRlcnZhbHMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UjZ2V0SW50ZXJ2YWxzIDxlbT5JbnRlcnZhbHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkludGVydmFsczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRJbnRlcnZhbHMoKQorCSAqIEBzZWUgI2dldENoYXJ0R2F1Z2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldENoYXJ0R2F1Z2VfSW50ZXJ2YWxzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZSA8ZW0+Q2hhcnQgVHJlZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGFydCBUcmVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0VHJlZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZSNpc01hcCA8ZW0+TWFwPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TWFwPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUjaXNNYXAoKQorCSAqIEBzZWUgI2dldENoYXJ0VHJlZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRUcmVlX01hcCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZSNpc0NvbGxhcHNpYmxlIDxlbT5Db2xsYXBzaWJsZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbGxhcHNpYmxlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUjaXNDb2xsYXBzaWJsZSgpCisJICogQHNlZSAjZ2V0Q2hhcnRUcmVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydFRyZWVfQ29sbGFwc2libGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbnRlcnZhbCA8ZW0+Q2hhcnQgSW50ZXJ2YWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgSW50ZXJ2YWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SW50ZXJ2YWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0SW50ZXJ2YWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCA8ZW0+Q2hhcnQgTnVtYmVyIEludGVydmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IE51bWJlciBJbnRlcnZhbDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSA8ZW0+TnVtYmVyIEludGVydmFsIFZhbHVlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TnVtYmVyIEludGVydmFsIFZhbHVlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE51bWJlckludGVydmFsI2dldE51bWJlckludGVydmFsVmFsdWUoKQorCSAqIEBzZWUgI2dldENoYXJ0TnVtYmVySW50ZXJ2YWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0TnVtYmVySW50ZXJ2YWxfTnVtYmVySW50ZXJ2YWxWYWx1ZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwjZ2V0TnVtYmVyUmFuZ2UgPGVtPk51bWJlciBSYW5nZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPk51bWJlciBSYW5nZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJSYW5nZSgpCisJICogQHNlZSAjZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJSYW5nZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0IDxlbT5DaGFydCBEYXRhbWFydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGFydCBEYXRhbWFydDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnREYXRhbWFydCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQjZ2V0RGF0YW1hcnRSZWYgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkRhdGFtYXJ0IFJlZjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydCNnZXREYXRhbWFydFJlZigpCisJICogQHNlZSAjZ2V0Q2hhcnREYXRhbWFydCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Q2hhcnREYXRhbWFydF9EYXRhbWFydFJlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydCNnZXRFbGVtZW50cyA8ZW0+RWxlbWVudHM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkVsZW1lbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0I2dldEVsZW1lbnRzKCkKKwkgKiBAc2VlICNnZXRDaGFydERhdGFtYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDaGFydERhdGFtYXJ0X0VsZW1lbnRzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RWxlbWVudCA8ZW0+Q2hhcnQgRWxlbWVudDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGFydCBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0RWxlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZCA8ZW0+Q2hhcnQgTGVnZW5kPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IExlZ2VuZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0TGVnZW5kKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQjZ2V0UGxhY2VtZW50IDxlbT5QbGFjZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QbGFjZW1lbnQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2dldFBsYWNlbWVudCgpCisJICogQHNlZSAjZ2V0Q2hhcnRMZWdlbmQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0TGVnZW5kX1BsYWNlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2lzVG9nZ2xlIDxlbT5Ub2dnbGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub2dnbGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2lzVG9nZ2xlKCkKKwkgKiBAc2VlICNnZXRDaGFydExlZ2VuZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRMZWdlbmRfVG9nZ2xlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQjaXNSZXBsb3QgPGVtPlJlcGxvdDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlcGxvdDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQjaXNSZXBsb3QoKQorCSAqIEBzZWUgI2dldENoYXJ0TGVnZW5kKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydExlZ2VuZF9SZXBsb3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZCNnZXRUb2dnbGVUeXBlIDxlbT5Ub2dnbGUgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlRvZ2dsZSBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZCNnZXRUb2dnbGVUeXBlKCkKKwkgKiBAc2VlICNnZXRDaGFydExlZ2VuZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRMZWdlbmRfVG9nZ2xlVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyIDxlbT5DaGFydCBIaWdobGlnaHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5DaGFydCBIaWdobGlnaHRlcjwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnRIaWdobGlnaHRlcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TG9jYXRpb248L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIjZ2V0TG9jYXRpb24oKQorCSAqIEBzZWUgI2dldENoYXJ0SGlnaGxpZ2h0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0SGlnaGxpZ2h0ZXJfTG9jYXRpb24oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyI2lzVG9vbHRpcEFsd2F5cyA8ZW0+VG9vbHRpcCBBbHdheXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Ub29sdGlwIEFsd2F5czwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlciNpc1Rvb2x0aXBBbHdheXMoKQorCSAqIEBzZWUgI2dldENoYXJ0SGlnaGxpZ2h0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0SGlnaGxpZ2h0ZXJfVG9vbHRpcEFsd2F5cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIjaXNJbnNpZGVDaGFydCA8ZW0+SW5zaWRlIENoYXJ0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+SW5zaWRlIENoYXJ0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyI2lzSW5zaWRlQ2hhcnQoKQorCSAqIEBzZWUgI2dldENoYXJ0SGlnaGxpZ2h0ZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldENoYXJ0SGlnaGxpZ2h0ZXJfSW5zaWRlQ2hhcnQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzIDxlbT5DaGFydCBBeGlzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IEF4aXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Q2hhcnRBeGlzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzI2dldEF4aXMgPGVtPkF4aXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BeGlzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMjZ2V0QXhpcygpCisJICogQHNlZSAjZ2V0Q2hhcnRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRDaGFydEF4aXNfQXhpcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNnZXRSZW5kZXJUeXBlIDxlbT5SZW5kZXIgVHlwZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlJlbmRlciBUeXBlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMjZ2V0UmVuZGVyVHlwZSgpCisJICogQHNlZSAjZ2V0Q2hhcnRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEF4aXNfUmVuZGVyVHlwZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNpc1Nob3J0TGFiZWwgPGVtPlNob3J0IExhYmVsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U2hvcnQgTGFiZWw8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNpc1Nob3J0TGFiZWwoKQorCSAqIEBzZWUgI2dldENoYXJ0QXhpcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Q2hhcnRBeGlzX1Nob3J0TGFiZWwoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMjZ2V0QW5nbGUgPGVtPkFuZ2xlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QW5nbGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpcyNnZXRBbmdsZSgpCisJICogQHNlZSAjZ2V0Q2hhcnRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydEF4aXNfQW5nbGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQgPGVtPkNoYXJ0IFJhbmdlIEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Q2hhcnQgUmFuZ2UgRWxlbWVudDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldENoYXJ0UmFuZ2VFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yIDxlbT5DaGFydCBTZWdtZW50IENvbG9yPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkNoYXJ0IFNlZ21lbnQgQ29sb3I8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRDaGFydFNlZ21lbnRDb2xvcigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yI2dldFJnYiA8ZW0+UmdiPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UmdiPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFNlZ21lbnRDb2xvciNnZXRSZ2IoKQorCSAqIEBzZWUgI2dldENoYXJ0U2VnbWVudENvbG9yKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRDaGFydFNlZ21lbnRDb2xvcl9SZ2IoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5MZWdlbmRQbGFjZW1lbnRFbnVtIDxlbT5MZWdlbmQgUGxhY2VtZW50IEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5MZWdlbmQgUGxhY2VtZW50IEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0TGVnZW5kUGxhY2VtZW50RW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtIDxlbT5Ub2dnbGUgVHlwZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+VG9nZ2xlIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9nZ2xlVHlwZUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VG9nZ2xlVHlwZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtIDxlbT5Ub29sdGlwIExvY2F0aW9uIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Ub29sdGlwIExvY2F0aW9uIEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0VG9vbHRpcExvY2F0aW9uRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtIDxlbT5SZW5kZXIgVHlwZSBFbnVtPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+UmVuZGVyIFR5cGUgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0UmVuZGVyVHlwZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJ3tAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IDxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBkYXRhIHR5cGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAorCSAqIEBtb2RlbCBpbnN0YW5jZUNsYXNzPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRGF0YVR5cGUgZ2V0SW50ZXJuYWxFT2JqZWN0KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBmYWN0b3J5IHRoYXQgY3JlYXRlcyB0aGUgaW5zdGFuY2VzIG9mIHRoZSBtb2RlbC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlDaGFydERTTEZhY3RvcnkgZ2V0Q2hhcnREU0xGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBvcGVyYXRpb24gb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRNb2RlbEltcGwgPGVtPkNoYXJ0IE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TW9kZWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRNb2RlbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9NT0RFTCA9IGVJTlNUQU5DRS5nZXRDaGFydE1vZGVsKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5QYWNrYWdlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ0hBUlRfTU9ERUxfX1BBQ0tBR0VTID0gZUlOU1RBTkNFLmdldENoYXJ0TW9kZWxfUGFja2FnZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExhenlSZXNvbHZlckltcGwgPGVtPkNoYXJ0IExhenkgUmVzb2x2ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRMYXp5UmVzb2x2ZXIoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ0hBUlRfTEFaWV9SRVNPTFZFUiA9IGVJTlNUQU5DRS5nZXRDaGFydExhenlSZXNvbHZlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RVJlc29sdmUgUHJveHk8L2I+PC9lbT4nIG9wZXJhdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVPcGVyYXRpb24gQ0hBUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFzZUltcGwgPGVtPkNoYXJ0IEJhc2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRCYXNlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0QmFzZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9CQVNFID0gZUlOU1RBTkNFLmdldENoYXJ0QmFzZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0JBU0VfX05BTUUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCYXNlX05hbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydFBhY2thZ2VJbXBsIDxlbT5DaGFydCBQYWNrYWdlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGFja2FnZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydFBhY2thZ2UoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ0hBUlRfUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRDaGFydFBhY2thZ2UoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYXJ0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ0hBUlRfUEFDS0FHRV9fQ0hBUlRTID0gZUlOU1RBTkNFLmdldENoYXJ0UGFja2FnZV9DaGFydHMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEltcGwgPGVtPkNoYXJ0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUID0gZUlOU1RBTkNFLmdldENoYXJ0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EZXNjcmlwdGlvbjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX19ERVNDUklQVElPTiA9IGVJTlNUQU5DRS5nZXRDaGFydF9EZXNjcmlwdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RGVzY3JpcHRpb24gVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9fREVTQ1JJUFRJT05fVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRfRGVzY3JpcHRpb25WYWx1ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UG9sbGluZzwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX19QT0xMSU5HID0gZUlOU1RBTkNFLmdldENoYXJ0X1BvbGxpbmcoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBvbGxpbmcgVGltZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX19QT0xMSU5HX1RJTUUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRfUG9sbGluZ1RpbWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkNoYXJ0dHlwZTwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIENIQVJUX19DSEFSVFRZUEUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRfQ2hhcnR0eXBlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Tb3VyY2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDSEFSVF9fU09VUkNFID0gZUlOU1RBTkNFLmdldENoYXJ0X1NvdXJjZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbiA8ZW0+Q2hhcnQgT3B0aW9uPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0T3B0aW9uKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX09QVElPTiA9IGVJTlNUQU5DRS5nZXRDaGFydE9wdGlvbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFySW1wbCA8ZW0+Q2hhcnQgQmFyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFySW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0QmFyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0JBUiA9IGVJTlNUQU5DRS5nZXRDaGFydEJhcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hhZG93PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfQkFSX19TSEFET1cgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCYXJfU2hhZG93KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0JBUl9fQU5JTUFURUQgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCYXJfQW5pbWF0ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlN3YXBwZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9CQVJfX1NXQVBQRUQgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCYXJfU3dhcHBlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U3RhY2tlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0JBUl9fU1RBQ0tFRCA9IGVJTlNUQU5DRS5nZXRDaGFydEJhcl9TdGFja2VkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCA8ZW0+Q2hhcnQgTGluZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExpbmVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRMaW5lKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0xJTkUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMaW5lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbmltYXRlZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0xJTkVfX0FOSU1BVEVEID0gZUlOU1RBTkNFLmdldENoYXJ0TGluZV9BbmltYXRlZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hvdyBNYXJrZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9MSU5FX19TSE9XX01BUktFUiA9IGVJTlNUQU5DRS5nZXRDaGFydExpbmVfU2hvd01hcmtlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJlbmQgTGluZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0xJTkVfX1RSRU5EX0xJTkUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMaW5lX1RyZW5kTGluZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Wm9vbTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0xJTkVfX1pPT00gPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMaW5lX1pvb20oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkN1cnNvcjwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0xJTkVfX0NVUlNPUiA9IGVJTlNUQU5DRS5nZXRDaGFydExpbmVfQ3Vyc29yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub29sdGlwPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfTElORV9fVE9PTFRJUCA9IGVJTlNUQU5DRS5nZXRDaGFydExpbmVfVG9vbHRpcCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RmlsbCBUbyBaZXJvPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfTElORV9fRklMTF9UT19aRVJPID0gZUlOU1RBTkNFLmdldENoYXJ0TGluZV9GaWxsVG9aZXJvKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5GaWxsIEFyZWE8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9MSU5FX19GSUxMX0FSRUEgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMaW5lX0ZpbGxBcmVhKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRQaWVJbXBsIDxlbT5DaGFydCBQaWU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRQaWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRQaWUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ0hBUlRfUElFID0gZUlOU1RBTkNFLmdldENoYXJ0UGllKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbXB0eTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX1BJRV9fRU1QVFkgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRQaWVfRW1wdHkoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERvbnV0SW1wbCA8ZW0+Q2hhcnQgRG9udXQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREb251dEltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydERvbnV0KCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0RPTlVUID0gZUlOU1RBTkNFLmdldENoYXJ0RG9udXQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJ1YmJsZUltcGwgPGVtPkNoYXJ0IEJ1YmJsZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJ1YmJsZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydEJ1YmJsZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9CVUJCTEUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCdWJibGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPk11bHRpcGxpZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9CVUJCTEVfX01VTFRJUExJRVIgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRCdWJibGVfTXVsdGlwbGllcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TXVsdGlwbGllciBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0JVQkJMRV9fTVVMVElQTElFUl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRDaGFydEJ1YmJsZV9NdWx0aXBsaWVyVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkdyYWRpZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfQlVCQkxFX19HUkFESUVOVCA9IGVJTlNUQU5DRS5nZXRDaGFydEJ1YmJsZV9HcmFkaWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VHJhbnNwYXJlbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9CVUJCTEVfX1RSQU5TUEFSRU5UID0gZUlOU1RBTkNFLmdldENoYXJ0QnViYmxlX1RyYW5zcGFyZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRHYXVnZUltcGwgPGVtPkNoYXJ0IEdhdWdlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0R2F1Z2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRHYXVnZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9HQVVHRSA9IGVJTlNUQU5DRS5nZXRDaGFydEdhdWdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYWJlbGVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfR0FVR0VfX0xBQkVMRUQgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRHYXVnZV9MYWJlbGVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5MYWJlbCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0dBVUdFX19MQUJFTF9WQUxVRSA9IGVJTlNUQU5DRS5nZXRDaGFydEdhdWdlX0xhYmVsVmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhcyBUaWNrczwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0dBVUdFX19IQVNfVElDS1MgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRHYXVnZV9IYXNUaWNrcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TWluIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfR0FVR0VfX01JTl9WQUxVRSA9IGVJTlNUQU5DRS5nZXRDaGFydEdhdWdlX01pblZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXggVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9HQVVHRV9fTUFYX1ZBTFVFID0gZUlOU1RBTkNFLmdldENoYXJ0R2F1Z2VfTWF4VmFsdWUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkhhcyBJbnRlcnZhbHM8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9HQVVHRV9fSEFTX0lOVEVSVkFMUyA9IGVJTlNUQU5DRS5nZXRDaGFydEdhdWdlX0hhc0ludGVydmFscygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW50ZXJ2YWxzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDSEFSVF9HQVVHRV9fSU5URVJWQUxTID0gZUlOU1RBTkNFLmdldENoYXJ0R2F1Z2VfSW50ZXJ2YWxzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRUcmVlSW1wbCA8ZW0+Q2hhcnQgVHJlZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydFRyZWVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRUcmVlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX1RSRUUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRUcmVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5NYXA8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9UUkVFX19NQVAgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRUcmVlX01hcCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Q29sbGFwc2libGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9UUkVFX19DT0xMQVBTSUJMRSA9IGVJTlNUQU5DRS5nZXRDaGFydFRyZWVfQ29sbGFwc2libGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbnRlcnZhbCA8ZW0+Q2hhcnQgSW50ZXJ2YWw8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SW50ZXJ2YWwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydEludGVydmFsKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0lOVEVSVkFMID0gZUlOU1RBTkNFLmdldENoYXJ0SW50ZXJ2YWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydE51bWJlckludGVydmFsSW1wbCA8ZW0+Q2hhcnQgTnVtYmVyIEludGVydmFsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TnVtYmVySW50ZXJ2YWxJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9OVU1CRVJfSU5URVJWQUwgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TnVtYmVyIEludGVydmFsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5OdW1iZXIgUmFuZ2U8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSA9IGVJTlNUQU5DRS5nZXRDaGFydE51bWJlckludGVydmFsX051bWJlclJhbmdlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREYXRhbWFydEltcGwgPGVtPkNoYXJ0IERhdGFtYXJ0PC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RGF0YW1hcnRJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnREYXRhbWFydCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9EQVRBTUFSVCA9IGVJTlNUQU5DRS5nZXRDaGFydERhdGFtYXJ0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EYXRhbWFydCBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDSEFSVF9EQVRBTUFSVF9fREFUQU1BUlRfUkVGID0gZUlOU1RBTkNFLmdldENoYXJ0RGF0YW1hcnRfRGF0YW1hcnRSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBDSEFSVF9EQVRBTUFSVF9fRUxFTUVOVFMgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnREYXRhbWFydF9FbGVtZW50cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQgPGVtPkNoYXJ0IEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RWxlbWVudAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0RWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9FTEVNRU5UID0gZUlOU1RBTkNFLmdldENoYXJ0RWxlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGVnZW5kSW1wbCA8ZW0+Q2hhcnQgTGVnZW5kPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGVnZW5kSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldENoYXJ0TGVnZW5kKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0xFR0VORCA9IGVJTlNUQU5DRS5nZXRDaGFydExlZ2VuZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UGxhY2VtZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfTEVHRU5EX19QTEFDRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRMZWdlbmRfUGxhY2VtZW50KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Ub2dnbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9MRUdFTkRfX1RPR0dMRSA9IGVJTlNUQU5DRS5nZXRDaGFydExlZ2VuZF9Ub2dnbGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlJlcGxvdDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIENIQVJUX0xFR0VORF9fUkVQTE9UID0gZUlOU1RBTkNFLmdldENoYXJ0TGVnZW5kX1JlcGxvdCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+VG9nZ2xlIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9MRUdFTkRfX1RPR0dMRV9UWVBFID0gZUlOU1RBTkNFLmdldENoYXJ0TGVnZW5kX1RvZ2dsZVR5cGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEhpZ2hsaWdodGVySW1wbCA8ZW0+Q2hhcnQgSGlnaGxpZ2h0ZXI8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRIaWdobGlnaHRlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydEhpZ2hsaWdodGVyKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0hJR0hMSUdIVEVSID0gZUlOU1RBTkNFLmdldENoYXJ0SGlnaGxpZ2h0ZXIoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkxvY2F0aW9uPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfSElHSExJR0hURVJfX0xPQ0FUSU9OID0gZUlOU1RBTkNFLmdldENoYXJ0SGlnaGxpZ2h0ZXJfTG9jYXRpb24oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlRvb2x0aXAgQWx3YXlzPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfSElHSExJR0hURVJfX1RPT0xUSVBfQUxXQVlTID0gZUlOU1RBTkNFLmdldENoYXJ0SGlnaGxpZ2h0ZXJfVG9vbHRpcEFsd2F5cygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+SW5zaWRlIENoYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgQ0hBUlRfSElHSExJR0hURVJfX0lOU0lERV9DSEFSVCA9IGVJTlNUQU5DRS5nZXRDaGFydEhpZ2hsaWdodGVyX0luc2lkZUNoYXJ0KCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRBeGlzSW1wbCA8ZW0+Q2hhcnQgQXhpczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEF4aXNJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRBeGlzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIENIQVJUX0FYSVMgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRBeGlzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BeGlzPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgQ0hBUlRfQVhJU19fQVhJUyA9IGVJTlNUQU5DRS5nZXRDaGFydEF4aXNfQXhpcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UmVuZGVyIFR5cGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9BWElTX19SRU5ERVJfVFlQRSA9IGVJTlNUQU5DRS5nZXRDaGFydEF4aXNfUmVuZGVyVHlwZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+U2hvcnQgTGFiZWw8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9BWElTX19TSE9SVF9MQUJFTCA9IGVJTlNUQU5DRS5nZXRDaGFydEF4aXNfU2hvcnRMYWJlbCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QW5nbGU8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9BWElTX19BTkdMRSA9IGVJTlNUQU5DRS5nZXRDaGFydEF4aXNfQW5nbGUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQgPGVtPkNoYXJ0IFJhbmdlIEVsZW1lbnQ8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UmFuZ2VFbGVtZW50CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0Q2hhcnRSYW5nZUVsZW1lbnQoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQ0hBUlRfUkFOR0VfRUxFTUVOVCA9IGVJTlNUQU5DRS5nZXRDaGFydFJhbmdlRWxlbWVudCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0U2VnbWVudENvbG9ySW1wbCA8ZW0+Q2hhcnQgU2VnbWVudCBDb2xvcjwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydFNlZ21lbnRDb2xvckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREU0xQYWNrYWdlSW1wbCNnZXRDaGFydFNlZ21lbnRDb2xvcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBDSEFSVF9TRUdNRU5UX0NPTE9SID0gZUlOU1RBTkNFLmdldENoYXJ0U2VnbWVudENvbG9yKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5SZ2I8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBDSEFSVF9TRUdNRU5UX0NPTE9SX19SR0IgPSBlSU5TVEFOQ0UuZ2V0Q2hhcnRTZWdtZW50Q29sb3JfUmdiKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW0gPGVtPkxlZ2VuZCBQbGFjZW1lbnQgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5MZWdlbmRQbGFjZW1lbnRFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0TGVnZW5kUGxhY2VtZW50RW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIExFR0VORF9QTEFDRU1FTlRfRU5VTSA9IGVJTlNUQU5DRS5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtIDxlbT5Ub2dnbGUgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0VG9nZ2xlVHlwZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBUT0dHTEVfVFlQRV9FTlVNID0gZUlOU1RBTkNFLmdldFRvZ2dsZVR5cGVFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0gPGVtPlRvb2x0aXAgTG9jYXRpb24gRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0VG9vbHRpcExvY2F0aW9uRW51bSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVFbnVtIFRPT0xUSVBfTE9DQVRJT05fRU5VTSA9IGVJTlNUQU5DRS5nZXRUb29sdGlwTG9jYXRpb25FbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtIDxlbT5SZW5kZXIgVHlwZSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RFNMUGFja2FnZUltcGwjZ2V0UmVuZGVyVHlwZUVudW0oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRW51bSBSRU5ERVJfVFlQRV9FTlVNID0gZUlOU1RBTkNFLmdldFJlbmRlclR5cGVFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydERTTFBhY2thZ2VJbXBsI2dldEludGVybmFsRU9iamVjdCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVEYXRhVHlwZSBJTlRFUk5BTF9FT0JKRUNUID0gZUlOU1RBTkNFLmdldEludGVybmFsRU9iamVjdCgpOworCisJfQorCit9IC8vQ2hhcnREU0xQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERhdGFtYXJ0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERhdGFtYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhNjEzMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RGF0YW1hcnQuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREZWZpbml0aW9uOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBEYXRhbWFydDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQjZ2V0RGF0YW1hcnRSZWYgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0I2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnREYXRhbWFydCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydERhdGFtYXJ0IGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRhdGFtYXJ0IFJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGF0YW1hcnQgUmVmPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RGF0YW1hcnRSZWYoRGF0YW1hcnREZWZpbml0aW9uKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnREYXRhbWFydF9EYXRhbWFydFJlZigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCURhdGFtYXJ0RGVmaW5pdGlvbiBnZXREYXRhbWFydFJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0I2dldERhdGFtYXJ0UmVmIDxlbT5EYXRhbWFydCBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRhdGFtYXJ0IFJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjZ2V0RGF0YW1hcnRSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldERhdGFtYXJ0UmVmKERhdGFtYXJ0RGVmaW5pdGlvbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRFbGVtZW50fS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RWxlbWVudHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydERhdGFtYXJ0X0VsZW1lbnRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PENoYXJ0RWxlbWVudD4gZ2V0RWxlbWVudHMoKTsKKworfSAvLyBDaGFydERhdGFtYXJ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERvbnV0LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERvbnV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViY2IwOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RG9udXQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBEb251dDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydERvbnV0KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0RG9udXQgZXh0ZW5kcyBDaGFydE9wdGlvbiB7Cit9IC8vIENoYXJ0RG9udXQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRFbGVtZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3NWZkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RWxlbWVudC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IEVsZW1lbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRFbGVtZW50KCkKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0RWxlbWVudCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVyIHsKK30gLy8gQ2hhcnRFbGVtZW50CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEdhdWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEdhdWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExNTExOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0R2F1Z2UuamF2YQpAQCAtMCwwICsxLDIxMyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IEdhdWdlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNpc0xhYmVsZWQgPGVtPkxhYmVsZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRMYWJlbFZhbHVlIDxlbT5MYWJlbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzSGFzVGlja3MgPGVtPkhhcyBUaWNrczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldE1pblZhbHVlIDxlbT5NaW4gVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRNYXhWYWx1ZSA8ZW0+TWF4IFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UjaXNIYXNJbnRlcnZhbHMgPGVtPkhhcyBJbnRlcnZhbHM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRJbnRlcnZhbHMgPGVtPkludGVydmFsczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRHYXVnZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydEdhdWdlIGV4dGVuZHMgQ2hhcnRPcHRpb24geworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhYmVsZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkxhYmVsZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TGFiZWxlZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TGFiZWxlZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRHYXVnZV9MYWJlbGVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0xhYmVsZWQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNpc0xhYmVsZWQgPGVtPkxhYmVsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxhYmVsZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzTGFiZWxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TGFiZWxlZChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkxhYmVsIFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TGFiZWxWYWx1ZShTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEdhdWdlX0xhYmVsVmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TGFiZWxWYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldExhYmVsVmFsdWUgPGVtPkxhYmVsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5MYWJlbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TGFiZWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TGFiZWxWYWx1ZShTdHJpbmcgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIFRpY2tzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5IYXMgVGlja3M8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIFRpY2tzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRIYXNUaWNrcyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRHYXVnZV9IYXNUaWNrcygpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNIYXNUaWNrcygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzSGFzVGlja3MgPGVtPkhhcyBUaWNrczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SGFzIFRpY2tzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0hhc1RpY2tzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRIYXNUaWNrcyhib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk1pbiBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+TWluIFZhbHVlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk1pbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0TWluVmFsdWUoaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRHYXVnZV9NaW5WYWx1ZSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBnZXRNaW5WYWx1ZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2dldE1pblZhbHVlIDxlbT5NaW4gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk1pbiBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TWluVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE1pblZhbHVlKGludCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5NYXggVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk1heCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE1heFZhbHVlKGludCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0R2F1Z2VfTWF4VmFsdWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgZ2V0TWF4VmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZSNnZXRNYXhWYWx1ZSA8ZW0+TWF4IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXggVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE1heFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXhWYWx1ZShpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SGFzIEludGVydmFsczwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+SGFzIEludGVydmFsczwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgSW50ZXJ2YWxzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRIYXNJbnRlcnZhbHMoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0R2F1Z2VfSGFzSW50ZXJ2YWxzKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0hhc0ludGVydmFscygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlI2lzSGFzSW50ZXJ2YWxzIDxlbT5IYXMgSW50ZXJ2YWxzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5IYXMgSW50ZXJ2YWxzPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0hhc0ludGVydmFscygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0SGFzSW50ZXJ2YWxzKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW50ZXJ2YWxzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEludGVydmFsfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkludGVydmFsczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkludGVydmFsczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0R2F1Z2VfSW50ZXJ2YWxzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PENoYXJ0SW50ZXJ2YWw+IGdldEludGVydmFscygpOworCit9IC8vIENoYXJ0R2F1Z2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0SGlnaGxpZ2h0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0SGlnaGxpZ2h0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTI3MTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRIaWdobGlnaHRlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBIaWdobGlnaHRlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIjZ2V0TG9jYXRpb24gPGVtPkxvY2F0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIjaXNUb29sdGlwQWx3YXlzIDxlbT5Ub29sdGlwIEFsd2F5czwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyI2lzSW5zaWRlQ2hhcnQgPGVtPkluc2lkZSBDaGFydDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRIaWdobGlnaHRlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydEhpZ2hsaWdodGVyIGV4dGVuZHMgQ2hhcnRFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Mb2NhdGlvbjwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9vbHRpcExvY2F0aW9uRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Mb2NhdGlvbjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW0KKwkgKiBAc2VlICNzZXRMb2NhdGlvbihUb29sdGlwTG9jYXRpb25FbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRIaWdobGlnaHRlcl9Mb2NhdGlvbigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCVRvb2x0aXBMb2NhdGlvbkVudW0gZ2V0TG9jYXRpb24oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlciNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkxvY2F0aW9uPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9vbHRpcExvY2F0aW9uRW51bQorCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRMb2NhdGlvbihUb29sdGlwTG9jYXRpb25FbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2x0aXAgQWx3YXlzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub29sdGlwIEFsd2F5czwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sdGlwIEFsd2F5czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VG9vbHRpcEFsd2F5cyhib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRIaWdobGlnaHRlcl9Ub29sdGlwQWx3YXlzKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc1Rvb2x0aXBBbHdheXMoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlciNpc1Rvb2x0aXBBbHdheXMgPGVtPlRvb2x0aXAgQWx3YXlzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sdGlwIEFsd2F5czwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNUb29sdGlwQWx3YXlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRUb29sdGlwQWx3YXlzKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+SW5zaWRlIENoYXJ0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5JbnNpZGUgQ2hhcnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+SW5zaWRlIENoYXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRJbnNpZGVDaGFydChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRIaWdobGlnaHRlcl9JbnNpZGVDaGFydCgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNJbnNpZGVDaGFydCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyI2lzSW5zaWRlQ2hhcnQgPGVtPkluc2lkZSBDaGFydDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+SW5zaWRlIENoYXJ0PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc0luc2lkZUNoYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRJbnNpZGVDaGFydChib29sZWFuIHZhbHVlKTsKKworfSAvLyBDaGFydEhpZ2hsaWdodGVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEludGVydmFsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydEludGVydmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYwMThmNwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0SW50ZXJ2YWwuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBJbnRlcnZhbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydEludGVydmFsKCkKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0SW50ZXJ2YWwgZXh0ZW5kcyBDaGFydExhenlSZXNvbHZlciB7Cit9IC8vIENoYXJ0SW50ZXJ2YWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0TGF6eVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydExhenlSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYzJmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydExhenlSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydExhenlSZXNvbHZlcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydExhenlSZXNvbHZlciBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiIHByb3h5RGF0YVR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuSW50ZXJuYWxFT2JqZWN0IiBwcm94eVVuaXF1ZT0iZmFsc2UiCisJICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwgYm9keT0nPCVvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UlPiBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTtcbjwlb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0JT4gX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpO1xucmV0dXJuIDwlb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzJT4ucmVzb2x2ZShwcm94eSwgX3Jlc291cmNlU2V0KTsnIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KTsKKworfSAvLyBDaGFydExhenlSZXNvbHZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRMZWdlbmQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0TGVnZW5kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzNTQ3NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0TGVnZW5kLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IExlZ2VuZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2dldFBsYWNlbWVudCA8ZW0+UGxhY2VtZW50PC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2lzVG9nZ2xlIDxlbT5Ub2dnbGU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQjaXNSZXBsb3QgPGVtPlJlcGxvdDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZCNnZXRUb2dnbGVUeXBlIDxlbT5Ub2dnbGUgVHlwZTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMZWdlbmQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhcnRMZWdlbmQgZXh0ZW5kcyBDaGFydEVsZW1lbnQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBsYWNlbWVudDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QbGFjZW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGxhY2VtZW50PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuTGVnZW5kUGxhY2VtZW50RW51bQorCSAqIEBzZWUgI3NldFBsYWNlbWVudChMZWdlbmRQbGFjZW1lbnRFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMZWdlbmRfUGxhY2VtZW50KCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJTGVnZW5kUGxhY2VtZW50RW51bSBnZXRQbGFjZW1lbnQoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQjZ2V0UGxhY2VtZW50IDxlbT5QbGFjZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBsYWNlbWVudDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW0KKwkgKiBAc2VlICNnZXRQbGFjZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBsYWNlbWVudChMZWdlbmRQbGFjZW1lbnRFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvZ2dsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VG9nZ2xlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlRvZ2dsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VG9nZ2xlKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydExlZ2VuZF9Ub2dnbGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzVG9nZ2xlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2lzVG9nZ2xlIDxlbT5Ub2dnbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlRvZ2dsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNUb2dnbGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRvZ2dsZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlcGxvdDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVwbG90PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxvdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0UmVwbG90KGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydExlZ2VuZF9SZXBsb3QoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzUmVwbG90KCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2lzUmVwbG90IDxlbT5SZXBsb3Q8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlJlcGxvdDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNSZXBsb3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFJlcGxvdChib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvZ2dsZSBUeXBlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ub2dnbGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ub2dnbGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtCisJICogQHNlZSAjc2V0VG9nZ2xlVHlwZShUb2dnbGVUeXBlRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TGVnZW5kX1RvZ2dsZVR5cGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlUb2dnbGVUeXBlRW51bSBnZXRUb2dnbGVUeXBlKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kI2dldFRvZ2dsZVR5cGUgPGVtPlRvZ2dsZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub2dnbGUgVHlwZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtCisJICogQHNlZSAjZ2V0VG9nZ2xlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VG9nZ2xlVHlwZShUb2dnbGVUeXBlRW51bSB2YWx1ZSk7CisKK30gLy8gQ2hhcnRMZWdlbmQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0TGluZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRMaW5lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0ODE5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0TGluZS5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBMaW5lPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzQW5pbWF0ZWQgPGVtPkFuaW1hdGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1Nob3dNYXJrZXIgPGVtPlNob3cgTWFya2VyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1RyZW5kTGluZSA8ZW0+VHJlbmQgTGluZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNab29tIDxlbT5ab29tPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0N1cnNvciA8ZW0+Q3Vyc29yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1Rvb2x0aXAgPGVtPlRvb2x0aXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzRmlsbFRvWmVybyA8ZW0+RmlsbCBUbyBaZXJvPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0ZpbGxBcmVhIDxlbT5GaWxsIEFyZWE8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TGluZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydExpbmUgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QW5pbWF0ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkFuaW1hdGVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkFuaW1hdGVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRBbmltYXRlZChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMaW5lX0FuaW1hdGVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0FuaW1hdGVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc0FuaW1hdGVkIDxlbT5BbmltYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QW5pbWF0ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzQW5pbWF0ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFuaW1hdGVkKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+U2hvdyBNYXJrZXI8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlNob3cgTWFya2VyPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlNob3cgTWFya2VyPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRTaG93TWFya2VyKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydExpbmVfU2hvd01hcmtlcigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNTaG93TWFya2VyKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1Nob3dNYXJrZXIgPGVtPlNob3cgTWFya2VyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5TaG93IE1hcmtlcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNTaG93TWFya2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRTaG93TWFya2VyKGJvb2xlYW4gdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHJlbmQgTGluZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VHJlbmQgTGluZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5UcmVuZCBMaW5lPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRUcmVuZExpbmUoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TGluZV9UcmVuZExpbmUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzVHJlbmRMaW5lKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSNpc1RyZW5kTGluZSA8ZW0+VHJlbmQgTGluZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VHJlbmQgTGluZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNUcmVuZExpbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRyZW5kTGluZShib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlpvb208L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlpvb208L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Wm9vbTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0Wm9vbShib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMaW5lX1pvb20oKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzWm9vbSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNab29tIDxlbT5ab29tPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5ab29tPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1pvb20oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFpvb20oYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5DdXJzb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkN1cnNvcjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DdXJzb3I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEN1cnNvcihib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMaW5lX0N1cnNvcigpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNDdXJzb3IoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzQ3Vyc29yIDxlbT5DdXJzb3I8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkN1cnNvcjwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNDdXJzb3IoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEN1cnNvcihib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlRvb2x0aXA8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlRvb2x0aXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VG9vbHRpcDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0VG9vbHRpcChib29sZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRMaW5lX1Rvb2x0aXAoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzVG9vbHRpcCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNUb29sdGlwIDxlbT5Ub29sdGlwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Ub29sdGlwPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNpc1Rvb2x0aXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFRvb2x0aXAoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5GaWxsIFRvIFplcm88L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkZpbGwgVG8gWmVybzwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxsIFRvIFplcm88L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEZpbGxUb1plcm8oYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TGluZV9GaWxsVG9aZXJvKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJYm9vbGVhbiBpc0ZpbGxUb1plcm8oKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lI2lzRmlsbFRvWmVybyA8ZW0+RmlsbCBUbyBaZXJvPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxsIFRvIFplcm88L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRmlsbFRvWmVybygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RmlsbFRvWmVybyhib29sZWFuIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkZpbGwgQXJlYTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RmlsbCBBcmVhPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkZpbGwgQXJlYTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjc2V0RmlsbEFyZWEoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TGluZV9GaWxsQXJlYSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNGaWxsQXJlYSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUjaXNGaWxsQXJlYSA8ZW0+RmlsbCBBcmVhPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5GaWxsIEFyZWE8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRmlsbEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEZpbGxBcmVhKGJvb2xlYW4gdmFsdWUpOworCit9IC8vIENoYXJ0TGluZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRNb2RlbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDU2ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydE1vZGVsLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsI2dldFBhY2thZ2VzIDxlbT5QYWNrYWdlczwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRNb2RlbCgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydE1vZGVsIGV4dGVuZHMgRU9iamVjdCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+UGFja2FnZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5QYWNrYWdlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlBhY2thZ2VzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnRNb2RlbF9QYWNrYWdlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxDaGFydFBhY2thZ2U+IGdldFBhY2thZ2VzKCk7CisKK30gLy8gQ2hhcnRNb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnROdW1iZXJJbnRlcnZhbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnROdW1iZXJJbnRlcnZhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZjZjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydE51bWJlckludGVydmFsLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgTnVtYmVyIEludGVydmFsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJJbnRlcnZhbFZhbHVlIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJSYW5nZSA8ZW0+TnVtYmVyIFJhbmdlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydE51bWJlckludGVydmFsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0TnVtYmVySW50ZXJ2YWwgZXh0ZW5kcyBDaGFydEludGVydmFsIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE51bWJlckludGVydmFsVmFsdWUoaW50KQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJJbnRlcnZhbFZhbHVlKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IGdldE51bWJlckludGVydmFsVmFsdWUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJJbnRlcnZhbFZhbHVlIDxlbT5OdW1iZXIgSW50ZXJ2YWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0TnVtYmVySW50ZXJ2YWxWYWx1ZShpbnQgdmFsdWUpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TnVtYmVyIFJhbmdlPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OdW1iZXIgUmFuZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TnVtYmVyIFJhbmdlPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXROdW1iZXJSYW5nZShDaGFydFJhbmdlRWxlbWVudCkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0TnVtYmVySW50ZXJ2YWxfTnVtYmVyUmFuZ2UoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQ2hhcnRSYW5nZUVsZW1lbnQgZ2V0TnVtYmVyUmFuZ2UoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbCNnZXROdW1iZXJSYW5nZSA8ZW0+TnVtYmVyIFJhbmdlPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5OdW1iZXIgUmFuZ2U8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldE51bWJlclJhbmdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXROdW1iZXJSYW5nZShDaGFydFJhbmdlRWxlbWVudCB2YWx1ZSk7CisKK30gLy8gQ2hhcnROdW1iZXJJbnRlcnZhbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRPcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0T3B0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5MWFmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0T3B0aW9uLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgT3B0aW9uPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0T3B0aW9uKCkKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0T3B0aW9uIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIgeworfSAvLyBDaGFydE9wdGlvbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRQYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydFBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQyZDJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRQYWNrYWdlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IFBhY2thZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2UjZ2V0Q2hhcnRzIDxlbT5DaGFydHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0UGFja2FnZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydFBhY2thZ2UgZXh0ZW5kcyBMUGFja2FnZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q2hhcnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5DaGFydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5DaGFydHM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFBhY2thZ2VfQ2hhcnRzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PENoYXJ0PiBnZXRDaGFydHMoKTsKKworfSAvLyBDaGFydFBhY2thZ2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0UGllLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydFBpZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjI0NDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydFBpZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IFBpZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllI2lzRW1wdHkgPGVtPkVtcHR5PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFBpZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydFBpZSBleHRlbmRzIENoYXJ0T3B0aW9uIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbXB0eTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW1wdHk8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW1wdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldEVtcHR5KGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFBpZV9FbXB0eSgpCisJICogQG1vZGVsIHVuaXF1ZT0iZmFsc2UiCisJICogQGdlbmVyYXRlZAorCSAqLworCWJvb2xlYW4gaXNFbXB0eSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBpZSNpc0VtcHR5IDxlbT5FbXB0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW1wdHk8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzRW1wdHkoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVtcHR5KGJvb2xlYW4gdmFsdWUpOworCit9IC8vIENoYXJ0UGllCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydFJhbmdlRWxlbWVudC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRSYW5nZUVsZW1lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGU2Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRSYW5nZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBSYW5nZSBFbGVtZW50PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0UmFuZ2VFbGVtZW50KCkKKyAqIEBtb2RlbCBpbnRlcmZhY2U9InRydWUiIGFic3RyYWN0PSJ0cnVlIgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIENoYXJ0UmFuZ2VFbGVtZW50IGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIgeworfSAvLyBDaGFydFJhbmdlRWxlbWVudApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRTZWdtZW50Q29sb3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0U2VnbWVudENvbG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YwYTdmMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0U2VnbWVudENvbG9yLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgU2VnbWVudCBDb2xvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yI2dldFJnYiA8ZW0+UmdiPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFNlZ21lbnRDb2xvcigpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydFNlZ21lbnRDb2xvciBleHRlbmRzIENoYXJ0UmFuZ2VFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5SZ2I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJnYjwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5SZ2I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldFJnYihTdHJpbmcpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFNlZ21lbnRDb2xvcl9SZ2IoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0UmdiKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yI2dldFJnYiA8ZW0+UmdiPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5SZ2I8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldFJnYigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UmdiKFN0cmluZyB2YWx1ZSk7CisKK30gLy8gQ2hhcnRTZWdtZW50Q29sb3IKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0VHJlZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnRUcmVlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0OWY3ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0VHJlZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IFRyZWU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUjaXNNYXAgPGVtPk1hcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUjaXNDb2xsYXBzaWJsZSA8ZW0+Q29sbGFwc2libGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0VHJlZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBDaGFydFRyZWUgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+TWFwPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5NYXA8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+TWFwPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlICNzZXRNYXAoYm9vbGVhbikKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldENoYXJ0VHJlZV9NYXAoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzTWFwKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZSNpc01hcCA8ZW0+TWFwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5NYXA8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2lzTWFwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRNYXAoYm9vbGVhbiB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db2xsYXBzaWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29sbGFwc2libGU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29sbGFwc2libGU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldENvbGxhcHNpYmxlKGJvb2xlYW4pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRDaGFydFRyZWVfQ29sbGFwc2libGUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlib29sZWFuIGlzQ29sbGFwc2libGUoKTsKKworCS8qKgorCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlI2lzQ29sbGFwc2libGUgPGVtPkNvbGxhcHNpYmxlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db2xsYXBzaWJsZTwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSAjaXNDb2xsYXBzaWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0Q29sbGFwc2libGUoYm9vbGVhbiB2YWx1ZSk7CisKK30gLy8gQ2hhcnRUcmVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9MZWdlbmRQbGFjZW1lbnRFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9MZWdlbmRQbGFjZW1lbnRFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2N2UzYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0xlZ2VuZFBsYWNlbWVudEVudW0uamF2YQpAQCAtMCwwICsxLDI3MCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5MZWdlbmQgUGxhY2VtZW50IEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZ2V0TGVnZW5kUGxhY2VtZW50RW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gTGVnZW5kUGxhY2VtZW50RW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0lERTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTlNJREVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlJTlNJREUoMCwgIklOU0lERSIsICJpbnNpZGUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0lERSBHUklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0lERV9HUklEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJSU5TSURFX0dSSUQoMCwgIklOU0lERV9HUklEIiwgImluc2lkZS1ncmlkIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVRTSURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVFNJREVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlPVVRTSURFKDAsICJPVVRTSURFIiwgIm91dHNpZGUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVFNJREUgR1JJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNPVVRTSURFX0dSSURfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlPVVRTSURFX0dSSUQoMCwgIk9VVFNJREVfR1JJRCIsICJvdXRzaWRlLWdyaWQiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0lERTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SU5TSURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOU0lERQorCSAqIEBtb2RlbCBsaXRlcmFsPSJpbnNpZGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5TSURFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPklOU0lERSBHUklEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTlNJREUgR1JJRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTlNJREVfR1JJRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJpbnNpZGUtZ3JpZCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlNJREVfR1JJRF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5PVVRTSURFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PVVRTSURFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVFNJREUKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ib3V0c2lkZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPVVRTSURFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk9VVFNJREUgR1JJRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T1VUU0lERSBHUklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI09VVFNJREVfR1JJRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJvdXRzaWRlLWdyaWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1VUU0lERV9HUklEX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5MZWdlbmQgUGxhY2VtZW50IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIExlZ2VuZFBsYWNlbWVudEVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgTGVnZW5kUGxhY2VtZW50RW51bVtdIHsKKwkJCUlOU0lERSwKKwkJCUlOU0lERV9HUklELAorCQkJT1VUU0lERSwKKwkJCU9VVFNJREVfR1JJRCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5MZWdlbmQgUGxhY2VtZW50IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxMZWdlbmRQbGFjZW1lbnRFbnVtPiBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkxlZ2VuZCBQbGFjZW1lbnQgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExlZ2VuZFBsYWNlbWVudEVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlMZWdlbmRQbGFjZW1lbnRFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+TGVnZW5kIFBsYWNlbWVudCBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgTGVnZW5kUGxhY2VtZW50RW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCUxlZ2VuZFBsYWNlbWVudEVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkxlZ2VuZCBQbGFjZW1lbnQgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIExlZ2VuZFBsYWNlbWVudEVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIElOU0lERV9WQUxVRTogcmV0dXJuIElOU0lERTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgTGVnZW5kUGxhY2VtZW50RW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9MZWdlbmRQbGFjZW1lbnRFbnVtCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9SZW5kZXJUeXBlRW51bS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvUmVuZGVyVHlwZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNhYjNkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvUmVuZGVyVHlwZUVudW0uamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5SZW5kZXIgVHlwZSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlI2dldFJlbmRlclR5cGVFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBSZW5kZXJUeXBlRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNBVEVHT1JZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0NBVEVHT1JZX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJQ0FURUdPUlkoMCwgIkNBVEVHT1JZIiwgImNhdGVnb3J5IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5MSU5FQVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTElORUFSX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTElORUFSKDAsICJMSU5FQVIiLCAibGluZWFyIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0RBVEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlEQVRFKDAsICJEQVRFIiwgImRhdGUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkxPRzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMT0dfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlMT0coMCwgIkxPRyIsICJsb2dhcml0aG1pYyIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+UFlSQU1JRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNQWVJBTUlEX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUFlSQU1JRCgwLCAiUFlSQU1JRCIsICJweXJhbWlkIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DQVRFR09SWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Q0FURUdPUlk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjQ0FURUdPUlkKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iY2F0ZWdvcnkiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FURUdPUllfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+TElORUFSPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5MSU5FQVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTElORUFSCisJICogQG1vZGVsIGxpdGVyYWw9ImxpbmVhciIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5FQVJfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNEQVRFCisJICogQG1vZGVsIGxpdGVyYWw9ImRhdGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREFURV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5MT0c8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkxPRzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNMT0cKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibG9nYXJpdGhtaWMiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTE9HX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlBZUkFNSUQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlBZUkFNSUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUFlSQU1JRAorCSAqIEBtb2RlbCBsaXRlcmFsPSJweXJhbWlkIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBZUkFNSURfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJlbmRlciBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlbmRlclR5cGVFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFJlbmRlclR5cGVFbnVtW10geworCQkJQ0FURUdPUlksCisJCQlMSU5FQVIsCisJCQlEQVRFLAorCQkJTE9HLAorCQkJUFlSQU1JRCwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5SZW5kZXIgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8UmVuZGVyVHlwZUVudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVuZGVyIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlbmRlclR5cGVFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJUmVuZGVyVHlwZUVudW0gcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOworCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhsaXRlcmFsKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5SZW5kZXIgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUmVuZGVyVHlwZUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSZW5kZXJUeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+UmVuZGVyIFR5cGUgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJlbmRlclR5cGVFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBDQVRFR09SWV9WQUxVRTogcmV0dXJuIENBVEVHT1JZOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBSZW5kZXJUeXBlRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9SZW5kZXJUeXBlRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvVG9nZ2xlVHlwZUVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L1RvZ2dsZVR5cGVFbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQyNmJkYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L1RvZ2dsZVR5cGVFbnVtLmphdmEKQEAgLTAsMCArMSwyNDQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+VG9nZ2xlIFR5cGUgRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRUb2dnbGVUeXBlRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gVG9nZ2xlVHlwZUVudW0gaW1wbGVtZW50cyBFbnVtZXJhdG9yIHsKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT1JNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9STUFMX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9STUFMKDAsICJOT1JNQUwiLCAibm9ybWFsIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TTE9XPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NMT1dfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTTE9XKDAsICJTTE9XIiwgInNsb3ciKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkZBU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRkFTVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUZBU1QoMCwgIkZBU1QiLCAiZmFzdCIpOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9STUFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1JNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9STUFMCisJICogQG1vZGVsIGxpdGVyYWw9Im5vcm1hbCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JNQUxfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U0xPVzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U0xPVzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTTE9XCisJICogQG1vZGVsIGxpdGVyYWw9InNsb3ciCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0xPV19WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5GQVNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GQVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0ZBU1QKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZmFzdCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGQVNUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Ub2dnbGUgVHlwZSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBUb2dnbGVUeXBlRW51bVtdIFZBTFVFU19BUlJBWSA9CisJCW5ldyBUb2dnbGVUeXBlRW51bVtdIHsKKwkJCU5PUk1BTCwKKwkJCVNMT1csCisJCQlGQVNULAorCQl9OworCisJLyoqCisJICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPlRvZ2dsZSBUeXBlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxUb2dnbGVUeXBlRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Ub2dnbGUgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVG9nZ2xlVHlwZUVudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUb2dnbGVUeXBlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRvZ2dsZSBUeXBlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUb2dnbGVUeXBlRW51bSBnZXRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVRvZ2dsZVR5cGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Ub2dnbGUgVHlwZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgVG9nZ2xlVHlwZUVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIE5PUk1BTF9WQUxVRTogcmV0dXJuIE5PUk1BTDsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgVG9nZ2xlVHlwZUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vVG9nZ2xlVHlwZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L1Rvb2x0aXBMb2NhdGlvbkVudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L1Rvb2x0aXBMb2NhdGlvbkVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODcyOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvVG9vbHRpcExvY2F0aW9uRW51bS5qYXZhCkBAIC0wLDAgKzEsMzc0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlRvb2x0aXAgTG9jYXRpb24gRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSNnZXRUb29sdGlwTG9jYXRpb25FbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBUb29sdGlwTG9jYXRpb25FbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9SVEg8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9SVEhfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlOT1JUSCgwLCAiTk9SVEgiLCAibm9ydGgiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5PUlRIIEVBU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9SVEhfRUFTVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCU5PUlRIX0VBU1QoMCwgIk5PUlRIX0VBU1QiLCAibm9ydGgtZWFzdCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RUFTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFQVNUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRUFTVCgwLCAiRUFTVCIsICJlYXN0IiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT1VUSCBFQVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPVVRIX0VBU1RfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTT1VUSF9FQVNUKDAsICJTT1VUSF9FQVNUIiwgInNvdXRoLWVhc3QiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPVVRIPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPVVRIX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJU09VVEgoMCwgIlNPVVRIIiwgInNvdXRoIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5TT1VUSCBXRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPVVRIX1dFU1RfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTT1VUSF9XRVNUKDAsICJTT1VUSF9XRVNUIiwgInNvdXRoLXdlc3QiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPldFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjV0VTVF9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCVdFU1QoMCwgIldFU1QiLCAid2VzdCIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9SVEggV0VTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT1JUSF9XRVNUX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9SVEhfV0VTVCgwLCAiTk9SVEhfV0VTVCIsICJub3J0aC13ZXN0Iik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT1JUSDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9SVEg8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjTk9SVEgKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibm9ydGgiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9SVEhfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tk9SVEggRUFTVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+Tk9SVEggRUFTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNOT1JUSF9FQVNUCisJICogQG1vZGVsIGxpdGVyYWw9Im5vcnRoLWVhc3QiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9SVEhfRUFTVF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FQVNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FQVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VBU1QKKwkgKiBAbW9kZWwgbGl0ZXJhbD0iZWFzdCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFQVNUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPVVRIIEVBU1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPVVRIIEVBU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU09VVEhfRUFTVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJzb3V0aC1lYXN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVRIX0VBU1RfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+U09VVEg8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPVVRIPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NPVVRICisJICogQG1vZGVsIGxpdGVyYWw9InNvdXRoIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVRIX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlNPVVRIIFdFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNPVVRIIFdFU1Q8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjU09VVEhfV0VTVAorCSAqIEBtb2RlbCBsaXRlcmFsPSJzb3V0aC13ZXN0IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNPVVRIX1dFU1RfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+V0VTVDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+V0VTVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNXRVNUCisJICogQG1vZGVsIGxpdGVyYWw9Indlc3QiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0VTVF9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5OT1JUSCBXRVNUPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT1JUSCBXRVNUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PUlRIX1dFU1QKKwkgKiBAbW9kZWwgbGl0ZXJhbD0ibm9ydGgtd2VzdCIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1JUSF9XRVNUX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Ub29sdGlwIExvY2F0aW9uIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFRvb2x0aXBMb2NhdGlvbkVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgVG9vbHRpcExvY2F0aW9uRW51bVtdIHsKKwkJCU5PUlRILAorCQkJTk9SVEhfRUFTVCwKKwkJCUVBU1QsCisJCQlTT1VUSF9FQVNULAorCQkJU09VVEgsCisJCQlTT1VUSF9XRVNULAorCQkJV0VTVCwKKwkJCU5PUlRIX1dFU1QsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+VG9vbHRpcCBMb2NhdGlvbiBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8VG9vbHRpcExvY2F0aW9uRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Ub29sdGlwIExvY2F0aW9uIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUb29sdGlwTG9jYXRpb25FbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJVG9vbHRpcExvY2F0aW9uRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlRvb2x0aXAgTG9jYXRpb24gRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFRvb2x0aXBMb2NhdGlvbkVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlUb29sdGlwTG9jYXRpb25FbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Ub29sdGlwIExvY2F0aW9uIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBUb29sdGlwTG9jYXRpb25FbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBOT1JUSF9WQUxVRTogcmV0dXJuIE5PUlRIOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBUb29sdGlwTG9jYXRpb25FbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1Rvb2x0aXBMb2NhdGlvbkVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRBeGlzSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEF4aXNJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4NjNkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRBeGlzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzQ1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlJlbmRlclR5cGVFbnVtOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEF4aXM7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBBeGlzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRBeGlzSW1wbCNnZXRBeGlzIDxlbT5BeGlzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRBeGlzSW1wbCNnZXRSZW5kZXJUeXBlIDxlbT5SZW5kZXIgVHlwZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QXhpc0ltcGwjaXNTaG9ydExhYmVsIDxlbT5TaG9ydCBMYWJlbDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QXhpc0ltcGwjZ2V0QW5nbGUgPGVtPkFuZ2xlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRBeGlzSW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0QXhpcyB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXhpcygpIDxlbT5BeGlzPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBeGlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRGF0YW1hcnRBeGlzIGF4aXM7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVuZGVyVHlwZSgpIDxlbT5SZW5kZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVuZGVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSZW5kZXJUeXBlRW51bSBSRU5ERVJfVFlQRV9FREVGQVVMVCA9IFJlbmRlclR5cGVFbnVtLkNBVEVHT1JZOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmVuZGVyVHlwZSgpIDxlbT5SZW5kZXIgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmVuZGVyVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFJlbmRlclR5cGVFbnVtIHJlbmRlclR5cGUgPSBSRU5ERVJfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Nob3J0TGFiZWwoKSA8ZW0+U2hvcnQgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2hvcnRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFNIT1JUX0xBQkVMX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Nob3J0TGFiZWwoKSA8ZW0+U2hvcnQgTGFiZWw8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2hvcnRMYWJlbCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc2hvcnRMYWJlbCA9IFNIT1JUX0xBQkVMX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEFuZ2xlKCkgPGVtPkFuZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBbmdsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQU5HTEVfRURFRkFVTFQgPSAwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QW5nbGUoKSA8ZW0+QW5nbGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEFuZ2xlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IGFuZ2xlID0gQU5HTEVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRBeGlzSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9BWElTOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydEF4aXMgZ2V0QXhpcygpIHsKKwkJaWYgKGF4aXMgIT0gbnVsbCAmJiBheGlzLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRBeGlzID0gKEludGVybmFsRU9iamVjdClheGlzOworCQkJYXhpcyA9IChEYXRhbWFydEF4aXMpZVJlc29sdmVQcm94eShvbGRBeGlzKTsKKwkJCWlmIChheGlzICE9IG9sZEF4aXMpIHsKKwkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQVhJU19fQVhJUywgb2xkQXhpcywgYXhpcykpOworCQkJfQorCQl9CisJCXJldHVybiBheGlzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBEYXRhbWFydEF4aXMgYmFzaWNHZXRBeGlzKCkgeworCQlyZXR1cm4gYXhpczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBeGlzKERhdGFtYXJ0QXhpcyBuZXdBeGlzKSB7CisJCURhdGFtYXJ0QXhpcyBvbGRBeGlzID0gYXhpczsKKwkJYXhpcyA9IG5ld0F4aXM7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19BWElTLCBvbGRBeGlzLCBheGlzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJlbmRlclR5cGVFbnVtIGdldFJlbmRlclR5cGUoKSB7CisJCXJldHVybiByZW5kZXJUeXBlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFJlbmRlclR5cGUoUmVuZGVyVHlwZUVudW0gbmV3UmVuZGVyVHlwZSkgeworCQlSZW5kZXJUeXBlRW51bSBvbGRSZW5kZXJUeXBlID0gcmVuZGVyVHlwZTsKKwkJcmVuZGVyVHlwZSA9IG5ld1JlbmRlclR5cGUgPT0gbnVsbCA/IFJFTkRFUl9UWVBFX0VERUZBVUxUIDogbmV3UmVuZGVyVHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1JFTkRFUl9UWVBFLCBvbGRSZW5kZXJUeXBlLCByZW5kZXJUeXBlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaG9ydExhYmVsKCkgeworCQlyZXR1cm4gc2hvcnRMYWJlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaG9ydExhYmVsKGJvb2xlYW4gbmV3U2hvcnRMYWJlbCkgeworCQlib29sZWFuIG9sZFNob3J0TGFiZWwgPSBzaG9ydExhYmVsOworCQlzaG9ydExhYmVsID0gbmV3U2hvcnRMYWJlbDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1NIT1JUX0xBQkVMLCBvbGRTaG9ydExhYmVsLCBzaG9ydExhYmVsKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRBbmdsZSgpIHsKKwkJcmV0dXJuIGFuZ2xlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEFuZ2xlKGludCBuZXdBbmdsZSkgeworCQlpbnQgb2xkQW5nbGUgPSBhbmdsZTsKKwkJYW5nbGUgPSBuZXdBbmdsZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX0FOR0xFLCBvbGRBbmdsZSwgYW5nbGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19BWElTOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QXhpcygpOworCQkJCXJldHVybiBiYXNpY0dldEF4aXMoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1JFTkRFUl9UWVBFOgorCQkJCXJldHVybiBnZXRSZW5kZXJUeXBlKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19TSE9SVF9MQUJFTDoKKwkJCQlyZXR1cm4gaXNTaG9ydExhYmVsKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19BTkdMRToKKwkJCQlyZXR1cm4gZ2V0QW5nbGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQVhJU19fQVhJUzoKKwkJCQlzZXRBeGlzKChEYXRhbWFydEF4aXMpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1JFTkRFUl9UWVBFOgorCQkJCXNldFJlbmRlclR5cGUoKFJlbmRlclR5cGVFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19TSE9SVF9MQUJFTDoKKwkJCQlzZXRTaG9ydExhYmVsKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19BTkdMRToKKwkJCQlzZXRBbmdsZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX0FYSVM6CisJCQkJc2V0QXhpcygoRGF0YW1hcnRBeGlzKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1JFTkRFUl9UWVBFOgorCQkJCXNldFJlbmRlclR5cGUoUkVOREVSX1RZUEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1NIT1JUX0xBQkVMOgorCQkJCXNldFNob3J0TGFiZWwoU0hPUlRfTEFCRUxfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX0FOR0xFOgorCQkJCXNldEFuZ2xlKEFOR0xFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX0FYSVM6CisJCQkJcmV0dXJuIGF4aXMgIT0gbnVsbDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVNfX1JFTkRFUl9UWVBFOgorCQkJCXJldHVybiByZW5kZXJUeXBlICE9IFJFTkRFUl9UWVBFX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQVhJU19fU0hPUlRfTEFCRUw6CisJCQkJcmV0dXJuIHNob3J0TGFiZWwgIT0gU0hPUlRfTEFCRUxfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTX19BTkdMRToKKwkJCQlyZXR1cm4gYW5nbGUgIT0gQU5HTEVfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChyZW5kZXJUeXBlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChyZW5kZXJUeXBlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBzaG9ydExhYmVsOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzaG9ydExhYmVsKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBhbmdsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoYW5nbGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DaGFydEF4aXNJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0QmFySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJhckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk2OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJhckltcGwuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBCYXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJhckltcGwjaXNTaGFkb3cgPGVtPlNoYWRvdzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFySW1wbCNpc0FuaW1hdGVkIDxlbT5BbmltYXRlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QmFySW1wbCNpc1N3YXBwZWQgPGVtPlN3YXBwZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJhckltcGwjaXNTdGFja2VkIDxlbT5TdGFja2VkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRCYXJJbXBsIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ2hhcnRCYXIgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NoYWRvdygpIDxlbT5TaGFkb3c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2hhZG93KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hBRE9XX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1NoYWRvdygpIDxlbT5TaGFkb3c8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU2hhZG93KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaGFkb3cgPSBTSEFET1dfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbmltYXRlZCgpIDxlbT5BbmltYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNBbmltYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFOSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FuaW1hdGVkKCkgPGVtPkFuaW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0FuaW1hdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhbmltYXRlZCA9IEFOSU1BVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU3dhcHBlZCgpIDxlbT5Td2FwcGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1N3YXBwZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBTV0FQUEVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N3YXBwZWQoKSA8ZW0+U3dhcHBlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTd2FwcGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzd2FwcGVkID0gU1dBUFBFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1N0YWNrZWQoKSA8ZW0+U3RhY2tlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTdGFja2VkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU1RBQ0tFRF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNTdGFja2VkKCkgPGVtPlN0YWNrZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzU3RhY2tlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gc3RhY2tlZCA9IFNUQUNLRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRCYXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0JBUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1NoYWRvdygpIHsKKwkJcmV0dXJuIHNoYWRvdzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaGFkb3coYm9vbGVhbiBuZXdTaGFkb3cpIHsKKwkJYm9vbGVhbiBvbGRTaGFkb3cgPSBzaGFkb3c7CisJCXNoYWRvdyA9IG5ld1NoYWRvdzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBUl9fU0hBRE9XLCBvbGRTaGFkb3csIHNoYWRvdykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzQW5pbWF0ZWQoKSB7CisJCXJldHVybiBhbmltYXRlZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBbmltYXRlZChib29sZWFuIG5ld0FuaW1hdGVkKSB7CisJCWJvb2xlYW4gb2xkQW5pbWF0ZWQgPSBhbmltYXRlZDsKKwkJYW5pbWF0ZWQgPSBuZXdBbmltYXRlZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBUl9fQU5JTUFURUQsIG9sZEFuaW1hdGVkLCBhbmltYXRlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzU3dhcHBlZCgpIHsKKwkJcmV0dXJuIHN3YXBwZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0U3dhcHBlZChib29sZWFuIG5ld1N3YXBwZWQpIHsKKwkJYm9vbGVhbiBvbGRTd2FwcGVkID0gc3dhcHBlZDsKKwkJc3dhcHBlZCA9IG5ld1N3YXBwZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NXQVBQRUQsIG9sZFN3YXBwZWQsIHN3YXBwZWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1N0YWNrZWQoKSB7CisJCXJldHVybiBzdGFja2VkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFN0YWNrZWQoYm9vbGVhbiBuZXdTdGFja2VkKSB7CisJCWJvb2xlYW4gb2xkU3RhY2tlZCA9IHN0YWNrZWQ7CisJCXN0YWNrZWQgPSBuZXdTdGFja2VkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19TVEFDS0VELCBvbGRTdGFja2VkLCBzdGFja2VkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19TSEFET1c6CisJCQkJcmV0dXJuIGlzU2hhZG93KCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX0FOSU1BVEVEOgorCQkJCXJldHVybiBpc0FuaW1hdGVkKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NXQVBQRUQ6CisJCQkJcmV0dXJuIGlzU3dhcHBlZCgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19TVEFDS0VEOgorCQkJCXJldHVybiBpc1N0YWNrZWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19TSEFET1c6CisJCQkJc2V0U2hhZG93KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX0FOSU1BVEVEOgorCQkJCXNldEFuaW1hdGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NXQVBQRUQ6CisJCQkJc2V0U3dhcHBlZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19TVEFDS0VEOgorCQkJCXNldFN0YWNrZWQoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NIQURPVzoKKwkJCQlzZXRTaGFkb3coU0hBRE9XX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX0FOSU1BVEVEOgorCQkJCXNldEFuaW1hdGVkKEFOSU1BVEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NXQVBQRUQ6CisJCQkJc2V0U3dhcHBlZChTV0FQUEVEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NUQUNLRUQ6CisJCQkJc2V0U3RhY2tlZChTVEFDS0VEX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBUl9fU0hBRE9XOgorCQkJCXJldHVybiBzaGFkb3cgIT0gU0hBRE9XX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSX19BTklNQVRFRDoKKwkJCQlyZXR1cm4gYW5pbWF0ZWQgIT0gQU5JTUFURURfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVJfX1NXQVBQRUQ6CisJCQkJcmV0dXJuIHN3YXBwZWQgIT0gU1dBUFBFRF9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBUl9fU1RBQ0tFRDoKKwkJCQlyZXR1cm4gc3RhY2tlZCAhPSBTVEFDS0VEX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoc2hhZG93OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChzaGFkb3cpOworCQlyZXN1bHQuYXBwZW5kKCIsIGFuaW1hdGVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChhbmltYXRlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc3dhcHBlZDogIik7CisJCXJlc3VsdC5hcHBlbmQoc3dhcHBlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgc3RhY2tlZDogIik7CisJCXJlc3VsdC5hcHBlbmQoc3RhY2tlZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NoYXJ0QmFySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJhc2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0QmFzZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTljMGFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJhc2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IEJhc2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJhc2VJbXBsI2dldE5hbWUgPGVtPk5hbWU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydEJhc2VJbXBsIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ2hhcnRCYXNlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TmFtZSgpIDxlbT5OYW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROYW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBuYW1lID0gTkFNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydEJhc2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0JBU0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuZXdOYW1lKSB7CisJCVN0cmluZyBvbGROYW1lID0gbmFtZTsKKwkJbmFtZSA9IG5ld05hbWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVNFX19OQU1FLCBvbGROYW1lLCBuYW1lKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFTRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CQVNFX19OQU1FOgorCQkJCXNldE5hbWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBU0VfX05BTUU6CisJCQkJc2V0TmFtZShOQU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBU0VfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DaGFydEJhc2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0QnViYmxlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJ1YmJsZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2RjMDdjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEJ1YmJsZUltcGwuamF2YQpAQCAtMCwwICsxLDMzNSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBCdWJibGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEJ1YmJsZUltcGwjaXNNdWx0aXBsaWVyIDxlbT5NdWx0aXBsaWVyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRCdWJibGVJbXBsI2dldE11bHRpcGxpZXJWYWx1ZSA8ZW0+TXVsdGlwbGllciBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QnViYmxlSW1wbCNpc0dyYWRpZW50IDxlbT5HcmFkaWVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0QnViYmxlSW1wbCNpc1RyYW5zcGFyZW50IDxlbT5UcmFuc3BhcmVudDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0QnViYmxlSW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0QnViYmxlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNdWx0aXBsaWVyKCkgPGVtPk11bHRpcGxpZXI8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzTXVsdGlwbGllcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1VTFRJUExJRVJfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTXVsdGlwbGllcigpIDxlbT5NdWx0aXBsaWVyPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc011bHRpcGxpZXIoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIG11bHRpcGxpZXIgPSBNVUxUSVBMSUVSX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE11bHRpcGxpZXJWYWx1ZSgpIDxlbT5NdWx0aXBsaWVyIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNdWx0aXBsaWVyVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1VTFRJUExJRVJfVkFMVUVfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TXVsdGlwbGllclZhbHVlKCkgPGVtPk11bHRpcGxpZXIgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE11bHRpcGxpZXJWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFN0cmluZyBtdWx0aXBsaWVyVmFsdWUgPSBNVUxUSVBMSUVSX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzR3JhZGllbnQoKSA8ZW0+R3JhZGllbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzR3JhZGllbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBHUkFESUVOVF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNHcmFkaWVudCgpIDxlbT5HcmFkaWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNHcmFkaWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZ3JhZGllbnQgPSBHUkFESUVOVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyYW5zcGFyZW50KCkgPGVtPlRyYW5zcGFyZW50PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RyYW5zcGFyZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVFJBTlNQQVJFTlRfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVHJhbnNwYXJlbnQoKSA8ZW0+VHJhbnNwYXJlbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzVHJhbnNwYXJlbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHRyYW5zcGFyZW50ID0gVFJBTlNQQVJFTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRCdWJibGVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0JVQkJMRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc011bHRpcGxpZXIoKSB7CisJCXJldHVybiBtdWx0aXBsaWVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE11bHRpcGxpZXIoYm9vbGVhbiBuZXdNdWx0aXBsaWVyKSB7CisJCWJvb2xlYW4gb2xkTXVsdGlwbGllciA9IG11bHRpcGxpZXI7CisJCW11bHRpcGxpZXIgPSBuZXdNdWx0aXBsaWVyOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSLCBvbGRNdWx0aXBsaWVyLCBtdWx0aXBsaWVyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRNdWx0aXBsaWVyVmFsdWUoKSB7CisJCXJldHVybiBtdWx0aXBsaWVyVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TXVsdGlwbGllclZhbHVlKFN0cmluZyBuZXdNdWx0aXBsaWVyVmFsdWUpIHsKKwkJU3RyaW5nIG9sZE11bHRpcGxpZXJWYWx1ZSA9IG11bHRpcGxpZXJWYWx1ZTsKKwkJbXVsdGlwbGllclZhbHVlID0gbmV3TXVsdGlwbGllclZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFLCBvbGRNdWx0aXBsaWVyVmFsdWUsIG11bHRpcGxpZXJWYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzR3JhZGllbnQoKSB7CisJCXJldHVybiBncmFkaWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRHcmFkaWVudChib29sZWFuIG5ld0dyYWRpZW50KSB7CisJCWJvb2xlYW4gb2xkR3JhZGllbnQgPSBncmFkaWVudDsKKwkJZ3JhZGllbnQgPSBuZXdHcmFkaWVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JVQkJMRV9fR1JBRElFTlQsIG9sZEdyYWRpZW50LCBncmFkaWVudCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzVHJhbnNwYXJlbnQoKSB7CisJCXJldHVybiB0cmFuc3BhcmVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUcmFuc3BhcmVudChib29sZWFuIG5ld1RyYW5zcGFyZW50KSB7CisJCWJvb2xlYW4gb2xkVHJhbnNwYXJlbnQgPSB0cmFuc3BhcmVudDsKKwkJdHJhbnNwYXJlbnQgPSBuZXdUcmFuc3BhcmVudDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JVQkJMRV9fVFJBTlNQQVJFTlQsIG9sZFRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JVQkJMRV9fTVVMVElQTElFUjoKKwkJCQlyZXR1cm4gaXNNdWx0aXBsaWVyKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX01VTFRJUExJRVJfVkFMVUU6CisJCQkJcmV0dXJuIGdldE11bHRpcGxpZXJWYWx1ZSgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19HUkFESUVOVDoKKwkJCQlyZXR1cm4gaXNHcmFkaWVudCgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19UUkFOU1BBUkVOVDoKKwkJCQlyZXR1cm4gaXNUcmFuc3BhcmVudCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX01VTFRJUExJRVI6CisJCQkJc2V0TXVsdGlwbGllcigoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFOgorCQkJCXNldE11bHRpcGxpZXJWYWx1ZSgoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX0dSQURJRU5UOgorCQkJCXNldEdyYWRpZW50KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX1RSQU5TUEFSRU5UOgorCQkJCXNldFRyYW5zcGFyZW50KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSOgorCQkJCXNldE11bHRpcGxpZXIoTVVMVElQTElFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFOgorCQkJCXNldE11bHRpcGxpZXJWYWx1ZShNVUxUSVBMSUVSX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX0dSQURJRU5UOgorCQkJCXNldEdyYWRpZW50KEdSQURJRU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX1RSQU5TUEFSRU5UOgorCQkJCXNldFRyYW5zcGFyZW50KFRSQU5TUEFSRU5UX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JVQkJMRV9fTVVMVElQTElFUjoKKwkJCQlyZXR1cm4gbXVsdGlwbGllciAhPSBNVUxUSVBMSUVSX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFOgorCQkJCXJldHVybiBNVUxUSVBMSUVSX1ZBTFVFX0VERUZBVUxUID09IG51bGwgPyBtdWx0aXBsaWVyVmFsdWUgIT0gbnVsbCA6ICFNVUxUSVBMSUVSX1ZBTFVFX0VERUZBVUxULmVxdWFscyhtdWx0aXBsaWVyVmFsdWUpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQlVCQkxFX19HUkFESUVOVDoKKwkJCQlyZXR1cm4gZ3JhZGllbnQgIT0gR1JBRElFTlRfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEVfX1RSQU5TUEFSRU5UOgorCQkJCXJldHVybiB0cmFuc3BhcmVudCAhPSBUUkFOU1BBUkVOVF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG11bHRpcGxpZXI6ICIpOworCQlyZXN1bHQuYXBwZW5kKG11bHRpcGxpZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIG11bHRpcGxpZXJWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobXVsdGlwbGllclZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBncmFkaWVudDogIik7CisJCXJlc3VsdC5hcHBlbmQoZ3JhZGllbnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRyYW5zcGFyZW50OiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh0cmFuc3BhcmVudCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NoYXJ0QnViYmxlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydERTTEZhY3RvcnlJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0RFNMRmFjdG9yeUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U2N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydERTTEZhY3RvcnlJbXBsLmphdmEKQEAgLTAsMCArMSw0MzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+RmFjdG9yeTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0RFNMRmFjdG9yeUltcGwgZXh0ZW5kcyBFRmFjdG9yeUltcGwgaW1wbGVtZW50cyBDaGFydERTTEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIENoYXJ0RFNMRmFjdG9yeSBpbml0KCkgeworCQl0cnkgeworCQkJQ2hhcnREU0xGYWN0b3J5IHRoZUNoYXJ0RFNMRmFjdG9yeSA9IChDaGFydERTTEZhY3RvcnkpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RUZhY3RvcnkoQ2hhcnREU0xQYWNrYWdlLmVOU19VUkkpOworCQkJaWYgKHRoZUNoYXJ0RFNMRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUNoYXJ0RFNMRmFjdG9yeTsKKwkJCX0KKwkJfQorCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworCQkJRWNvcmVQbHVnaW4uSU5TVEFOQ0UubG9nKGV4Y2VwdGlvbik7CisJCX0KKwkJcmV0dXJuIG5ldyBDaGFydERTTEZhY3RvcnlJbXBsKCk7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnREU0xGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTU9ERUw6IHJldHVybiBjcmVhdGVDaGFydE1vZGVsKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MQVpZX1JFU09MVkVSOiByZXR1cm4gY3JlYXRlQ2hhcnRMYXp5UmVzb2x2ZXIoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBU0U6IHJldHVybiBjcmVhdGVDaGFydEJhc2UoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1BBQ0tBR0U6IHJldHVybiBjcmVhdGVDaGFydFBhY2thZ2UoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUOiByZXR1cm4gY3JlYXRlQ2hhcnQoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBUjogcmV0dXJuIGNyZWF0ZUNoYXJ0QmFyKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FOiByZXR1cm4gY3JlYXRlQ2hhcnRMaW5lKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QSUU6IHJldHVybiBjcmVhdGVDaGFydFBpZSgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfRE9OVVQ6IHJldHVybiBjcmVhdGVDaGFydERvbnV0KCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEU6IHJldHVybiBjcmVhdGVDaGFydEJ1YmJsZSgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0U6IHJldHVybiBjcmVhdGVDaGFydEdhdWdlKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9UUkVFOiByZXR1cm4gY3JlYXRlQ2hhcnRUcmVlKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUw6IHJldHVybiBjcmVhdGVDaGFydE51bWJlckludGVydmFsKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVDogcmV0dXJuIGNyZWF0ZUNoYXJ0RGF0YW1hcnQoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORDogcmV0dXJuIGNyZWF0ZUNoYXJ0TGVnZW5kKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ISUdITElHSFRFUjogcmV0dXJuIGNyZWF0ZUNoYXJ0SGlnaGxpZ2h0ZXIoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0FYSVM6IHJldHVybiBjcmVhdGVDaGFydEF4aXMoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1NFR01FTlRfQ09MT1I6IHJldHVybiBjcmVhdGVDaGFydFNlZ21lbnRDb2xvcigpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkxFR0VORF9QTEFDRU1FTlRfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlTGVnZW5kUGxhY2VtZW50RW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuVE9HR0xFX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlVG9nZ2xlVHlwZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLlRPT0xUSVBfTE9DQVRJT05fRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlVG9vbHRpcExvY2F0aW9uRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuUkVOREVSX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlUmVuZGVyVHlwZUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUludGVybmFsRU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkxFR0VORF9QTEFDRU1FTlRfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydExlZ2VuZFBsYWNlbWVudEVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuVE9HR0xFX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydFRvZ2dsZVR5cGVFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLlRPT0xUSVBfTE9DQVRJT05fRU5VTToKKwkJCQlyZXR1cm4gY29udmVydFRvb2x0aXBMb2NhdGlvbkVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuUkVOREVSX1RZUEVfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydFJlbmRlclR5cGVFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRJbnRlcm5hbEVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0TW9kZWwgY3JlYXRlQ2hhcnRNb2RlbCgpIHsKKwkJQ2hhcnRNb2RlbEltcGwgY2hhcnRNb2RlbCA9IG5ldyBDaGFydE1vZGVsSW1wbCgpOworCQlyZXR1cm4gY2hhcnRNb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnRMYXp5UmVzb2x2ZXIgY3JlYXRlQ2hhcnRMYXp5UmVzb2x2ZXIoKSB7CisJCUNoYXJ0TGF6eVJlc29sdmVySW1wbCBjaGFydExhenlSZXNvbHZlciA9IG5ldyBDaGFydExhenlSZXNvbHZlckltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0TGF6eVJlc29sdmVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydEJhc2UgY3JlYXRlQ2hhcnRCYXNlKCkgeworCQlDaGFydEJhc2VJbXBsIGNoYXJ0QmFzZSA9IG5ldyBDaGFydEJhc2VJbXBsKCk7CisJCXJldHVybiBjaGFydEJhc2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0UGFja2FnZSBjcmVhdGVDaGFydFBhY2thZ2UoKSB7CisJCUNoYXJ0UGFja2FnZUltcGwgY2hhcnRQYWNrYWdlID0gbmV3IENoYXJ0UGFja2FnZUltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0UGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnQgY3JlYXRlQ2hhcnQoKSB7CisJCUNoYXJ0SW1wbCBjaGFydCA9IG5ldyBDaGFydEltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydEJhciBjcmVhdGVDaGFydEJhcigpIHsKKwkJQ2hhcnRCYXJJbXBsIGNoYXJ0QmFyID0gbmV3IENoYXJ0QmFySW1wbCgpOworCQlyZXR1cm4gY2hhcnRCYXI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0TGluZSBjcmVhdGVDaGFydExpbmUoKSB7CisJCUNoYXJ0TGluZUltcGwgY2hhcnRMaW5lID0gbmV3IENoYXJ0TGluZUltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0TGluZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnRQaWUgY3JlYXRlQ2hhcnRQaWUoKSB7CisJCUNoYXJ0UGllSW1wbCBjaGFydFBpZSA9IG5ldyBDaGFydFBpZUltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0UGllOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydERvbnV0IGNyZWF0ZUNoYXJ0RG9udXQoKSB7CisJCUNoYXJ0RG9udXRJbXBsIGNoYXJ0RG9udXQgPSBuZXcgQ2hhcnREb251dEltcGwoKTsKKwkJcmV0dXJuIGNoYXJ0RG9udXQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0QnViYmxlIGNyZWF0ZUNoYXJ0QnViYmxlKCkgeworCQlDaGFydEJ1YmJsZUltcGwgY2hhcnRCdWJibGUgPSBuZXcgQ2hhcnRCdWJibGVJbXBsKCk7CisJCXJldHVybiBjaGFydEJ1YmJsZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnRHYXVnZSBjcmVhdGVDaGFydEdhdWdlKCkgeworCQlDaGFydEdhdWdlSW1wbCBjaGFydEdhdWdlID0gbmV3IENoYXJ0R2F1Z2VJbXBsKCk7CisJCXJldHVybiBjaGFydEdhdWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydFRyZWUgY3JlYXRlQ2hhcnRUcmVlKCkgeworCQlDaGFydFRyZWVJbXBsIGNoYXJ0VHJlZSA9IG5ldyBDaGFydFRyZWVJbXBsKCk7CisJCXJldHVybiBjaGFydFRyZWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0TnVtYmVySW50ZXJ2YWwgY3JlYXRlQ2hhcnROdW1iZXJJbnRlcnZhbCgpIHsKKwkJQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwgY2hhcnROdW1iZXJJbnRlcnZhbCA9IG5ldyBDaGFydE51bWJlckludGVydmFsSW1wbCgpOworCQlyZXR1cm4gY2hhcnROdW1iZXJJbnRlcnZhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnREYXRhbWFydCBjcmVhdGVDaGFydERhdGFtYXJ0KCkgeworCQlDaGFydERhdGFtYXJ0SW1wbCBjaGFydERhdGFtYXJ0ID0gbmV3IENoYXJ0RGF0YW1hcnRJbXBsKCk7CisJCXJldHVybiBjaGFydERhdGFtYXJ0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydExlZ2VuZCBjcmVhdGVDaGFydExlZ2VuZCgpIHsKKwkJQ2hhcnRMZWdlbmRJbXBsIGNoYXJ0TGVnZW5kID0gbmV3IENoYXJ0TGVnZW5kSW1wbCgpOworCQlyZXR1cm4gY2hhcnRMZWdlbmQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0SGlnaGxpZ2h0ZXIgY3JlYXRlQ2hhcnRIaWdobGlnaHRlcigpIHsKKwkJQ2hhcnRIaWdobGlnaHRlckltcGwgY2hhcnRIaWdobGlnaHRlciA9IG5ldyBDaGFydEhpZ2hsaWdodGVySW1wbCgpOworCQlyZXR1cm4gY2hhcnRIaWdobGlnaHRlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnRBeGlzIGNyZWF0ZUNoYXJ0QXhpcygpIHsKKwkJQ2hhcnRBeGlzSW1wbCBjaGFydEF4aXMgPSBuZXcgQ2hhcnRBeGlzSW1wbCgpOworCQlyZXR1cm4gY2hhcnRBeGlzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydFNlZ21lbnRDb2xvciBjcmVhdGVDaGFydFNlZ21lbnRDb2xvcigpIHsKKwkJQ2hhcnRTZWdtZW50Q29sb3JJbXBsIGNoYXJ0U2VnbWVudENvbG9yID0gbmV3IENoYXJ0U2VnbWVudENvbG9ySW1wbCgpOworCQlyZXR1cm4gY2hhcnRTZWdtZW50Q29sb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExlZ2VuZFBsYWNlbWVudEVudW0gY3JlYXRlTGVnZW5kUGxhY2VtZW50RW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlMZWdlbmRQbGFjZW1lbnRFbnVtIHJlc3VsdCA9IExlZ2VuZFBsYWNlbWVudEVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydExlZ2VuZFBsYWNlbWVudEVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVG9nZ2xlVHlwZUVudW0gY3JlYXRlVG9nZ2xlVHlwZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJVG9nZ2xlVHlwZUVudW0gcmVzdWx0ID0gVG9nZ2xlVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFRvZ2dsZVR5cGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFRvb2x0aXBMb2NhdGlvbkVudW0gY3JlYXRlVG9vbHRpcExvY2F0aW9uRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlUb29sdGlwTG9jYXRpb25FbnVtIHJlc3VsdCA9IFRvb2x0aXBMb2NhdGlvbkVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFRvb2x0aXBMb2NhdGlvbkVudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUmVuZGVyVHlwZUVudW0gY3JlYXRlUmVuZGVyVHlwZUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJUmVuZGVyVHlwZUVudW0gcmVzdWx0ID0gUmVuZGVyVHlwZUVudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFJlbmRlclR5cGVFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVybmFsRU9iamVjdCBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIChJbnRlcm5hbEVPYmplY3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydERTTFBhY2thZ2UgZ2V0Q2hhcnREU0xQYWNrYWdlKCkgeworCQlyZXR1cm4gKENoYXJ0RFNMUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIENoYXJ0RFNMUGFja2FnZSBnZXRQYWNrYWdlKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLmVJTlNUQU5DRTsKKwl9CisKK30gLy9DaGFydERTTEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0RFNMUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnREU0xQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZDEzZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0RFNMUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDEzNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuT1NCUFR5cGVzUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXM7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREYXRhbWFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RG9udXQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRIaWdobGlnaHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExhenlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMaW5lOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFNlZ21lbnRDb2xvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5SZW5kZXJUeXBlRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvZ2dsZVR5cGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuVG9vbHRpcExvY2F0aW9uRW51bTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnREU0xQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0RFNMUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBDaGFydERTTFBhY2thZ2UgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNoYXJ0TW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRMYXp5UmVzb2x2ZXJFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRCYXNlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNoYXJ0UGFja2FnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydE9wdGlvbkVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEJhckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydExpbmVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRQaWVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnREb251dEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEJ1YmJsZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEdhdWdlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNoYXJ0VHJlZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEludGVydmFsRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIGNoYXJ0TnVtYmVySW50ZXJ2YWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnREYXRhbWFydEVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEVsZW1lbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRMZWdlbmRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRIaWdobGlnaHRlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBjaGFydEF4aXNFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRSYW5nZUVsZW1lbnRFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgY2hhcnRTZWdtZW50Q29sb3JFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSBsZWdlbmRQbGFjZW1lbnRFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSB0b2dnbGVUeXBlRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gdG9vbHRpcExvY2F0aW9uRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUVudW0gcmVuZGVyVHlwZUVudW1FRW51bSA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVEYXRhVHlwZSBpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGUgPSBudWxsOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAorCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5IHRoZSBwYWNrYWdlCisJICogcGFja2FnZSBVUkkgdmFsdWUuCisJICogPHA+Tm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYworCSAqIGZhY3RvcnkgbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zCisJICogaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwKKwkgKiBpZiBvbmUgYWxyZWFkeSBleGlzdHMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIENoYXJ0RFNMUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKGVOU19VUkksIENoYXJ0RFNMRmFjdG9yeS5lSU5TVEFOQ0UpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0ZWQgPSBmYWxzZTsKKworCS8qKgorCSAqIENyZWF0ZXMsIHJlZ2lzdGVycywgYW5kIGluaXRpYWxpemVzIHRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhpcyBtb2RlbCwgYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4KKwkgKiAKKwkgKiA8cD5UaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUge0BsaW5rIENoYXJ0RFNMUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQ2hhcnREU0xQYWNrYWdlIGluaXQoKSB7CisJCWlmIChpc0luaXRlZCkgcmV0dXJuIChDaGFydERTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQ2hhcnREU0xQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJQ2hhcnREU0xQYWNrYWdlSW1wbCB0aGVDaGFydERTTFBhY2thZ2UgPSAoQ2hhcnREU0xQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQ2hhcnREU0xQYWNrYWdlSW1wbCA/IEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSA6IG5ldyBDaGFydERTTFBhY2thZ2VJbXBsKCkpOworCisJCWlzSW5pdGVkID0gdHJ1ZTsKKworCQkvLyBJbml0aWFsaXplIHNpbXBsZSBkZXBlbmRlbmNpZXMKKwkJRGF0YW1hcnREU0xQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKworCQkvLyBDcmVhdGUgcGFja2FnZSBtZXRhLWRhdGEgb2JqZWN0cworCQl0aGVDaGFydERTTFBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBjcmVhdGVkIG1ldGEtZGF0YQorCQl0aGVDaGFydERTTFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlQ2hhcnREU0xQYWNrYWdlLmZyZWV6ZSgpOworCisgIAorCQkvLyBVcGRhdGUgdGhlIHJlZ2lzdHJ5IGFuZCByZXR1cm4gdGhlIHBhY2thZ2UKKwkJRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UucHV0KENoYXJ0RFNMUGFja2FnZS5lTlNfVVJJLCB0aGVDaGFydERTTFBhY2thZ2UpOworCQlyZXR1cm4gdGhlQ2hhcnREU0xQYWNrYWdlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRNb2RlbCgpIHsKKwkJcmV0dXJuIGNoYXJ0TW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnRNb2RlbF9QYWNrYWdlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNoYXJ0TW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0TGF6eVJlc29sdmVyKCkgeworCQlyZXR1cm4gY2hhcnRMYXp5UmVzb2x2ZXJFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVPcGVyYXRpb24gZ2V0Q2hhcnRMYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpIHsKKwkJcmV0dXJuIGNoYXJ0TGF6eVJlc29sdmVyRUNsYXNzLmdldEVPcGVyYXRpb25zKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRCYXNlKCkgeworCQlyZXR1cm4gY2hhcnRCYXNlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QmFzZV9OYW1lKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRCYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydFBhY2thZ2UoKSB7CisJCXJldHVybiBjaGFydFBhY2thZ2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnRQYWNrYWdlX0NoYXJ0cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNoYXJ0UGFja2FnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnQoKSB7CisJCXJldHVybiBjaGFydEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydF9EZXNjcmlwdGlvbigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRfRGVzY3JpcHRpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRfUG9sbGluZygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRfUG9sbGluZ1RpbWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENoYXJ0X0NoYXJ0dHlwZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNoYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnRfU291cmNlKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2hhcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg1KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0T3B0aW9uKCkgeworCQlyZXR1cm4gY2hhcnRPcHRpb25FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydEJhcigpIHsKKwkJcmV0dXJuIGNoYXJ0QmFyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QmFyX1NoYWRvdygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0QmFyRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRCYXJfQW5pbWF0ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEJhckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QmFyX1N3YXBwZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEJhckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QmFyX1N0YWNrZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEJhckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRMaW5lKCkgeworCQlyZXR1cm4gY2hhcnRMaW5lRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0TGluZV9BbmltYXRlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0TGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0TGluZV9TaG93TWFya2VyKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRMaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRMaW5lX1RyZW5kTGluZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0TGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0TGluZV9ab29tKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRMaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRMaW5lX0N1cnNvcigpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0TGluZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0TGluZV9Ub29sdGlwKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRMaW5lRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRMaW5lX0ZpbGxUb1plcm8oKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydExpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg2KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydExpbmVfRmlsbEFyZWEoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydExpbmVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCg3KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0UGllKCkgeworCQlyZXR1cm4gY2hhcnRQaWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRQaWVfRW1wdHkoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydFBpZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnREb251dCgpIHsKKwkJcmV0dXJuIGNoYXJ0RG9udXRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydEJ1YmJsZSgpIHsKKwkJcmV0dXJuIGNoYXJ0QnViYmxlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QnViYmxlX011bHRpcGxpZXIoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEJ1YmJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QnViYmxlX011bHRpcGxpZXJWYWx1ZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0QnViYmxlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRCdWJibGVfR3JhZGllbnQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEJ1YmJsZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QnViYmxlX1RyYW5zcGFyZW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRCdWJibGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0R2F1Z2UoKSB7CisJCXJldHVybiBjaGFydEdhdWdlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfTGFiZWxlZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0R2F1Z2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydEdhdWdlX0xhYmVsVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEdhdWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRHYXVnZV9IYXNUaWNrcygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0R2F1Z2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydEdhdWdlX01pblZhbHVlKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRHYXVnZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0R2F1Z2VfTWF4VmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEdhdWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRHYXVnZV9IYXNJbnRlcnZhbHMoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEdhdWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnRHYXVnZV9JbnRlcnZhbHMoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljaGFydEdhdWdlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoNik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydFRyZWUoKSB7CisJCXJldHVybiBjaGFydFRyZWVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRUcmVlX01hcCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0VHJlZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0VHJlZV9Db2xsYXBzaWJsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0VHJlZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRJbnRlcnZhbCgpIHsKKwkJcmV0dXJuIGNoYXJ0SW50ZXJ2YWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydE51bWJlckludGVydmFsKCkgeworCQlyZXR1cm4gY2hhcnROdW1iZXJJbnRlcnZhbEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydE51bWJlckludGVydmFsX051bWJlckludGVydmFsVmFsdWUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydE51bWJlckludGVydmFsRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbF9OdW1iZXJSYW5nZSgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNoYXJ0TnVtYmVySW50ZXJ2YWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0RGF0YW1hcnQoKSB7CisJCXJldHVybiBjaGFydERhdGFtYXJ0RUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENoYXJ0RGF0YW1hcnRfRGF0YW1hcnRSZWYoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSljaGFydERhdGFtYXJ0RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Q2hhcnREYXRhbWFydF9FbGVtZW50cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKWNoYXJ0RGF0YW1hcnRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0RWxlbWVudCgpIHsKKwkJcmV0dXJuIGNoYXJ0RWxlbWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0TGVnZW5kKCkgeworCQlyZXR1cm4gY2hhcnRMZWdlbmRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRMZWdlbmRfUGxhY2VtZW50KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRMZWdlbmRFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydExlZ2VuZF9Ub2dnbGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydExlZ2VuZEVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDEpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0TGVnZW5kX1JlcGxvdCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0TGVnZW5kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRMZWdlbmRfVG9nZ2xlVHlwZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0TGVnZW5kRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRDaGFydEhpZ2hsaWdodGVyKCkgeworCQlyZXR1cm4gY2hhcnRIaWdobGlnaHRlckVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydEhpZ2hsaWdodGVyX0xvY2F0aW9uKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRIaWdobGlnaHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0SGlnaGxpZ2h0ZXJfVG9vbHRpcEFsd2F5cygpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0SGlnaGxpZ2h0ZXJFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydEhpZ2hsaWdodGVyX0luc2lkZUNoYXJ0KCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRIaWdobGlnaHRlckVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRBeGlzKCkgeworCQlyZXR1cm4gY2hhcnRBeGlzRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldENoYXJ0QXhpc19BeGlzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpY2hhcnRBeGlzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRBeGlzX1JlbmRlclR5cGUoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSljaGFydEF4aXNFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRDaGFydEF4aXNfU2hvcnRMYWJlbCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0QXhpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldENoYXJ0QXhpc19BbmdsZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWNoYXJ0QXhpc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDMpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Q2hhcnRSYW5nZUVsZW1lbnQoKSB7CisJCXJldHVybiBjaGFydFJhbmdlRWxlbWVudEVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldENoYXJ0U2VnbWVudENvbG9yKCkgeworCQlyZXR1cm4gY2hhcnRTZWdtZW50Q29sb3JFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Q2hhcnRTZWdtZW50Q29sb3JfUmdiKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpY2hhcnRTZWdtZW50Q29sb3JFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0TGVnZW5kUGxhY2VtZW50RW51bSgpIHsKKwkJcmV0dXJuIGxlZ2VuZFBsYWNlbWVudEVudW1FRW51bTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0VG9nZ2xlVHlwZUVudW0oKSB7CisJCXJldHVybiB0b2dnbGVUeXBlRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRUb29sdGlwTG9jYXRpb25FbnVtKCkgeworCQlyZXR1cm4gdG9vbHRpcExvY2F0aW9uRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSZW5kZXJUeXBlRW51bSgpIHsKKwkJcmV0dXJuIHJlbmRlclR5cGVFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRJbnRlcm5hbEVPYmplY3QoKSB7CisJCXJldHVybiBpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0RFNMRmFjdG9yeSBnZXRDaGFydERTTEZhY3RvcnkoKSB7CisJCXJldHVybiAoQ2hhcnREU0xGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWNoYXJ0TW9kZWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfTU9ERUwpOworCQljcmVhdGVFUmVmZXJlbmNlKGNoYXJ0TW9kZWxFQ2xhc3MsIENIQVJUX01PREVMX19QQUNLQUdFUyk7CisKKwkJY2hhcnRMYXp5UmVzb2x2ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfTEFaWV9SRVNPTFZFUik7CisJCWNyZWF0ZUVPcGVyYXRpb24oY2hhcnRMYXp5UmVzb2x2ZXJFQ2xhc3MsIENIQVJUX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUKTsKKworCQljaGFydEJhc2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfQkFTRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRCYXNlRUNsYXNzLCBDSEFSVF9CQVNFX19OQU1FKTsKKworCQljaGFydFBhY2thZ2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfUEFDS0FHRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY2hhcnRQYWNrYWdlRUNsYXNzLCBDSEFSVF9QQUNLQUdFX19DSEFSVFMpOworCisJCWNoYXJ0RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIQVJUKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEVDbGFzcywgQ0hBUlRfX0RFU0NSSVBUSU9OKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEVDbGFzcywgQ0hBUlRfX0RFU0NSSVBUSU9OX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEVDbGFzcywgQ0hBUlRfX1BPTExJTkcpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0RUNsYXNzLCBDSEFSVF9fUE9MTElOR19USU1FKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjaGFydEVDbGFzcywgQ0hBUlRfX0NIQVJUVFlQRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY2hhcnRFQ2xhc3MsIENIQVJUX19TT1VSQ0UpOworCisJCWNoYXJ0T3B0aW9uRUNsYXNzID0gY3JlYXRlRUNsYXNzKENIQVJUX09QVElPTik7CisKKwkJY2hhcnRCYXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfQkFSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJhckVDbGFzcywgQ0hBUlRfQkFSX19TSEFET1cpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0QmFyRUNsYXNzLCBDSEFSVF9CQVJfX0FOSU1BVEVEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJhckVDbGFzcywgQ0hBUlRfQkFSX19TV0FQUEVEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJhckVDbGFzcywgQ0hBUlRfQkFSX19TVEFDS0VEKTsKKworCQljaGFydExpbmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfTElORSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRMaW5lRUNsYXNzLCBDSEFSVF9MSU5FX19BTklNQVRFRCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRMaW5lRUNsYXNzLCBDSEFSVF9MSU5FX19TSE9XX01BUktFUik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRMaW5lRUNsYXNzLCBDSEFSVF9MSU5FX19UUkVORF9MSU5FKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydExpbmVFQ2xhc3MsIENIQVJUX0xJTkVfX1pPT00pOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0TGluZUVDbGFzcywgQ0hBUlRfTElORV9fQ1VSU09SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydExpbmVFQ2xhc3MsIENIQVJUX0xJTkVfX1RPT0xUSVApOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0TGluZUVDbGFzcywgQ0hBUlRfTElORV9fRklMTF9UT19aRVJPKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydExpbmVFQ2xhc3MsIENIQVJUX0xJTkVfX0ZJTExfQVJFQSk7CisKKwkJY2hhcnRQaWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfUElFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydFBpZUVDbGFzcywgQ0hBUlRfUElFX19FTVBUWSk7CisKKwkJY2hhcnREb251dEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDSEFSVF9ET05VVCk7CisKKwkJY2hhcnRCdWJibGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfQlVCQkxFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJ1YmJsZUVDbGFzcywgQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJ1YmJsZUVDbGFzcywgQ0hBUlRfQlVCQkxFX19NVUxUSVBMSUVSX1ZBTFVFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEJ1YmJsZUVDbGFzcywgQ0hBUlRfQlVCQkxFX19HUkFESUVOVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRCdWJibGVFQ2xhc3MsIENIQVJUX0JVQkJMRV9fVFJBTlNQQVJFTlQpOworCisJCWNoYXJ0R2F1Z2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfR0FVR0UpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0R2F1Z2VFQ2xhc3MsIENIQVJUX0dBVUdFX19MQUJFTEVEKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEdhdWdlRUNsYXNzLCBDSEFSVF9HQVVHRV9fTEFCRUxfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0R2F1Z2VFQ2xhc3MsIENIQVJUX0dBVUdFX19IQVNfVElDS1MpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0R2F1Z2VFQ2xhc3MsIENIQVJUX0dBVUdFX19NSU5fVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0R2F1Z2VFQ2xhc3MsIENIQVJUX0dBVUdFX19NQVhfVkFMVUUpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0R2F1Z2VFQ2xhc3MsIENIQVJUX0dBVUdFX19IQVNfSU5URVJWQUxTKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShjaGFydEdhdWdlRUNsYXNzLCBDSEFSVF9HQVVHRV9fSU5URVJWQUxTKTsKKworCQljaGFydFRyZWVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfVFJFRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRUcmVlRUNsYXNzLCBDSEFSVF9UUkVFX19NQVApOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0VHJlZUVDbGFzcywgQ0hBUlRfVFJFRV9fQ09MTEFQU0lCTEUpOworCisJCWNoYXJ0SW50ZXJ2YWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfSU5URVJWQUwpOworCisJCWNoYXJ0TnVtYmVySW50ZXJ2YWxFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfTlVNQkVSX0lOVEVSVkFMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydE51bWJlckludGVydmFsRUNsYXNzLCBDSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY2hhcnROdW1iZXJJbnRlcnZhbEVDbGFzcywgQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UpOworCisJCWNoYXJ0RGF0YW1hcnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfREFUQU1BUlQpOworCQljcmVhdGVFUmVmZXJlbmNlKGNoYXJ0RGF0YW1hcnRFQ2xhc3MsIENIQVJUX0RBVEFNQVJUX19EQVRBTUFSVF9SRUYpOworCQljcmVhdGVFUmVmZXJlbmNlKGNoYXJ0RGF0YW1hcnRFQ2xhc3MsIENIQVJUX0RBVEFNQVJUX19FTEVNRU5UUyk7CisKKwkJY2hhcnRFbGVtZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKENIQVJUX0VMRU1FTlQpOworCisJCWNoYXJ0TGVnZW5kRUNsYXNzID0gY3JlYXRlRUNsYXNzKENIQVJUX0xFR0VORCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRMZWdlbmRFQ2xhc3MsIENIQVJUX0xFR0VORF9fUExBQ0VNRU5UKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydExlZ2VuZEVDbGFzcywgQ0hBUlRfTEVHRU5EX19UT0dHTEUpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0TGVnZW5kRUNsYXNzLCBDSEFSVF9MRUdFTkRfX1JFUExPVCk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRMZWdlbmRFQ2xhc3MsIENIQVJUX0xFR0VORF9fVE9HR0xFX1RZUEUpOworCisJCWNoYXJ0SGlnaGxpZ2h0ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfSElHSExJR0hURVIpOworCQljcmVhdGVFQXR0cmlidXRlKGNoYXJ0SGlnaGxpZ2h0ZXJFQ2xhc3MsIENIQVJUX0hJR0hMSUdIVEVSX19MT0NBVElPTik7CisJCWNyZWF0ZUVBdHRyaWJ1dGUoY2hhcnRIaWdobGlnaHRlckVDbGFzcywgQ0hBUlRfSElHSExJR0hURVJfX1RPT0xUSVBfQUxXQVlTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEhpZ2hsaWdodGVyRUNsYXNzLCBDSEFSVF9ISUdITElHSFRFUl9fSU5TSURFX0NIQVJUKTsKKworCQljaGFydEF4aXNFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQ0hBUlRfQVhJUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2UoY2hhcnRBeGlzRUNsYXNzLCBDSEFSVF9BWElTX19BWElTKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEF4aXNFQ2xhc3MsIENIQVJUX0FYSVNfX1JFTkRFUl9UWVBFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEF4aXNFQ2xhc3MsIENIQVJUX0FYSVNfX1NIT1JUX0xBQkVMKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydEF4aXNFQ2xhc3MsIENIQVJUX0FYSVNfX0FOR0xFKTsKKworCQljaGFydFJhbmdlRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDSEFSVF9SQU5HRV9FTEVNRU5UKTsKKworCQljaGFydFNlZ21lbnRDb2xvckVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhDSEFSVF9TRUdNRU5UX0NPTE9SKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShjaGFydFNlZ21lbnRDb2xvckVDbGFzcywgQ0hBUlRfU0VHTUVOVF9DT0xPUl9fUkdCKTsKKworCQkvLyBDcmVhdGUgZW51bXMKKwkJbGVnZW5kUGxhY2VtZW50RW51bUVFbnVtID0gY3JlYXRlRUVudW0oTEVHRU5EX1BMQUNFTUVOVF9FTlVNKTsKKwkJdG9nZ2xlVHlwZUVudW1FRW51bSA9IGNyZWF0ZUVFbnVtKFRPR0dMRV9UWVBFX0VOVU0pOworCQl0b29sdGlwTG9jYXRpb25FbnVtRUVudW0gPSBjcmVhdGVFRW51bShUT09MVElQX0xPQ0FUSU9OX0VOVU0pOworCQlyZW5kZXJUeXBlRW51bUVFbnVtID0gY3JlYXRlRUVudW0oUkVOREVSX1RZUEVfRU5VTSk7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElOVEVSTkFMX0VPQkpFQ1QpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCU9TQlBUeXBlc1BhY2thZ2UgdGhlT1NCUFR5cGVzUGFja2FnZSA9IChPU0JQVHlwZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9TQlBUeXBlc1BhY2thZ2UuZU5TX1VSSSk7CisJCURhdGFtYXJ0RFNMUGFja2FnZSB0aGVEYXRhbWFydERTTFBhY2thZ2UgPSAoRGF0YW1hcnREU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERhdGFtYXJ0RFNMUGFja2FnZS5lTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gU2V0IGJvdW5kcyBmb3IgdHlwZSBwYXJhbWV0ZXJzCisKKwkJLy8gQWRkIHN1cGVydHlwZXMgdG8gY2xhc3NlcworCQljaGFydEJhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDaGFydExhenlSZXNvbHZlcigpKTsKKwkJY2hhcnRQYWNrYWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZU9TQlBUeXBlc1BhY2thZ2UuZ2V0TFBhY2thZ2UoKSk7CisJCWNoYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2hhcnRCYXNlKCkpOworCQljaGFydE9wdGlvbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0TGF6eVJlc29sdmVyKCkpOworCQljaGFydEJhckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0T3B0aW9uKCkpOworCQljaGFydExpbmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDaGFydE9wdGlvbigpKTsKKwkJY2hhcnRQaWVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDaGFydE9wdGlvbigpKTsKKwkJY2hhcnREb251dEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0T3B0aW9uKCkpOworCQljaGFydEJ1YmJsZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0T3B0aW9uKCkpOworCQljaGFydEdhdWdlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2hhcnRPcHRpb24oKSk7CisJCWNoYXJ0VHJlZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0T3B0aW9uKCkpOworCQljaGFydEludGVydmFsRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2hhcnRMYXp5UmVzb2x2ZXIoKSk7CisJCWNoYXJ0TnVtYmVySW50ZXJ2YWxFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRDaGFydEludGVydmFsKCkpOworCQljaGFydERhdGFtYXJ0RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2hhcnRMYXp5UmVzb2x2ZXIoKSk7CisJCWNoYXJ0RWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0TGF6eVJlc29sdmVyKCkpOworCQljaGFydExlZ2VuZEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0RWxlbWVudCgpKTsKKwkJY2hhcnRIaWdobGlnaHRlckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0RWxlbWVudCgpKTsKKwkJY2hhcnRBeGlzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Q2hhcnRFbGVtZW50KCkpOworCQljaGFydFJhbmdlRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0TGF6eVJlc29sdmVyKCkpOworCQljaGFydFNlZ21lbnRDb2xvckVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldENoYXJ0UmFuZ2VFbGVtZW50KCkpOworCisJCS8vIEluaXRpYWxpemUgY2xhc3NlcywgZmVhdHVyZXMsIGFuZCBvcGVyYXRpb25zOyBhZGQgcGFyYW1ldGVycworCQlpbml0RUNsYXNzKGNoYXJ0TW9kZWxFQ2xhc3MsIENoYXJ0TW9kZWwuY2xhc3MsICJDaGFydE1vZGVsIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRDaGFydE1vZGVsX1BhY2thZ2VzKCksIHRoaXMuZ2V0Q2hhcnRQYWNrYWdlKCksIG51bGwsICJwYWNrYWdlcyIsIG51bGwsIDAsIC0xLCBDaGFydE1vZGVsLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRMYXp5UmVzb2x2ZXJFQ2xhc3MsIENoYXJ0TGF6eVJlc29sdmVyLmNsYXNzLCAiQ2hhcnRMYXp5UmVzb2x2ZXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJRU9wZXJhdGlvbiBvcCA9IGluaXRFT3BlcmF0aW9uKGdldENoYXJ0TGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgImVSZXNvbHZlUHJveHkiLCAwLCAxLCAhSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJbnRlcm5hbEVPYmplY3QoKSwgInByb3h5IiwgMCwgMSwgIUlTX1VOSVFVRSwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjaGFydEJhc2VFQ2xhc3MsIENoYXJ0QmFzZS5jbGFzcywgIkNoYXJ0QmFzZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRCYXNlX05hbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm5hbWUiLCBudWxsLCAwLCAxLCBDaGFydEJhc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRQYWNrYWdlRUNsYXNzLCBDaGFydFBhY2thZ2UuY2xhc3MsICJDaGFydFBhY2thZ2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldENoYXJ0UGFja2FnZV9DaGFydHMoKSwgdGhpcy5nZXRDaGFydCgpLCBudWxsLCAiY2hhcnRzIiwgbnVsbCwgMCwgLTEsIENoYXJ0UGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0RUNsYXNzLCBDaGFydC5jbGFzcywgIkNoYXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydF9EZXNjcmlwdGlvbigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImRlc2NyaXB0aW9uIiwgbnVsbCwgMCwgMSwgQ2hhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydF9EZXNjcmlwdGlvblZhbHVlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZXNjcmlwdGlvblZhbHVlIiwgbnVsbCwgMCwgMSwgQ2hhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydF9Qb2xsaW5nKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicG9sbGluZyIsIG51bGwsIDAsIDEsIENoYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRfUG9sbGluZ1RpbWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVJbnQoKSwgInBvbGxpbmdUaW1lIiwgbnVsbCwgMCwgMSwgQ2hhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRDaGFydF9DaGFydHR5cGUoKSwgdGhpcy5nZXRDaGFydE9wdGlvbigpLCBudWxsLCAiY2hhcnR0eXBlIiwgbnVsbCwgMCwgMSwgQ2hhcnQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldENoYXJ0X1NvdXJjZSgpLCB0aGlzLmdldENoYXJ0RGF0YW1hcnQoKSwgbnVsbCwgInNvdXJjZSIsIG51bGwsIDAsIDEsIENoYXJ0LmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRPcHRpb25FQ2xhc3MsIENoYXJ0T3B0aW9uLmNsYXNzLCAiQ2hhcnRPcHRpb24iLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoY2hhcnRCYXJFQ2xhc3MsIENoYXJ0QmFyLmNsYXNzLCAiQ2hhcnRCYXIiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0QmFyX1NoYWRvdygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInNoYWRvdyIsIG51bGwsIDAsIDEsIENoYXJ0QmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRCYXJfQW5pbWF0ZWQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJhbmltYXRlZCIsIG51bGwsIDAsIDEsIENoYXJ0QmFyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRCYXJfU3dhcHBlZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInN3YXBwZWQiLCBudWxsLCAwLCAxLCBDaGFydEJhci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0QmFyX1N0YWNrZWQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzdGFja2VkIiwgbnVsbCwgMCwgMSwgQ2hhcnRCYXIuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRMaW5lRUNsYXNzLCBDaGFydExpbmUuY2xhc3MsICJDaGFydExpbmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0TGluZV9BbmltYXRlZCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImFuaW1hdGVkIiwgbnVsbCwgMCwgMSwgQ2hhcnRMaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRMaW5lX1Nob3dNYXJrZXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJzaG93TWFya2VyIiwgbnVsbCwgMCwgMSwgQ2hhcnRMaW5lLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRMaW5lX1RyZW5kTGluZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRyZW5kTGluZSIsIG51bGwsIDAsIDEsIENoYXJ0TGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0TGluZV9ab29tKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiem9vbSIsIG51bGwsIDAsIDEsIENoYXJ0TGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0TGluZV9DdXJzb3IoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJjdXJzb3IiLCBudWxsLCAwLCAxLCBDaGFydExpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydExpbmVfVG9vbHRpcCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRvb2x0aXAiLCBudWxsLCAwLCAxLCBDaGFydExpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydExpbmVfRmlsbFRvWmVybygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImZpbGxUb1plcm8iLCBudWxsLCAwLCAxLCBDaGFydExpbmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydExpbmVfRmlsbEFyZWEoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJmaWxsQXJlYSIsIG51bGwsIDAsIDEsIENoYXJ0TGluZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjaGFydFBpZUVDbGFzcywgQ2hhcnRQaWUuY2xhc3MsICJDaGFydFBpZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRQaWVfRW1wdHkoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJlbXB0eSIsIG51bGwsIDAsIDEsIENoYXJ0UGllLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0RG9udXRFQ2xhc3MsIENoYXJ0RG9udXQuY2xhc3MsICJDaGFydERvbnV0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoY2hhcnRCdWJibGVFQ2xhc3MsIENoYXJ0QnViYmxlLmNsYXNzLCAiQ2hhcnRCdWJibGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0QnViYmxlX011bHRpcGxpZXIoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJtdWx0aXBsaWVyIiwgbnVsbCwgMCwgMSwgQ2hhcnRCdWJibGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydEJ1YmJsZV9NdWx0aXBsaWVyVmFsdWUoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgIm11bHRpcGxpZXJWYWx1ZSIsIG51bGwsIDAsIDEsIENoYXJ0QnViYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRCdWJibGVfR3JhZGllbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJncmFkaWVudCIsIG51bGwsIDAsIDEsIENoYXJ0QnViYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRCdWJibGVfVHJhbnNwYXJlbnQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJ0cmFuc3BhcmVudCIsIG51bGwsIDAsIDEsIENoYXJ0QnViYmxlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0R2F1Z2VFQ2xhc3MsIENoYXJ0R2F1Z2UuY2xhc3MsICJDaGFydEdhdWdlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydEdhdWdlX0xhYmVsZWQoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJsYWJlbGVkIiwgbnVsbCwgMCwgMSwgQ2hhcnRHYXVnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0R2F1Z2VfTGFiZWxWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAibGFiZWxWYWx1ZSIsIG51bGwsIDAsIDEsIENoYXJ0R2F1Z2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydEdhdWdlX0hhc1RpY2tzKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiaGFzVGlja3MiLCBudWxsLCAwLCAxLCBDaGFydEdhdWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRHYXVnZV9NaW5WYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibWluVmFsdWUiLCBudWxsLCAwLCAxLCBDaGFydEdhdWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRHYXVnZV9NYXhWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibWF4VmFsdWUiLCBudWxsLCAwLCAxLCBDaGFydEdhdWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRHYXVnZV9IYXNJbnRlcnZhbHMoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVCb29sZWFuKCksICJoYXNJbnRlcnZhbHMiLCBudWxsLCAwLCAxLCBDaGFydEdhdWdlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q2hhcnRHYXVnZV9JbnRlcnZhbHMoKSwgdGhpcy5nZXRDaGFydEludGVydmFsKCksIG51bGwsICJpbnRlcnZhbHMiLCBudWxsLCAwLCAtMSwgQ2hhcnRHYXVnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0VHJlZUVDbGFzcywgQ2hhcnRUcmVlLmNsYXNzLCAiQ2hhcnRUcmVlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydFRyZWVfTWFwKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAibWFwIiwgbnVsbCwgMCwgMSwgQ2hhcnRUcmVlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRUcmVlX0NvbGxhcHNpYmxlKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAiY29sbGFwc2libGUiLCBudWxsLCAwLCAxLCBDaGFydFRyZWUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRJbnRlcnZhbEVDbGFzcywgQ2hhcnRJbnRlcnZhbC5jbGFzcywgIkNoYXJ0SW50ZXJ2YWwiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoY2hhcnROdW1iZXJJbnRlcnZhbEVDbGFzcywgQ2hhcnROdW1iZXJJbnRlcnZhbC5jbGFzcywgIkNoYXJ0TnVtYmVySW50ZXJ2YWwiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0TnVtYmVySW50ZXJ2YWxfTnVtYmVySW50ZXJ2YWxWYWx1ZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAibnVtYmVySW50ZXJ2YWxWYWx1ZSIsIG51bGwsIDAsIDEsIENoYXJ0TnVtYmVySW50ZXJ2YWwuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRDaGFydE51bWJlckludGVydmFsX051bWJlclJhbmdlKCksIHRoaXMuZ2V0Q2hhcnRSYW5nZUVsZW1lbnQoKSwgbnVsbCwgIm51bWJlclJhbmdlIiwgbnVsbCwgMCwgMSwgQ2hhcnROdW1iZXJJbnRlcnZhbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0RGF0YW1hcnRFQ2xhc3MsIENoYXJ0RGF0YW1hcnQuY2xhc3MsICJDaGFydERhdGFtYXJ0IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRDaGFydERhdGFtYXJ0X0RhdGFtYXJ0UmVmKCksIHRoZURhdGFtYXJ0RFNMUGFja2FnZS5nZXREYXRhbWFydERlZmluaXRpb24oKSwgbnVsbCwgImRhdGFtYXJ0UmVmIiwgbnVsbCwgMCwgMSwgQ2hhcnREYXRhbWFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q2hhcnREYXRhbWFydF9FbGVtZW50cygpLCB0aGlzLmdldENoYXJ0RWxlbWVudCgpLCBudWxsLCAiZWxlbWVudHMiLCBudWxsLCAwLCAtMSwgQ2hhcnREYXRhbWFydC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0RWxlbWVudEVDbGFzcywgQ2hhcnRFbGVtZW50LmNsYXNzLCAiQ2hhcnRFbGVtZW50IiwgSVNfQUJTVFJBQ1QsIElTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKworCQlpbml0RUNsYXNzKGNoYXJ0TGVnZW5kRUNsYXNzLCBDaGFydExlZ2VuZC5jbGFzcywgIkNoYXJ0TGVnZW5kIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydExlZ2VuZF9QbGFjZW1lbnQoKSwgdGhpcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtKCksICJwbGFjZW1lbnQiLCBudWxsLCAwLCAxLCBDaGFydExlZ2VuZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0TGVnZW5kX1RvZ2dsZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRvZ2dsZSIsIG51bGwsIDAsIDEsIENoYXJ0TGVnZW5kLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRMZWdlbmRfUmVwbG90KCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicmVwbG90IiwgbnVsbCwgMCwgMSwgQ2hhcnRMZWdlbmQuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRDaGFydExlZ2VuZF9Ub2dnbGVUeXBlKCksIHRoaXMuZ2V0VG9nZ2xlVHlwZUVudW0oKSwgInRvZ2dsZVR5cGUiLCBudWxsLCAwLCAxLCBDaGFydExlZ2VuZC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjaGFydEhpZ2hsaWdodGVyRUNsYXNzLCBDaGFydEhpZ2hsaWdodGVyLmNsYXNzLCAiQ2hhcnRIaWdobGlnaHRlciIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRIaWdobGlnaHRlcl9Mb2NhdGlvbigpLCB0aGlzLmdldFRvb2x0aXBMb2NhdGlvbkVudW0oKSwgImxvY2F0aW9uIiwgbnVsbCwgMCwgMSwgQ2hhcnRIaWdobGlnaHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0SGlnaGxpZ2h0ZXJfVG9vbHRpcEFsd2F5cygpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInRvb2x0aXBBbHdheXMiLCBudWxsLCAwLCAxLCBDaGFydEhpZ2hsaWdodGVyLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRIaWdobGlnaHRlcl9JbnNpZGVDaGFydCgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgImluc2lkZUNoYXJ0IiwgbnVsbCwgMCwgMSwgQ2hhcnRIaWdobGlnaHRlci5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhjaGFydEF4aXNFQ2xhc3MsIENoYXJ0QXhpcy5jbGFzcywgIkNoYXJ0QXhpcyIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Q2hhcnRBeGlzX0F4aXMoKSwgdGhlRGF0YW1hcnREU0xQYWNrYWdlLmdldERhdGFtYXJ0QXhpcygpLCBudWxsLCAiYXhpcyIsIG51bGwsIDAsIDEsIENoYXJ0QXhpcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Q2hhcnRBeGlzX1JlbmRlclR5cGUoKSwgdGhpcy5nZXRSZW5kZXJUeXBlRW51bSgpLCAicmVuZGVyVHlwZSIsIG51bGwsIDAsIDEsIENoYXJ0QXhpcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0QXhpc19TaG9ydExhYmVsKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAic2hvcnRMYWJlbCIsIG51bGwsIDAsIDEsIENoYXJ0QXhpcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0QXhpc19BbmdsZSgpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RUludCgpLCAiYW5nbGUiLCBudWxsLCAwLCAxLCBDaGFydEF4aXMuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3MoY2hhcnRSYW5nZUVsZW1lbnRFQ2xhc3MsIENoYXJ0UmFuZ2VFbGVtZW50LmNsYXNzLCAiQ2hhcnRSYW5nZUVsZW1lbnQiLCBJU19BQlNUUkFDVCwgSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCWluaXRFQ2xhc3MoY2hhcnRTZWdtZW50Q29sb3JFQ2xhc3MsIENoYXJ0U2VnbWVudENvbG9yLmNsYXNzLCAiQ2hhcnRTZWdtZW50Q29sb3IiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldENoYXJ0U2VnbWVudENvbG9yX1JnYigpLCB0aGVFY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicmdiIiwgbnVsbCwgMCwgMSwgQ2hhcnRTZWdtZW50Q29sb3IuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCWluaXRFRW51bShsZWdlbmRQbGFjZW1lbnRFbnVtRUVudW0sIExlZ2VuZFBsYWNlbWVudEVudW0uY2xhc3MsICJMZWdlbmRQbGFjZW1lbnRFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChsZWdlbmRQbGFjZW1lbnRFbnVtRUVudW0sIExlZ2VuZFBsYWNlbWVudEVudW0uSU5TSURFKTsKKwkJYWRkRUVudW1MaXRlcmFsKGxlZ2VuZFBsYWNlbWVudEVudW1FRW51bSwgTGVnZW5kUGxhY2VtZW50RW51bS5JTlNJREVfR1JJRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChsZWdlbmRQbGFjZW1lbnRFbnVtRUVudW0sIExlZ2VuZFBsYWNlbWVudEVudW0uT1VUU0lERSk7CisJCWFkZEVFbnVtTGl0ZXJhbChsZWdlbmRQbGFjZW1lbnRFbnVtRUVudW0sIExlZ2VuZFBsYWNlbWVudEVudW0uT1VUU0lERV9HUklEKTsKKworCQlpbml0RUVudW0odG9nZ2xlVHlwZUVudW1FRW51bSwgVG9nZ2xlVHlwZUVudW0uY2xhc3MsICJUb2dnbGVUeXBlRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwodG9nZ2xlVHlwZUVudW1FRW51bSwgVG9nZ2xlVHlwZUVudW0uTk9STUFMKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRvZ2dsZVR5cGVFbnVtRUVudW0sIFRvZ2dsZVR5cGVFbnVtLlNMT1cpOworCQlhZGRFRW51bUxpdGVyYWwodG9nZ2xlVHlwZUVudW1FRW51bSwgVG9nZ2xlVHlwZUVudW0uRkFTVCk7CisKKwkJaW5pdEVFbnVtKHRvb2x0aXBMb2NhdGlvbkVudW1FRW51bSwgVG9vbHRpcExvY2F0aW9uRW51bS5jbGFzcywgIlRvb2x0aXBMb2NhdGlvbkVudW0iKTsKKwkJYWRkRUVudW1MaXRlcmFsKHRvb2x0aXBMb2NhdGlvbkVudW1FRW51bSwgVG9vbHRpcExvY2F0aW9uRW51bS5OT1JUSCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0b29sdGlwTG9jYXRpb25FbnVtRUVudW0sIFRvb2x0aXBMb2NhdGlvbkVudW0uTk9SVEhfRUFTVCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0b29sdGlwTG9jYXRpb25FbnVtRUVudW0sIFRvb2x0aXBMb2NhdGlvbkVudW0uRUFTVCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0b29sdGlwTG9jYXRpb25FbnVtRUVudW0sIFRvb2x0aXBMb2NhdGlvbkVudW0uU09VVEhfRUFTVCk7CisJCWFkZEVFbnVtTGl0ZXJhbCh0b29sdGlwTG9jYXRpb25FbnVtRUVudW0sIFRvb2x0aXBMb2NhdGlvbkVudW0uU09VVEgpOworCQlhZGRFRW51bUxpdGVyYWwodG9vbHRpcExvY2F0aW9uRW51bUVFbnVtLCBUb29sdGlwTG9jYXRpb25FbnVtLlNPVVRIX1dFU1QpOworCQlhZGRFRW51bUxpdGVyYWwodG9vbHRpcExvY2F0aW9uRW51bUVFbnVtLCBUb29sdGlwTG9jYXRpb25FbnVtLldFU1QpOworCQlhZGRFRW51bUxpdGVyYWwodG9vbHRpcExvY2F0aW9uRW51bUVFbnVtLCBUb29sdGlwTG9jYXRpb25FbnVtLk5PUlRIX1dFU1QpOworCisJCWluaXRFRW51bShyZW5kZXJUeXBlRW51bUVFbnVtLCBSZW5kZXJUeXBlRW51bS5jbGFzcywgIlJlbmRlclR5cGVFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChyZW5kZXJUeXBlRW51bUVFbnVtLCBSZW5kZXJUeXBlRW51bS5DQVRFR09SWSk7CisJCWFkZEVFbnVtTGl0ZXJhbChyZW5kZXJUeXBlRW51bUVFbnVtLCBSZW5kZXJUeXBlRW51bS5MSU5FQVIpOworCQlhZGRFRW51bUxpdGVyYWwocmVuZGVyVHlwZUVudW1FRW51bSwgUmVuZGVyVHlwZUVudW0uREFURSk7CisJCWFkZEVFbnVtTGl0ZXJhbChyZW5kZXJUeXBlRW51bUVFbnVtLCBSZW5kZXJUeXBlRW51bS5MT0cpOworCQlhZGRFRW51bUxpdGVyYWwocmVuZGVyVHlwZUVudW1FRW51bSwgUmVuZGVyVHlwZUVudW0uUFlSQU1JRCk7CisKKwkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCWluaXRFRGF0YVR5cGUoaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlLCBJbnRlcm5hbEVPYmplY3QuY2xhc3MsICJJbnRlcm5hbEVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZQorCQljcmVhdGVFY29yZUFubm90YXRpb25zKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFY29yZUFubm90YXRpb25zKCkgeworCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiOwkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aGlzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAicm9vdFBhY2thZ2UiLCAiY2hhcnRkc2wiCisJCSAgIH0pOworCX0KKworfSAvL0NoYXJ0RFNMUGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnREYXRhbWFydEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnREYXRhbWFydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTQ3MDIxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydERhdGFtYXJ0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVmaW5pdGlvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IERhdGFtYXJ0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnREYXRhbWFydEltcGwjZ2V0RGF0YW1hcnRSZWYgPGVtPkRhdGFtYXJ0IFJlZjwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0RGF0YW1hcnRJbXBsI2dldEVsZW1lbnRzIDxlbT5FbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0RGF0YW1hcnRJbXBsIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ2hhcnREYXRhbWFydCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGF0YW1hcnRSZWYoKSA8ZW0+RGF0YW1hcnQgUmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREYXRhbWFydFJlZigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydFJlZjsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVsZW1lbnRzKCkgPGVtPkVsZW1lbnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVsZW1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Q2hhcnRFbGVtZW50PiBlbGVtZW50czsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydERhdGFtYXJ0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9EQVRBTUFSVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnREZWZpbml0aW9uIGdldERhdGFtYXJ0UmVmKCkgeworCQlpZiAoZGF0YW1hcnRSZWYgIT0gbnVsbCAmJiBkYXRhbWFydFJlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRGF0YW1hcnRSZWYgPSAoSW50ZXJuYWxFT2JqZWN0KWRhdGFtYXJ0UmVmOworCQkJZGF0YW1hcnRSZWYgPSAoRGF0YW1hcnREZWZpbml0aW9uKWVSZXNvbHZlUHJveHkob2xkRGF0YW1hcnRSZWYpOworCQkJaWYgKGRhdGFtYXJ0UmVmICE9IG9sZERhdGFtYXJ0UmVmKSB7CisJCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0RBVEFNQVJUX19EQVRBTUFSVF9SRUYsIG9sZERhdGFtYXJ0UmVmLCBkYXRhbWFydFJlZikpOworCQkJfQorCQl9CisJCXJldHVybiBkYXRhbWFydFJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRGF0YW1hcnREZWZpbml0aW9uIGJhc2ljR2V0RGF0YW1hcnRSZWYoKSB7CisJCXJldHVybiBkYXRhbWFydFJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREYXRhbWFydFJlZihEYXRhbWFydERlZmluaXRpb24gbmV3RGF0YW1hcnRSZWYpIHsKKwkJRGF0YW1hcnREZWZpbml0aW9uIG9sZERhdGFtYXJ0UmVmID0gZGF0YW1hcnRSZWY7CisJCWRhdGFtYXJ0UmVmID0gbmV3RGF0YW1hcnRSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVF9fREFUQU1BUlRfUkVGLCBvbGREYXRhbWFydFJlZiwgZGF0YW1hcnRSZWYpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8Q2hhcnRFbGVtZW50PiBnZXRFbGVtZW50cygpIHsKKwkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKKwkJCWVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PENoYXJ0RWxlbWVudD4oQ2hhcnRFbGVtZW50LmNsYXNzLCB0aGlzLCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfREFUQU1BUlRfX0VMRU1FTlRTKTsKKwkJfQorCQlyZXR1cm4gZWxlbWVudHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfREFUQU1BUlRfX0VMRU1FTlRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0RWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVF9fREFUQU1BUlRfUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0RGF0YW1hcnRSZWYoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXREYXRhbWFydFJlZigpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfREFUQU1BUlRfX0VMRU1FTlRTOgorCQkJCXJldHVybiBnZXRFbGVtZW50cygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVF9fREFUQU1BUlRfUkVGOgorCQkJCXNldERhdGFtYXJ0UmVmKChEYXRhbWFydERlZmluaXRpb24pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0RBVEFNQVJUX19FTEVNRU5UUzoKKwkJCQlnZXRFbGVtZW50cygpLmNsZWFyKCk7CisJCQkJZ2V0RWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIENoYXJ0RWxlbWVudD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVF9fREFUQU1BUlRfUkVGOgorCQkJCXNldERhdGFtYXJ0UmVmKChEYXRhbWFydERlZmluaXRpb24pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfREFUQU1BUlRfX0VMRU1FTlRTOgorCQkJCWdldEVsZW1lbnRzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0RBVEFNQVJUX19EQVRBTUFSVF9SRUY6CisJCQkJcmV0dXJuIGRhdGFtYXJ0UmVmICE9IG51bGw7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVF9fRUxFTUVOVFM6CisJCQkJcmV0dXJuIGVsZW1lbnRzICE9IG51bGwgJiYgIWVsZW1lbnRzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vQ2hhcnREYXRhbWFydEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnREb251dEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnREb251dEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTZjNDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydERvbnV0SW1wbC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERvbnV0OworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgRG9udXQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydERvbnV0SW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0RG9udXQgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydERvbnV0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9ET05VVDsKKwl9CisKK30gLy9DaGFydERvbnV0SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEdhdWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEdhdWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0M2EzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0R2F1Z2VJbXBsLmphdmEKQEAgLTAsMCArMSw1MDIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SW50ZXJ2YWw7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBHYXVnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0R2F1Z2VJbXBsI2lzTGFiZWxlZCA8ZW0+TGFiZWxlZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0R2F1Z2VJbXBsI2dldExhYmVsVmFsdWUgPGVtPkxhYmVsIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRHYXVnZUltcGwjaXNIYXNUaWNrcyA8ZW0+SGFzIFRpY2tzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRHYXVnZUltcGwjZ2V0TWluVmFsdWUgPGVtPk1pbiBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0R2F1Z2VJbXBsI2dldE1heFZhbHVlIDxlbT5NYXggVmFsdWU8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEdhdWdlSW1wbCNpc0hhc0ludGVydmFscyA8ZW0+SGFzIEludGVydmFsczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0R2F1Z2VJbXBsI2dldEludGVydmFscyA8ZW0+SW50ZXJ2YWxzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRHYXVnZUltcGwgZXh0ZW5kcyBDaGFydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBDaGFydEdhdWdlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNMYWJlbGVkKCkgPGVtPkxhYmVsZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzTGFiZWxlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIExBQkVMRURfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzTGFiZWxlZCgpIDxlbT5MYWJlbGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0xhYmVsZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGxhYmVsZWQgPSBMQUJFTEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsVmFsdWUoKSA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldExhYmVsVmFsdWUoKSA8ZW0+TGFiZWwgVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExhYmVsVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbGFiZWxWYWx1ZSA9IExBQkVMX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSGFzVGlja3MoKSA8ZW0+SGFzIFRpY2tzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0hhc1RpY2tzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gSEFTX1RJQ0tTX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc1RpY2tzKCkgPGVtPkhhcyBUaWNrczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNIYXNUaWNrcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzVGlja3MgPSBIQVNfVElDS1NfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWluVmFsdWUoKSA8ZW0+TWluIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNaW5WYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUlOX1ZBTFVFX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1pblZhbHVlKCkgPGVtPk1pbiBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWluVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgbWluVmFsdWUgPSBNSU5fVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TWF4VmFsdWUoKSA8ZW0+TWF4IFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRNYXhWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBTFVFX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE1heFZhbHVlKCkgPGVtPk1heCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TWF4VmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBpbnQgbWF4VmFsdWUgPSBNQVhfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNIYXNJbnRlcnZhbHMoKSA8ZW0+SGFzIEludGVydmFsczwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNIYXNJbnRlcnZhbHMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfSU5URVJWQUxTX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0hhc0ludGVydmFscygpIDxlbT5IYXMgSW50ZXJ2YWxzPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0hhc0ludGVydmFscygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gaGFzSW50ZXJ2YWxzID0gSEFTX0lOVEVSVkFMU19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEludGVydmFscygpIDxlbT5JbnRlcnZhbHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0SW50ZXJ2YWxzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Q2hhcnRJbnRlcnZhbD4gaW50ZXJ2YWxzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0R2F1Z2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0dBVUdFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzTGFiZWxlZCgpIHsKKwkJcmV0dXJuIGxhYmVsZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TGFiZWxlZChib29sZWFuIG5ld0xhYmVsZWQpIHsKKwkJYm9vbGVhbiBvbGRMYWJlbGVkID0gbGFiZWxlZDsKKwkJbGFiZWxlZCA9IG5ld0xhYmVsZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTEFCRUxFRCwgb2xkTGFiZWxlZCwgbGFiZWxlZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWxWYWx1ZSgpIHsKKwkJcmV0dXJuIGxhYmVsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TGFiZWxWYWx1ZShTdHJpbmcgbmV3TGFiZWxWYWx1ZSkgeworCQlTdHJpbmcgb2xkTGFiZWxWYWx1ZSA9IGxhYmVsVmFsdWU7CisJCWxhYmVsVmFsdWUgPSBuZXdMYWJlbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0xBQkVMX1ZBTFVFLCBvbGRMYWJlbFZhbHVlLCBsYWJlbFZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNIYXNUaWNrcygpIHsKKwkJcmV0dXJuIGhhc1RpY2tzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEhhc1RpY2tzKGJvb2xlYW4gbmV3SGFzVGlja3MpIHsKKwkJYm9vbGVhbiBvbGRIYXNUaWNrcyA9IGhhc1RpY2tzOworCQloYXNUaWNrcyA9IG5ld0hhc1RpY2tzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0hBU19USUNLUywgb2xkSGFzVGlja3MsIGhhc1RpY2tzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRNaW5WYWx1ZSgpIHsKKwkJcmV0dXJuIG1pblZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldE1pblZhbHVlKGludCBuZXdNaW5WYWx1ZSkgeworCQlpbnQgb2xkTWluVmFsdWUgPSBtaW5WYWx1ZTsKKwkJbWluVmFsdWUgPSBuZXdNaW5WYWx1ZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19NSU5fVkFMVUUsIG9sZE1pblZhbHVlLCBtaW5WYWx1ZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TWF4VmFsdWUoKSB7CisJCXJldHVybiBtYXhWYWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRNYXhWYWx1ZShpbnQgbmV3TWF4VmFsdWUpIHsKKwkJaW50IG9sZE1heFZhbHVlID0gbWF4VmFsdWU7CisJCW1heFZhbHVlID0gbmV3TWF4VmFsdWU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTUFYX1ZBTFVFLCBvbGRNYXhWYWx1ZSwgbWF4VmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0hhc0ludGVydmFscygpIHsKKwkJcmV0dXJuIGhhc0ludGVydmFsczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRIYXNJbnRlcnZhbHMoYm9vbGVhbiBuZXdIYXNJbnRlcnZhbHMpIHsKKwkJYm9vbGVhbiBvbGRIYXNJbnRlcnZhbHMgPSBoYXNJbnRlcnZhbHM7CisJCWhhc0ludGVydmFscyA9IG5ld0hhc0ludGVydmFsczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfSU5URVJWQUxTLCBvbGRIYXNJbnRlcnZhbHMsIGhhc0ludGVydmFscykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxDaGFydEludGVydmFsPiBnZXRJbnRlcnZhbHMoKSB7CisJCWlmIChpbnRlcnZhbHMgPT0gbnVsbCkgeworCQkJaW50ZXJ2YWxzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PENoYXJ0SW50ZXJ2YWw+KENoYXJ0SW50ZXJ2YWwuY2xhc3MsIHRoaXMsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fSU5URVJWQUxTKTsKKwkJfQorCQlyZXR1cm4gaW50ZXJ2YWxzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19JTlRFUlZBTFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRJbnRlcnZhbHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTEFCRUxFRDoKKwkJCQlyZXR1cm4gaXNMYWJlbGVkKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTEFCRUxfVkFMVUU6CisJCQkJcmV0dXJuIGdldExhYmVsVmFsdWUoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfVElDS1M6CisJCQkJcmV0dXJuIGlzSGFzVGlja3MoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19NSU5fVkFMVUU6CisJCQkJcmV0dXJuIGdldE1pblZhbHVlKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTUFYX1ZBTFVFOgorCQkJCXJldHVybiBnZXRNYXhWYWx1ZSgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0hBU19JTlRFUlZBTFM6CisJCQkJcmV0dXJuIGlzSGFzSW50ZXJ2YWxzKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fSU5URVJWQUxTOgorCQkJCXJldHVybiBnZXRJbnRlcnZhbHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0xBQkVMRUQ6CisJCQkJc2V0TGFiZWxlZCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0xBQkVMX1ZBTFVFOgorCQkJCXNldExhYmVsVmFsdWUoKFN0cmluZyluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0hBU19USUNLUzoKKwkJCQlzZXRIYXNUaWNrcygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX01JTl9WQUxVRToKKwkJCQlzZXRNaW5WYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX01BWF9WQUxVRToKKwkJCQlzZXRNYXhWYWx1ZSgoSW50ZWdlciluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0hBU19JTlRFUlZBTFM6CisJCQkJc2V0SGFzSW50ZXJ2YWxzKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fSU5URVJWQUxTOgorCQkJCWdldEludGVydmFscygpLmNsZWFyKCk7CisJCQkJZ2V0SW50ZXJ2YWxzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDaGFydEludGVydmFsPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19MQUJFTEVEOgorCQkJCXNldExhYmVsZWQoTEFCRUxFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0xBQkVMX1ZBTFVFOgorCQkJCXNldExhYmVsVmFsdWUoTEFCRUxfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfVElDS1M6CisJCQkJc2V0SGFzVGlja3MoSEFTX1RJQ0tTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTUlOX1ZBTFVFOgorCQkJCXNldE1pblZhbHVlKE1JTl9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX01BWF9WQUxVRToKKwkJCQlzZXRNYXhWYWx1ZShNQVhfVkFMVUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfSU5URVJWQUxTOgorCQkJCXNldEhhc0ludGVydmFscyhIQVNfSU5URVJWQUxTX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fSU5URVJWQUxTOgorCQkJCWdldEludGVydmFscygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9HQVVHRV9fTEFCRUxFRDoKKwkJCQlyZXR1cm4gbGFiZWxlZCAhPSBMQUJFTEVEX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0VfX0xBQkVMX1ZBTFVFOgorCQkJCXJldHVybiBMQUJFTF9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gbGFiZWxWYWx1ZSAhPSBudWxsIDogIUxBQkVMX1ZBTFVFX0VERUZBVUxULmVxdWFscyhsYWJlbFZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfVElDS1M6CisJCQkJcmV0dXJuIGhhc1RpY2tzICE9IEhBU19USUNLU19FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19NSU5fVkFMVUU6CisJCQkJcmV0dXJuIG1pblZhbHVlICE9IE1JTl9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19NQVhfVkFMVUU6CisJCQkJcmV0dXJuIG1heFZhbHVlICE9IE1BWF9WQUxVRV9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19IQVNfSU5URVJWQUxTOgorCQkJCXJldHVybiBoYXNJbnRlcnZhbHMgIT0gSEFTX0lOVEVSVkFMU19FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFX19JTlRFUlZBTFM6CisJCQkJcmV0dXJuIGludGVydmFscyAhPSBudWxsICYmICFpbnRlcnZhbHMuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAobGFiZWxlZDogIik7CisJCXJlc3VsdC5hcHBlbmQobGFiZWxlZCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgbGFiZWxWYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobGFiZWxWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGFzVGlja3M6ICIpOworCQlyZXN1bHQuYXBwZW5kKGhhc1RpY2tzKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBtaW5WYWx1ZTogIik7CisJCXJlc3VsdC5hcHBlbmQobWluVmFsdWUpOworCQlyZXN1bHQuYXBwZW5kKCIsIG1heFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChtYXhWYWx1ZSk7CisJCXJlc3VsdC5hcHBlbmQoIiwgaGFzSW50ZXJ2YWxzOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChoYXNJbnRlcnZhbHMpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DaGFydEdhdWdlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEhpZ2hsaWdodGVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEhpZ2hsaWdodGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOTViOGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0SGlnaGxpZ2h0ZXJJbXBsLmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub29sdGlwTG9jYXRpb25FbnVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgSGlnaGxpZ2h0ZXI8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEhpZ2hsaWdodGVySW1wbCNnZXRMb2NhdGlvbiA8ZW0+TG9jYXRpb248L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydEhpZ2hsaWdodGVySW1wbCNpc1Rvb2x0aXBBbHdheXMgPGVtPlRvb2x0aXAgQWx3YXlzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRIaWdobGlnaHRlckltcGwjaXNJbnNpZGVDaGFydCA8ZW0+SW5zaWRlIENoYXJ0PC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRIaWdobGlnaHRlckltcGwgZXh0ZW5kcyBDaGFydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBDaGFydEhpZ2hsaWdodGVyIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRvb2x0aXBMb2NhdGlvbkVudW0gTE9DQVRJT05fRURFRkFVTFQgPSBUb29sdGlwTG9jYXRpb25FbnVtLk5PUlRIOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0TG9jYXRpb24oKSA8ZW0+TG9jYXRpb248L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldExvY2F0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgVG9vbHRpcExvY2F0aW9uRW51bSBsb2NhdGlvbiA9IExPQ0FUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVG9vbHRpcEFsd2F5cygpIDxlbT5Ub29sdGlwIEFsd2F5czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNUb29sdGlwQWx3YXlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gVE9PTFRJUF9BTFdBWVNfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVG9vbHRpcEFsd2F5cygpIDxlbT5Ub29sdGlwIEFsd2F5czwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNUb29sdGlwQWx3YXlzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0b29sdGlwQWx3YXlzID0gVE9PTFRJUF9BTFdBWVNfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNJbnNpZGVDaGFydCgpIDxlbT5JbnNpZGUgQ2hhcnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzSW5zaWRlQ2hhcnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBJTlNJREVfQ0hBUlRfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzSW5zaWRlQ2hhcnQoKSA8ZW0+SW5zaWRlIENoYXJ0PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0luc2lkZUNoYXJ0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNpZGVDaGFydCA9IElOU0lERV9DSEFSVF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydEhpZ2hsaWdodGVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9ISUdITElHSFRFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVG9vbHRpcExvY2F0aW9uRW51bSBnZXRMb2NhdGlvbigpIHsKKwkJcmV0dXJuIGxvY2F0aW9uOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFRvb2x0aXBMb2NhdGlvbkVudW0gbmV3TG9jYXRpb24pIHsKKwkJVG9vbHRpcExvY2F0aW9uRW51bSBvbGRMb2NhdGlvbiA9IGxvY2F0aW9uOworCQlsb2NhdGlvbiA9IG5ld0xvY2F0aW9uID09IG51bGwgPyBMT0NBVElPTl9FREVGQVVMVCA6IG5ld0xvY2F0aW9uOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX0xPQ0FUSU9OLCBvbGRMb2NhdGlvbiwgbG9jYXRpb24pKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1Rvb2x0aXBBbHdheXMoKSB7CisJCXJldHVybiB0b29sdGlwQWx3YXlzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFRvb2x0aXBBbHdheXMoYm9vbGVhbiBuZXdUb29sdGlwQWx3YXlzKSB7CisJCWJvb2xlYW4gb2xkVG9vbHRpcEFsd2F5cyA9IHRvb2x0aXBBbHdheXM7CisJCXRvb2x0aXBBbHdheXMgPSBuZXdUb29sdGlwQWx3YXlzOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX1RPT0xUSVBfQUxXQVlTLCBvbGRUb29sdGlwQWx3YXlzLCB0b29sdGlwQWx3YXlzKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnNpZGVDaGFydCgpIHsKKwkJcmV0dXJuIGluc2lkZUNoYXJ0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEluc2lkZUNoYXJ0KGJvb2xlYW4gbmV3SW5zaWRlQ2hhcnQpIHsKKwkJYm9vbGVhbiBvbGRJbnNpZGVDaGFydCA9IGluc2lkZUNoYXJ0OworCQlpbnNpZGVDaGFydCA9IG5ld0luc2lkZUNoYXJ0OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX0lOU0lERV9DSEFSVCwgb2xkSW5zaWRlQ2hhcnQsIGluc2lkZUNoYXJ0KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX0xPQ0FUSU9OOgorCQkJCXJldHVybiBnZXRMb2NhdGlvbigpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX1RPT0xUSVBfQUxXQVlTOgorCQkJCXJldHVybiBpc1Rvb2x0aXBBbHdheXMoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSX19JTlNJREVfQ0hBUlQ6CisJCQkJcmV0dXJuIGlzSW5zaWRlQ2hhcnQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX0xPQ0FUSU9OOgorCQkJCXNldExvY2F0aW9uKChUb29sdGlwTG9jYXRpb25FbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ISUdITElHSFRFUl9fVE9PTFRJUF9BTFdBWVM6CisJCQkJc2V0VG9vbHRpcEFsd2F5cygoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX0lOU0lERV9DSEFSVDoKKwkJCQlzZXRJbnNpZGVDaGFydCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSX19MT0NBVElPTjoKKwkJCQlzZXRMb2NhdGlvbihMT0NBVElPTl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfSElHSExJR0hURVJfX1RPT0xUSVBfQUxXQVlTOgorCQkJCXNldFRvb2x0aXBBbHdheXMoVE9PTFRJUF9BTFdBWVNfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSX19JTlNJREVfQ0hBUlQ6CisJCQkJc2V0SW5zaWRlQ2hhcnQoSU5TSURFX0NIQVJUX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSX19MT0NBVElPTjoKKwkJCQlyZXR1cm4gbG9jYXRpb24gIT0gTE9DQVRJT05fRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ISUdITElHSFRFUl9fVE9PTFRJUF9BTFdBWVM6CisJCQkJcmV0dXJuIHRvb2x0aXBBbHdheXMgIT0gVE9PTFRJUF9BTFdBWVNfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ISUdITElHSFRFUl9fSU5TSURFX0NIQVJUOgorCQkJCXJldHVybiBpbnNpZGVDaGFydCAhPSBJTlNJREVfQ0hBUlRfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChsb2NhdGlvbjogIik7CisJCXJlc3VsdC5hcHBlbmQobG9jYXRpb24pOworCQlyZXN1bHQuYXBwZW5kKCIsIHRvb2x0aXBBbHdheXM6ICIpOworCQlyZXN1bHQuYXBwZW5kKHRvb2x0aXBBbHdheXMpOworCQlyZXN1bHQuYXBwZW5kKCIsIGluc2lkZUNoYXJ0OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChpbnNpZGVDaGFydCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NoYXJ0SGlnaGxpZ2h0ZXJJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDkxZmZhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydEltcGwuamF2YQpAQCAtMCwwICsxLDQ4MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsI2lzRGVzY3JpcHRpb24gPGVtPkRlc2NyaXB0aW9uPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsI2dldERlc2NyaXB0aW9uVmFsdWUgPGVtPkRlc2NyaXB0aW9uIFZhbHVlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsI2lzUG9sbGluZyA8ZW0+UG9sbGluZzwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0SW1wbCNnZXRQb2xsaW5nVGltZSA8ZW0+UG9sbGluZyBUaW1lPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsI2dldENoYXJ0dHlwZSA8ZW0+Q2hhcnR0eXBlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRJbXBsI2dldFNvdXJjZSA8ZW0+U291cmNlPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRJbXBsIGV4dGVuZHMgQ2hhcnRCYXNlSW1wbCBpbXBsZW1lbnRzIENoYXJ0IHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNEZXNjcmlwdGlvbigpIDxlbT5EZXNjcmlwdGlvbjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNEZXNjcmlwdGlvbigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIERFU0NSSVBUSU9OX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0Rlc2NyaXB0aW9uKCkgPGVtPkRlc2NyaXB0aW9uPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0Rlc2NyaXB0aW9uKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBkZXNjcmlwdGlvbiA9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVmFsdWUoKSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUID0gbnVsbDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlc2NyaXB0aW9uVmFsdWUoKSA8ZW0+RGVzY3JpcHRpb24gVmFsdWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldERlc2NyaXB0aW9uVmFsdWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZGVzY3JpcHRpb25WYWx1ZSA9IERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUG9sbGluZygpIDxlbT5Qb2xsaW5nPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1BvbGxpbmcoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBQT0xMSU5HX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1BvbGxpbmcoKSA8ZW0+UG9sbGluZzwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNQb2xsaW5nKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBwb2xsaW5nID0gUE9MTElOR19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQb2xsaW5nVGltZSgpIDxlbT5Qb2xsaW5nIFRpbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBvbGxpbmdUaW1lKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQT0xMSU5HX1RJTUVfRURFRkFVTFQgPSAwOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UG9sbGluZ1RpbWUoKSA8ZW0+UG9sbGluZyBUaW1lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQb2xsaW5nVGltZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGludCBwb2xsaW5nVGltZSA9IFBPTExJTkdfVElNRV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENoYXJ0dHlwZSgpIDxlbT5DaGFydHR5cGU8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENoYXJ0dHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0T3B0aW9uIGNoYXJ0dHlwZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFNvdXJjZSgpIDxlbT5Tb3VyY2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFNvdXJjZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0RGF0YW1hcnQgc291cmNlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0Rlc2NyaXB0aW9uKCkgeworCQlyZXR1cm4gZGVzY3JpcHRpb247CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oYm9vbGVhbiBuZXdEZXNjcmlwdGlvbikgeworCQlib29sZWFuIG9sZERlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisJCWRlc2NyaXB0aW9uID0gbmV3RGVzY3JpcHRpb247CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fREVTQ1JJUFRJT04sIG9sZERlc2NyaXB0aW9uLCBkZXNjcmlwdGlvbikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25WYWx1ZSgpIHsKKwkJcmV0dXJuIGRlc2NyaXB0aW9uVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25WYWx1ZShTdHJpbmcgbmV3RGVzY3JpcHRpb25WYWx1ZSkgeworCQlTdHJpbmcgb2xkRGVzY3JpcHRpb25WYWx1ZSA9IGRlc2NyaXB0aW9uVmFsdWU7CisJCWRlc2NyaXB0aW9uVmFsdWUgPSBuZXdEZXNjcmlwdGlvblZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX0RFU0NSSVBUSU9OX1ZBTFVFLCBvbGREZXNjcmlwdGlvblZhbHVlLCBkZXNjcmlwdGlvblZhbHVlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNQb2xsaW5nKCkgeworCQlyZXR1cm4gcG9sbGluZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQb2xsaW5nKGJvb2xlYW4gbmV3UG9sbGluZykgeworCQlib29sZWFuIG9sZFBvbGxpbmcgPSBwb2xsaW5nOworCQlwb2xsaW5nID0gbmV3UG9sbGluZzsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HLCBvbGRQb2xsaW5nLCBwb2xsaW5nKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRQb2xsaW5nVGltZSgpIHsKKwkJcmV0dXJuIHBvbGxpbmdUaW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFBvbGxpbmdUaW1lKGludCBuZXdQb2xsaW5nVGltZSkgeworCQlpbnQgb2xkUG9sbGluZ1RpbWUgPSBwb2xsaW5nVGltZTsKKwkJcG9sbGluZ1RpbWUgPSBuZXdQb2xsaW5nVGltZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HX1RJTUUsIG9sZFBvbGxpbmdUaW1lLCBwb2xsaW5nVGltZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydE9wdGlvbiBnZXRDaGFydHR5cGUoKSB7CisJCXJldHVybiBjaGFydHR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q2hhcnR0eXBlKENoYXJ0T3B0aW9uIG5ld0NoYXJ0dHlwZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlDaGFydE9wdGlvbiBvbGRDaGFydHR5cGUgPSBjaGFydHR5cGU7CisJCWNoYXJ0dHlwZSA9IG5ld0NoYXJ0dHlwZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19DSEFSVFRZUEUsIG9sZENoYXJ0dHlwZSwgbmV3Q2hhcnR0eXBlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRDaGFydHR5cGUoQ2hhcnRPcHRpb24gbmV3Q2hhcnR0eXBlKSB7CisJCWlmIChuZXdDaGFydHR5cGUgIT0gY2hhcnR0eXBlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChjaGFydHR5cGUgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpY2hhcnR0eXBlKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19DSEFSVFRZUEUsIG51bGwsIG1zZ3MpOworCQkJaWYgKG5ld0NoYXJ0dHlwZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdDaGFydHR5cGUpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX0NIQVJUVFlQRSwgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRDaGFydHR5cGUobmV3Q2hhcnR0eXBlLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fQ0hBUlRUWVBFLCBuZXdDaGFydHR5cGUsIG5ld0NoYXJ0dHlwZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydERhdGFtYXJ0IGdldFNvdXJjZSgpIHsKKwkJcmV0dXJuIHNvdXJjZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRTb3VyY2UoQ2hhcnREYXRhbWFydCBuZXdTb3VyY2UsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQ2hhcnREYXRhbWFydCBvbGRTb3VyY2UgPSBzb3VyY2U7CisJCXNvdXJjZSA9IG5ld1NvdXJjZTsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19TT1VSQ0UsIG9sZFNvdXJjZSwgbmV3U291cmNlKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoQ2hhcnREYXRhbWFydCBuZXdTb3VyY2UpIHsKKwkJaWYgKG5ld1NvdXJjZSAhPSBzb3VyY2UpIHsKKwkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOworCQkJaWYgKHNvdXJjZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClzb3VyY2UpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX1NPVVJDRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3U291cmNlICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld1NvdXJjZSkuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fU09VUkNFLCBudWxsLCBtc2dzKTsKKwkJCW1zZ3MgPSBiYXNpY1NldFNvdXJjZShuZXdTb3VyY2UsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19TT1VSQ0UsIG5ld1NvdXJjZSwgbmV3U291cmNlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX0NIQVJUVFlQRToKKwkJCQlyZXR1cm4gYmFzaWNTZXRDaGFydHR5cGUobnVsbCwgbXNncyk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fU09VUkNFOgorCQkJCXJldHVybiBiYXNpY1NldFNvdXJjZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX0RFU0NSSVBUSU9OOgorCQkJCXJldHVybiBpc0Rlc2NyaXB0aW9uKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fREVTQ1JJUFRJT05fVkFMVUU6CisJCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uVmFsdWUoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HOgorCQkJCXJldHVybiBpc1BvbGxpbmcoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HX1RJTUU6CisJCQkJcmV0dXJuIGdldFBvbGxpbmdUaW1lKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fQ0hBUlRUWVBFOgorCQkJCXJldHVybiBnZXRDaGFydHR5cGUoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19TT1VSQ0U6CisJCQkJcmV0dXJuIGdldFNvdXJjZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlzZXREZXNjcmlwdGlvblZhbHVlKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HOgorCQkJCXNldFBvbGxpbmcoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HX1RJTUU6CisJCQkJc2V0UG9sbGluZ1RpbWUoKEludGVnZXIpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19DSEFSVFRZUEU6CisJCQkJc2V0Q2hhcnR0eXBlKChDaGFydE9wdGlvbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX1NPVVJDRToKKwkJCQlzZXRTb3VyY2UoKENoYXJ0RGF0YW1hcnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fREVTQ1JJUFRJT046CisJCQkJc2V0RGVzY3JpcHRpb24oREVTQ1JJUFRJT05fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19ERVNDUklQVElPTl9WQUxVRToKKwkJCQlzZXREZXNjcmlwdGlvblZhbHVlKERFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fUE9MTElORzoKKwkJCQlzZXRQb2xsaW5nKFBPTExJTkdfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HX1RJTUU6CisJCQkJc2V0UG9sbGluZ1RpbWUoUE9MTElOR19USU1FX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fQ0hBUlRUWVBFOgorCQkJCXNldENoYXJ0dHlwZSgoQ2hhcnRPcHRpb24pbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX1NPVVJDRToKKwkJCQlzZXRTb3VyY2UoKENoYXJ0RGF0YW1hcnQpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fREVTQ1JJUFRJT046CisJCQkJcmV0dXJuIGRlc2NyaXB0aW9uICE9IERFU0NSSVBUSU9OX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfX0RFU0NSSVBUSU9OX1ZBTFVFOgorCQkJCXJldHVybiBERVNDUklQVElPTl9WQUxVRV9FREVGQVVMVCA9PSBudWxsID8gZGVzY3JpcHRpb25WYWx1ZSAhPSBudWxsIDogIURFU0NSSVBUSU9OX1ZBTFVFX0VERUZBVUxULmVxdWFscyhkZXNjcmlwdGlvblZhbHVlKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19QT0xMSU5HOgorCQkJCXJldHVybiBwb2xsaW5nICE9IFBPTExJTkdfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fUE9MTElOR19USU1FOgorCQkJCXJldHVybiBwb2xsaW5nVGltZSAhPSBQT0xMSU5HX1RJTUVfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9fQ0hBUlRUWVBFOgorCQkJCXJldHVybiBjaGFydHR5cGUgIT0gbnVsbDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX19TT1VSQ0U6CisJCQkJcmV0dXJuIHNvdXJjZSAhPSBudWxsOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoZGVzY3JpcHRpb246ICIpOworCQlyZXN1bHQuYXBwZW5kKGRlc2NyaXB0aW9uKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvblZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChkZXNjcmlwdGlvblZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwb2xsaW5nOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwb2xsaW5nKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBwb2xsaW5nVGltZTogIik7CisJCXJlc3VsdC5hcHBlbmQocG9sbGluZ1RpbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DaGFydEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TGF6eVJlc29sdmVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0NzRkZDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TGF6eVJlc29sdmVySW1wbC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5hcGkuRWNvcmVVdGlsMzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMYXp5UmVzb2x2ZXI7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5DaGFydCBMYXp5IFJlc29sdmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIENoYXJ0TGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0xBWllfUkVTT0xWRVI7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVPYmplY3QgZVJlc29sdmVQcm94eShmaW5hbCBJbnRlcm5hbEVPYmplY3QgcHJveHkpIHsKKwkJUmVzb3VyY2UgX2VSZXNvdXJjZSA9IHRoaXMuZVJlc291cmNlKCk7CisJCVJlc291cmNlU2V0IF9yZXNvdXJjZVNldCA9IF9lUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKwkJcmV0dXJuIEVjb3JlVXRpbDMucmVzb2x2ZShwcm94eSwgX3Jlc291cmNlU2V0KTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVJbnZva2UoaW50IG9wZXJhdGlvbklELCBFTGlzdDw/PiBhcmd1bWVudHMpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKwkJc3dpdGNoIChvcGVyYXRpb25JRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q6CisJCQkJcmV0dXJuIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClhcmd1bWVudHMuZ2V0KDApKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludm9rZShvcGVyYXRpb25JRCwgYXJndW1lbnRzKTsKKwl9CisKK30gLy9DaGFydExhenlSZXNvbHZlckltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRMZWdlbmRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TGVnZW5kSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDg2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TGVnZW5kSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzM3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkxlZ2VuZFBsYWNlbWVudEVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IExlZ2VuZDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGVnZW5kSW1wbCNnZXRQbGFjZW1lbnQgPGVtPlBsYWNlbWVudDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGVnZW5kSW1wbCNpc1RvZ2dsZSA8ZW0+VG9nZ2xlPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMZWdlbmRJbXBsI2lzUmVwbG90IDxlbT5SZXBsb3Q8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExlZ2VuZEltcGwjZ2V0VG9nZ2xlVHlwZSA8ZW0+VG9nZ2xlIFR5cGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydExlZ2VuZEltcGwgZXh0ZW5kcyBDaGFydExhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBDaGFydExlZ2VuZCB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFBsYWNlbWVudCgpIDxlbT5QbGFjZW1lbnQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBsYWNlbWVudCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBMZWdlbmRQbGFjZW1lbnRFbnVtIFBMQUNFTUVOVF9FREVGQVVMVCA9IExlZ2VuZFBsYWNlbWVudEVudW0uSU5TSURFOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGxhY2VtZW50KCkgPGVtPlBsYWNlbWVudDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGxhY2VtZW50KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTGVnZW5kUGxhY2VtZW50RW51bSBwbGFjZW1lbnQgPSBQTEFDRU1FTlRfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUb2dnbGUoKSA8ZW0+VG9nZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RvZ2dsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIFRPR0dMRV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUb2dnbGUoKSA8ZW0+VG9nZ2xlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RvZ2dsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdG9nZ2xlID0gVE9HR0xFX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVwbG90KCkgPGVtPlJlcGxvdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZXBsb3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVBMT1RfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUmVwbG90KCkgPGVtPlJlcGxvdDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNSZXBsb3QoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIHJlcGxvdCA9IFJFUExPVF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRUb2dnbGVUeXBlKCkgPGVtPlRvZ2dsZSBUeXBlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRUb2dnbGVUeXBlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRvZ2dsZVR5cGVFbnVtIFRPR0dMRV9UWVBFX0VERUZBVUxUID0gVG9nZ2xlVHlwZUVudW0uTk9STUFMOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VG9nZ2xlVHlwZSgpIDxlbT5Ub2dnbGUgVHlwZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0VG9nZ2xlVHlwZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFRvZ2dsZVR5cGVFbnVtIHRvZ2dsZVR5cGUgPSBUT0dHTEVfVFlQRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydExlZ2VuZEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfTEVHRU5EOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMZWdlbmRQbGFjZW1lbnRFbnVtIGdldFBsYWNlbWVudCgpIHsKKwkJcmV0dXJuIHBsYWNlbWVudDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQbGFjZW1lbnQoTGVnZW5kUGxhY2VtZW50RW51bSBuZXdQbGFjZW1lbnQpIHsKKwkJTGVnZW5kUGxhY2VtZW50RW51bSBvbGRQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7CisJCXBsYWNlbWVudCA9IG5ld1BsYWNlbWVudCA9PSBudWxsID8gUExBQ0VNRU5UX0VERUZBVUxUIDogbmV3UGxhY2VtZW50OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19QTEFDRU1FTlQsIG9sZFBsYWNlbWVudCwgcGxhY2VtZW50KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUb2dnbGUoKSB7CisJCXJldHVybiB0b2dnbGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VG9nZ2xlKGJvb2xlYW4gbmV3VG9nZ2xlKSB7CisJCWJvb2xlYW4gb2xkVG9nZ2xlID0gdG9nZ2xlOworCQl0b2dnbGUgPSBuZXdUb2dnbGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1RPR0dMRSwgb2xkVG9nZ2xlLCB0b2dnbGUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc1JlcGxvdCgpIHsKKwkJcmV0dXJuIHJlcGxvdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZXBsb3QoYm9vbGVhbiBuZXdSZXBsb3QpIHsKKwkJYm9vbGVhbiBvbGRSZXBsb3QgPSByZXBsb3Q7CisJCXJlcGxvdCA9IG5ld1JlcGxvdDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fUkVQTE9ULCBvbGRSZXBsb3QsIHJlcGxvdCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUb2dnbGVUeXBlRW51bSBnZXRUb2dnbGVUeXBlKCkgeworCQlyZXR1cm4gdG9nZ2xlVHlwZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb2dnbGVUeXBlKFRvZ2dsZVR5cGVFbnVtIG5ld1RvZ2dsZVR5cGUpIHsKKwkJVG9nZ2xlVHlwZUVudW0gb2xkVG9nZ2xlVHlwZSA9IHRvZ2dsZVR5cGU7CisJCXRvZ2dsZVR5cGUgPSBuZXdUb2dnbGVUeXBlID09IG51bGwgPyBUT0dHTEVfVFlQRV9FREVGQVVMVCA6IG5ld1RvZ2dsZVR5cGU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1RPR0dMRV9UWVBFLCBvbGRUb2dnbGVUeXBlLCB0b2dnbGVUeXBlKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19QTEFDRU1FTlQ6CisJCQkJcmV0dXJuIGdldFBsYWNlbWVudCgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19UT0dHTEU6CisJCQkJcmV0dXJuIGlzVG9nZ2xlKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1JFUExPVDoKKwkJCQlyZXR1cm4gaXNSZXBsb3QoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fVE9HR0xFX1RZUEU6CisJCQkJcmV0dXJuIGdldFRvZ2dsZVR5cGUoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19QTEFDRU1FTlQ6CisJCQkJc2V0UGxhY2VtZW50KChMZWdlbmRQbGFjZW1lbnRFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1RPR0dMRToKKwkJCQlzZXRUb2dnbGUoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fUkVQTE9UOgorCQkJCXNldFJlcGxvdCgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19UT0dHTEVfVFlQRToKKwkJCQlzZXRUb2dnbGVUeXBlKChUb2dnbGVUeXBlRW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fUExBQ0VNRU5UOgorCQkJCXNldFBsYWNlbWVudChQTEFDRU1FTlRfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fVE9HR0xFOgorCQkJCXNldFRvZ2dsZShUT0dHTEVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fUkVQTE9UOgorCQkJCXNldFJlcGxvdChSRVBMT1RfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fVE9HR0xFX1RZUEU6CisJCQkJc2V0VG9nZ2xlVHlwZShUT0dHTEVfVFlQRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1BMQUNFTUVOVDoKKwkJCQlyZXR1cm4gcGxhY2VtZW50ICE9IFBMQUNFTUVOVF9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORF9fVE9HR0xFOgorCQkJCXJldHVybiB0b2dnbGUgIT0gVE9HR0xFX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EX19SRVBMT1Q6CisJCQkJcmV0dXJuIHJlcGxvdCAhPSBSRVBMT1RfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MRUdFTkRfX1RPR0dMRV9UWVBFOgorCQkJCXJldHVybiB0b2dnbGVUeXBlICE9IFRPR0dMRV9UWVBFX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocGxhY2VtZW50OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChwbGFjZW1lbnQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRvZ2dsZTogIik7CisJCXJlc3VsdC5hcHBlbmQodG9nZ2xlKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCByZXBsb3Q6ICIpOworCQlyZXN1bHQuYXBwZW5kKHJlcGxvdCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgdG9nZ2xlVHlwZTogIik7CisJCXJlc3VsdC5hcHBlbmQodG9nZ2xlVHlwZSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NoYXJ0TGVnZW5kSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydExpbmVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TGluZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQ5MDlkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydExpbmVJbXBsLmphdmEKQEAgLTAsMCArMSw1NTEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IExpbmU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExpbmVJbXBsI2lzQW5pbWF0ZWQgPGVtPkFuaW1hdGVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCNpc1Nob3dNYXJrZXIgPGVtPlNob3cgTWFya2VyPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCNpc1RyZW5kTGluZSA8ZW0+VHJlbmQgTGluZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TGluZUltcGwjaXNab29tIDxlbT5ab29tPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCNpc0N1cnNvciA8ZW0+Q3Vyc29yPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCNpc1Rvb2x0aXAgPGVtPlRvb2x0aXA8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbC5DaGFydExpbmVJbXBsI2lzRmlsbFRvWmVybyA8ZW0+RmlsbCBUbyBaZXJvPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRMaW5lSW1wbCNpc0ZpbGxBcmVhIDxlbT5GaWxsIEFyZWE8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydExpbmVJbXBsIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ2hhcnRMaW5lIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNBbmltYXRlZCgpIDxlbT5BbmltYXRlZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNBbmltYXRlZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEFOSU1BVEVEX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0FuaW1hdGVkKCkgPGVtPkFuaW1hdGVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0FuaW1hdGVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBhbmltYXRlZCA9IEFOSU1BVEVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2hvd01hcmtlcigpIDxlbT5TaG93IE1hcmtlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTaG93TWFya2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gU0hPV19NQVJLRVJfRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzU2hvd01hcmtlcigpIDxlbT5TaG93IE1hcmtlcjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNTaG93TWFya2VyKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBzaG93TWFya2VyID0gU0hPV19NQVJLRVJfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNUcmVuZExpbmUoKSA8ZW0+VHJlbmQgTGluZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNUcmVuZExpbmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUUkVORF9MSU5FX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1RyZW5kTGluZSgpIDxlbT5UcmVuZCBMaW5lPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1RyZW5kTGluZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gdHJlbmRMaW5lID0gVFJFTkRfTElORV9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1pvb20oKSA8ZW0+Wm9vbTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNab29tKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gWk9PTV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNab29tKCkgPGVtPlpvb208L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzWm9vbSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gem9vbSA9IFpPT01fRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDdXJzb3IoKSA8ZW0+Q3Vyc29yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0N1cnNvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIENVUlNPUl9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDdXJzb3IoKSA8ZW0+Q3Vyc29yPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0N1cnNvcigpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY3Vyc29yID0gQ1VSU09SX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzVG9vbHRpcCgpIDxlbT5Ub29sdGlwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc1Rvb2x0aXAoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBUT09MVElQX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc1Rvb2x0aXAoKSA8ZW0+VG9vbHRpcDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNUb29sdGlwKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiB0b29sdGlwID0gVE9PTFRJUF9FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbGxUb1plcm8oKSA8ZW0+RmlsbCBUbyBaZXJvPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0ZpbGxUb1plcm8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBGSUxMX1RPX1pFUk9fRURFRkFVTFQgPSBmYWxzZTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzRmlsbFRvWmVybygpIDxlbT5GaWxsIFRvIFplcm88L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRmlsbFRvWmVybygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gZmlsbFRvWmVybyA9IEZJTExfVE9fWkVST19FREVGQVVMVDsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0ZpbGxBcmVhKCkgPGVtPkZpbGwgQXJlYTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNGaWxsQXJlYSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEZJTExfQVJFQV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNGaWxsQXJlYSgpIDxlbT5GaWxsIEFyZWE8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzRmlsbEFyZWEoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBib29sZWFuIGZpbGxBcmVhID0gRklMTF9BUkVBX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0TGluZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfTElORTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0FuaW1hdGVkKCkgeworCQlyZXR1cm4gYW5pbWF0ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QW5pbWF0ZWQoYm9vbGVhbiBuZXdBbmltYXRlZCkgeworCQlib29sZWFuIG9sZEFuaW1hdGVkID0gYW5pbWF0ZWQ7CisJCWFuaW1hdGVkID0gbmV3QW5pbWF0ZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19BTklNQVRFRCwgb2xkQW5pbWF0ZWQsIGFuaW1hdGVkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNTaG93TWFya2VyKCkgeworCQlyZXR1cm4gc2hvd01hcmtlcjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRTaG93TWFya2VyKGJvb2xlYW4gbmV3U2hvd01hcmtlcikgeworCQlib29sZWFuIG9sZFNob3dNYXJrZXIgPSBzaG93TWFya2VyOworCQlzaG93TWFya2VyID0gbmV3U2hvd01hcmtlcjsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX1NIT1dfTUFSS0VSLCBvbGRTaG93TWFya2VyLCBzaG93TWFya2VyKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUcmVuZExpbmUoKSB7CisJCXJldHVybiB0cmVuZExpbmU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0VHJlbmRMaW5lKGJvb2xlYW4gbmV3VHJlbmRMaW5lKSB7CisJCWJvb2xlYW4gb2xkVHJlbmRMaW5lID0gdHJlbmRMaW5lOworCQl0cmVuZExpbmUgPSBuZXdUcmVuZExpbmU7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19UUkVORF9MSU5FLCBvbGRUcmVuZExpbmUsIHRyZW5kTGluZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBib29sZWFuIGlzWm9vbSgpIHsKKwkJcmV0dXJuIHpvb207CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Wm9vbShib29sZWFuIG5ld1pvb20pIHsKKwkJYm9vbGVhbiBvbGRab29tID0gem9vbTsKKwkJem9vbSA9IG5ld1pvb207CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19aT09NLCBvbGRab29tLCB6b29tKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDdXJzb3IoKSB7CisJCXJldHVybiBjdXJzb3I7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0Q3Vyc29yKGJvb2xlYW4gbmV3Q3Vyc29yKSB7CisJCWJvb2xlYW4gb2xkQ3Vyc29yID0gY3Vyc29yOworCQljdXJzb3IgPSBuZXdDdXJzb3I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19DVVJTT1IsIG9sZEN1cnNvciwgY3Vyc29yKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNUb29sdGlwKCkgeworCQlyZXR1cm4gdG9vbHRpcDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRUb29sdGlwKGJvb2xlYW4gbmV3VG9vbHRpcCkgeworCQlib29sZWFuIG9sZFRvb2x0aXAgPSB0b29sdGlwOworCQl0b29sdGlwID0gbmV3VG9vbHRpcDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX1RPT0xUSVAsIG9sZFRvb2x0aXAsIHRvb2x0aXApKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZpbGxUb1plcm8oKSB7CisJCXJldHVybiBmaWxsVG9aZXJvOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbGxUb1plcm8oYm9vbGVhbiBuZXdGaWxsVG9aZXJvKSB7CisJCWJvb2xlYW4gb2xkRmlsbFRvWmVybyA9IGZpbGxUb1plcm87CisJCWZpbGxUb1plcm8gPSBuZXdGaWxsVG9aZXJvOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fRklMTF9UT19aRVJPLCBvbGRGaWxsVG9aZXJvLCBmaWxsVG9aZXJvKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNGaWxsQXJlYSgpIHsKKwkJcmV0dXJuIGZpbGxBcmVhOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEZpbGxBcmVhKGJvb2xlYW4gbmV3RmlsbEFyZWEpIHsKKwkJYm9vbGVhbiBvbGRGaWxsQXJlYSA9IGZpbGxBcmVhOworCQlmaWxsQXJlYSA9IG5ld0ZpbGxBcmVhOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fRklMTF9BUkVBLCBvbGRGaWxsQXJlYSwgZmlsbEFyZWEpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19BTklNQVRFRDoKKwkJCQlyZXR1cm4gaXNBbmltYXRlZCgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fU0hPV19NQVJLRVI6CisJCQkJcmV0dXJuIGlzU2hvd01hcmtlcigpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fVFJFTkRfTElORToKKwkJCQlyZXR1cm4gaXNUcmVuZExpbmUoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX1pPT006CisJCQkJcmV0dXJuIGlzWm9vbSgpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fQ1VSU09SOgorCQkJCXJldHVybiBpc0N1cnNvcigpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fVE9PTFRJUDoKKwkJCQlyZXR1cm4gaXNUb29sdGlwKCk7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19GSUxMX1RPX1pFUk86CisJCQkJcmV0dXJuIGlzRmlsbFRvWmVybygpOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fRklMTF9BUkVBOgorCQkJCXJldHVybiBpc0ZpbGxBcmVhKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX0FOSU1BVEVEOgorCQkJCXNldEFuaW1hdGVkKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19TSE9XX01BUktFUjoKKwkJCQlzZXRTaG93TWFya2VyKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19UUkVORF9MSU5FOgorCQkJCXNldFRyZW5kTGluZSgoQm9vbGVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fWk9PTToKKwkJCQlzZXRab29tKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19DVVJTT1I6CisJCQkJc2V0Q3Vyc29yKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19UT09MVElQOgorCQkJCXNldFRvb2x0aXAoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX0ZJTExfVE9fWkVSTzoKKwkJCQlzZXRGaWxsVG9aZXJvKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19GSUxMX0FSRUE6CisJCQkJc2V0RmlsbEFyZWEoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19BTklNQVRFRDoKKwkJCQlzZXRBbmltYXRlZChBTklNQVRFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fU0hPV19NQVJLRVI6CisJCQkJc2V0U2hvd01hcmtlcihTSE9XX01BUktFUl9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fVFJFTkRfTElORToKKwkJCQlzZXRUcmVuZExpbmUoVFJFTkRfTElORV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fWk9PTToKKwkJCQlzZXRab29tKFpPT01fRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX0NVUlNPUjoKKwkJCQlzZXRDdXJzb3IoQ1VSU09SX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19UT09MVElQOgorCQkJCXNldFRvb2x0aXAoVE9PTFRJUF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fRklMTF9UT19aRVJPOgorCQkJCXNldEZpbGxUb1plcm8oRklMTF9UT19aRVJPX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19GSUxMX0FSRUE6CisJCQkJc2V0RmlsbEFyZWEoRklMTF9BUkVBX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX0FOSU1BVEVEOgorCQkJCXJldHVybiBhbmltYXRlZCAhPSBBTklNQVRFRF9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xJTkVfX1NIT1dfTUFSS0VSOgorCQkJCXJldHVybiBzaG93TWFya2VyICE9IFNIT1dfTUFSS0VSX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fVFJFTkRfTElORToKKwkJCQlyZXR1cm4gdHJlbmRMaW5lICE9IFRSRU5EX0xJTkVfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19aT09NOgorCQkJCXJldHVybiB6b29tICE9IFpPT01fRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19DVVJTT1I6CisJCQkJcmV0dXJuIGN1cnNvciAhPSBDVVJTT1JfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19UT09MVElQOgorCQkJCXJldHVybiB0b29sdGlwICE9IFRPT0xUSVBfRURFRkFVTFQ7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FX19GSUxMX1RPX1pFUk86CisJCQkJcmV0dXJuIGZpbGxUb1plcm8gIT0gRklMTF9UT19aRVJPX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORV9fRklMTF9BUkVBOgorCQkJCXJldHVybiBmaWxsQXJlYSAhPSBGSUxMX0FSRUFfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChhbmltYXRlZDogIik7CisJCXJlc3VsdC5hcHBlbmQoYW5pbWF0ZWQpOworCQlyZXN1bHQuYXBwZW5kKCIsIHNob3dNYXJrZXI6ICIpOworCQlyZXN1bHQuYXBwZW5kKHNob3dNYXJrZXIpOworCQlyZXN1bHQuYXBwZW5kKCIsIHRyZW5kTGluZTogIik7CisJCXJlc3VsdC5hcHBlbmQodHJlbmRMaW5lKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCB6b29tOiAiKTsKKwkJcmVzdWx0LmFwcGVuZCh6b29tKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjdXJzb3I6ICIpOworCQlyZXN1bHQuYXBwZW5kKGN1cnNvcik7CisJCXJlc3VsdC5hcHBlbmQoIiwgdG9vbHRpcDogIik7CisJCXJlc3VsdC5hcHBlbmQodG9vbHRpcCk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZmlsbFRvWmVybzogIik7CisJCXJlc3VsdC5hcHBlbmQoZmlsbFRvWmVybyk7CisJCXJlc3VsdC5hcHBlbmQoIiwgZmlsbEFyZWE6ICIpOworCQlyZXN1bHQuYXBwZW5kKGZpbGxBcmVhKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQ2hhcnRMaW5lSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydE1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydE1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NjhkOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0TW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRNb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IE1vZGVsPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGwuQ2hhcnRNb2RlbEltcGwjZ2V0UGFja2FnZXMgPGVtPlBhY2thZ2VzPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQ2hhcnRNb2RlbEltcGwgZXh0ZW5kcyBNaW5pbWFsRU9iamVjdEltcGwuQ29udGFpbmVyIGltcGxlbWVudHMgQ2hhcnRNb2RlbCB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UGFja2FnZXMoKSA8ZW0+UGFja2FnZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UGFja2FnZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxDaGFydFBhY2thZ2U+IHBhY2thZ2VzOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0TW9kZWxJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxDaGFydFBhY2thZ2U+IGdldFBhY2thZ2VzKCkgeworCQlpZiAocGFja2FnZXMgPT0gbnVsbCkgeworCQkJcGFja2FnZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Q2hhcnRQYWNrYWdlPihDaGFydFBhY2thZ2UuY2xhc3MsIHRoaXMsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9NT0RFTF9fUEFDS0FHRVMpOworCQl9CisJCXJldHVybiBwYWNrYWdlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9NT0RFTF9fUEFDS0FHRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRQYWNrYWdlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX01PREVMX19QQUNLQUdFUzoKKwkJCQlyZXR1cm4gZ2V0UGFja2FnZXMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTU9ERUxfX1BBQ0tBR0VTOgorCQkJCWdldFBhY2thZ2VzKCkuY2xlYXIoKTsKKwkJCQlnZXRQYWNrYWdlcygpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2hhcnRQYWNrYWdlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX01PREVMX19QQUNLQUdFUzoKKwkJCQlnZXRQYWNrYWdlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9NT0RFTF9fUEFDS0FHRVM6CisJCQkJcmV0dXJuIHBhY2thZ2VzICE9IG51bGwgJiYgIXBhY2thZ2VzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vQ2hhcnRNb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc4ZjhmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydE51bWJlckludGVydmFsSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFJhbmdlRWxlbWVudDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IE51bWJlciBJbnRlcnZhbDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TnVtYmVySW50ZXJ2YWxJbXBsI2dldE51bWJlckludGVydmFsVmFsdWUgPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0TnVtYmVySW50ZXJ2YWxJbXBsI2dldE51bWJlclJhbmdlIDxlbT5OdW1iZXIgUmFuZ2U8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydE51bWJlckludGVydmFsSW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0TnVtYmVySW50ZXJ2YWwgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXJJbnRlcnZhbFZhbHVlKCkgPGVtPk51bWJlciBJbnRlcnZhbCBWYWx1ZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUID0gMDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE51bWJlckludGVydmFsVmFsdWUoKSA8ZW0+TnVtYmVyIEludGVydmFsIFZhbHVlPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXROdW1iZXJJbnRlcnZhbFZhbHVlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgaW50IG51bWJlckludGVydmFsVmFsdWUgPSBOVU1CRVJfSU5URVJWQUxfVkFMVUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROdW1iZXJSYW5nZSgpIDxlbT5OdW1iZXIgUmFuZ2U8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE51bWJlclJhbmdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRSYW5nZUVsZW1lbnQgbnVtYmVyUmFuZ2U7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpIHsKKwkJcmV0dXJuIG51bWJlckludGVydmFsVmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVtYmVySW50ZXJ2YWxWYWx1ZShpbnQgbmV3TnVtYmVySW50ZXJ2YWxWYWx1ZSkgeworCQlpbnQgb2xkTnVtYmVySW50ZXJ2YWxWYWx1ZSA9IG51bWJlckludGVydmFsVmFsdWU7CisJCW51bWJlckludGVydmFsVmFsdWUgPSBuZXdOdW1iZXJJbnRlcnZhbFZhbHVlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUsIG9sZE51bWJlckludGVydmFsVmFsdWUsIG51bWJlckludGVydmFsVmFsdWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQ2hhcnRSYW5nZUVsZW1lbnQgZ2V0TnVtYmVyUmFuZ2UoKSB7CisJCXJldHVybiBudW1iZXJSYW5nZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXROdW1iZXJSYW5nZShDaGFydFJhbmdlRWxlbWVudCBuZXdOdW1iZXJSYW5nZSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlDaGFydFJhbmdlRWxlbWVudCBvbGROdW1iZXJSYW5nZSA9IG51bWJlclJhbmdlOworCQludW1iZXJSYW5nZSA9IG5ld051bWJlclJhbmdlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UsIG9sZE51bWJlclJhbmdlLCBuZXdOdW1iZXJSYW5nZSk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TnVtYmVyUmFuZ2UoQ2hhcnRSYW5nZUVsZW1lbnQgbmV3TnVtYmVyUmFuZ2UpIHsKKwkJaWYgKG5ld051bWJlclJhbmdlICE9IG51bWJlclJhbmdlKSB7CisJCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKKwkJCWlmIChudW1iZXJSYW5nZSAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCludW1iZXJSYW5nZSkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRSwgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3TnVtYmVyUmFuZ2UgIT0gbnVsbCkKKwkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpbmV3TnVtYmVyUmFuZ2UpLmVJbnZlcnNlQWRkKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UsIG51bGwsIG1zZ3MpOworCQkJbXNncyA9IGJhc2ljU2V0TnVtYmVyUmFuZ2UobmV3TnVtYmVyUmFuZ2UsIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFLCBuZXdOdW1iZXJSYW5nZSwgbmV3TnVtYmVyUmFuZ2UpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRToKKwkJCQlyZXR1cm4gYmFzaWNTZXROdW1iZXJSYW5nZShudWxsLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUU6CisJCQkJcmV0dXJuIGdldE51bWJlckludGVydmFsVmFsdWUoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFOgorCQkJCXJldHVybiBnZXROdW1iZXJSYW5nZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRToKKwkJCQlzZXROdW1iZXJJbnRlcnZhbFZhbHVlKChJbnRlZ2VyKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9SQU5HRToKKwkJCQlzZXROdW1iZXJSYW5nZSgoQ2hhcnRSYW5nZUVsZW1lbnQpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRToKKwkJCQlzZXROdW1iZXJJbnRlcnZhbFZhbHVlKE5VTUJFUl9JTlRFUlZBTF9WQUxVRV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0U6CisJCQkJc2V0TnVtYmVyUmFuZ2UoKENoYXJ0UmFuZ2VFbGVtZW50KW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUU6CisJCQkJcmV0dXJuIG51bWJlckludGVydmFsVmFsdWUgIT0gTlVNQkVSX0lOVEVSVkFMX1ZBTFVFX0VERUZBVUxUOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0U6CisJCQkJcmV0dXJuIG51bWJlclJhbmdlICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChudW1iZXJJbnRlcnZhbFZhbHVlOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChudW1iZXJJbnRlcnZhbFZhbHVlKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQ2hhcnROdW1iZXJJbnRlcnZhbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRQYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydFBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0N2FjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRQYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuaW1wbC5MUGFja2FnZUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgUGFja2FnZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGFja2FnZUltcGwjZ2V0Q2hhcnRzIDxlbT5DaGFydHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydFBhY2thZ2VJbXBsIGV4dGVuZHMgTFBhY2thZ2VJbXBsIGltcGxlbWVudHMgQ2hhcnRQYWNrYWdlIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDaGFydHMoKSA8ZW0+Q2hhcnRzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldENoYXJ0cygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PENoYXJ0PiBjaGFydHM7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnRQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9QQUNLQUdFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxDaGFydD4gZ2V0Q2hhcnRzKCkgeworCQlpZiAoY2hhcnRzID09IG51bGwpIHsKKwkJCWNoYXJ0cyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxDaGFydD4oQ2hhcnQuY2xhc3MsIHRoaXMsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QQUNLQUdFX19DSEFSVFMpOworCQl9CisJCXJldHVybiBjaGFydHM7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUEFDS0FHRV9fQ0hBUlRTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0Q2hhcnRzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUEFDS0FHRV9fQ0hBUlRTOgorCQkJCXJldHVybiBnZXRDaGFydHMoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUEFDS0FHRV9fQ0hBUlRTOgorCQkJCWdldENoYXJ0cygpLmNsZWFyKCk7CisJCQkJZ2V0Q2hhcnRzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDaGFydD4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QQUNLQUdFX19DSEFSVFM6CisJCQkJZ2V0Q2hhcnRzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1BBQ0tBR0VfX0NIQVJUUzoKKwkJCQlyZXR1cm4gY2hhcnRzICE9IG51bGwgJiYgIWNoYXJ0cy5pc0VtcHR5KCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0NoYXJ0UGFja2FnZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRQaWVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0UGllSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ODgxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0UGllSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBpZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNoYXJ0IFBpZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0UGllSW1wbCNpc0VtcHR5IDxlbT5FbXB0eTwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0UGllSW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0UGllIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNFbXB0eSgpIDxlbT5FbXB0eTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNFbXB0eSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIEVNUFRZX0VERUZBVUxUID0gZmFsc2U7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNpc0VtcHR5KCkgPGVtPkVtcHR5PC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc0VtcHR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgYm9vbGVhbiBlbXB0eSA9IEVNUFRZX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIENoYXJ0UGllSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9QSUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKwkJcmV0dXJuIGVtcHR5OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVtcHR5KGJvb2xlYW4gbmV3RW1wdHkpIHsKKwkJYm9vbGVhbiBvbGRFbXB0eSA9IGVtcHR5OworCQllbXB0eSA9IG5ld0VtcHR5OworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUElFX19FTVBUWSwgb2xkRW1wdHksIGVtcHR5KSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUElFX19FTVBUWToKKwkJCQlyZXR1cm4gaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QSUVfX0VNUFRZOgorCQkJCXNldEVtcHR5KChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUElFX19FTVBUWToKKwkJCQlzZXRFbXB0eShFTVBUWV9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QSUVfX0VNUFRZOgorCQkJCXJldHVybiBlbXB0eSAhPSBFTVBUWV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGVtcHR5OiAiKTsKKwkJcmVzdWx0LmFwcGVuZChlbXB0eSk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL0NoYXJ0UGllSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvaW1wbC9DaGFydFNlZ21lbnRDb2xvckltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRTZWdtZW50Q29sb3JJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1OGYyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRTZWdtZW50Q29sb3JJbXBsLmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAKKyAqIAorICogIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorICogICAKKyAqICBDb250cmlidXRvcnM6ICAKKyAqICAJCUNocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgU2VnbWVudCBDb2xvcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0U2VnbWVudENvbG9ySW1wbCNnZXRSZ2IgPGVtPlJnYjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0U2VnbWVudENvbG9ySW1wbCBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIENoYXJ0U2VnbWVudENvbG9yIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmdiKCkgPGVtPlJnYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmdiKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSR0JfRURFRkFVTFQgPSBudWxsOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UmdiKCkgPGVtPlJnYjwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0UmdiKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIHJnYiA9IFJHQl9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydFNlZ21lbnRDb2xvckltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfU0VHTUVOVF9DT0xPUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldFJnYigpIHsKKwkJcmV0dXJuIHJnYjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRSZ2IoU3RyaW5nIG5ld1JnYikgeworCQlTdHJpbmcgb2xkUmdiID0gcmdiOworCQlyZ2IgPSBuZXdSZ2I7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9TRUdNRU5UX0NPTE9SX19SR0IsIG9sZFJnYiwgcmdiKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfU0VHTUVOVF9DT0xPUl9fUkdCOgorCQkJCXJldHVybiBnZXRSZ2IoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfU0VHTUVOVF9DT0xPUl9fUkdCOgorCQkJCXNldFJnYigoU3RyaW5nKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfU0VHTUVOVF9DT0xPUl9fUkdCOgorCQkJCXNldFJnYihSR0JfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfU0VHTUVOVF9DT0xPUl9fUkdCOgorCQkJCXJldHVybiBSR0JfRURFRkFVTFQgPT0gbnVsbCA/IHJnYiAhPSBudWxsIDogIVJHQl9FREVGQVVMVC5lcXVhbHMocmdiKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKHJnYjogIik7CisJCXJlc3VsdC5hcHBlbmQocmdiKTsKKwkJcmVzdWx0LmFwcGVuZCgnKScpOworCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7CisJfQorCit9IC8vQ2hhcnRTZWdtZW50Q29sb3JJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0VHJlZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2ltcGwvQ2hhcnRUcmVlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZmM1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9pbXBsL0NoYXJ0VHJlZUltcGwuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Q2hhcnQgVHJlZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0VHJlZUltcGwjaXNNYXAgPGVtPk1hcDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5pbXBsLkNoYXJ0VHJlZUltcGwjaXNDb2xsYXBzaWJsZSA8ZW0+Q29sbGFwc2libGU8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydFRyZWVJbXBsIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgQ2hhcnRUcmVlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXAoKSA8ZW0+TWFwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc01hcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIE1BUF9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNNYXAoKSA8ZW0+TWFwPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNpc01hcCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gbWFwID0gTUFQX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzQ29sbGFwc2libGUoKSA8ZW0+Q29sbGFwc2libGU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2lzQ29sbGFwc2libGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBDT0xMQVBTSUJMRV9FREVGQVVMVCA9IGZhbHNlOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNDb2xsYXBzaWJsZSgpIDxlbT5Db2xsYXBzaWJsZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjaXNDb2xsYXBzaWJsZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIGJvb2xlYW4gY29sbGFwc2libGUgPSBDT0xMQVBTSUJMRV9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBDaGFydFRyZWVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX1RSRUU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNNYXAoKSB7CisJCXJldHVybiBtYXA7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TWFwKGJvb2xlYW4gbmV3TWFwKSB7CisJCWJvb2xlYW4gb2xkTWFwID0gbWFwOworCQltYXAgPSBuZXdNYXA7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9UUkVFX19NQVAsIG9sZE1hcCwgbWFwKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGJvb2xlYW4gaXNDb2xsYXBzaWJsZSgpIHsKKwkJcmV0dXJuIGNvbGxhcHNpYmxlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldENvbGxhcHNpYmxlKGJvb2xlYW4gbmV3Q29sbGFwc2libGUpIHsKKwkJYm9vbGVhbiBvbGRDb2xsYXBzaWJsZSA9IGNvbGxhcHNpYmxlOworCQljb2xsYXBzaWJsZSA9IG5ld0NvbGxhcHNpYmxlOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBDaGFydERTTFBhY2thZ2UuQ0hBUlRfVFJFRV9fQ09MTEFQU0lCTEUsIG9sZENvbGxhcHNpYmxlLCBjb2xsYXBzaWJsZSkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX01BUDoKKwkJCQlyZXR1cm4gaXNNYXAoKTsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX0NPTExBUFNJQkxFOgorCQkJCXJldHVybiBpc0NvbGxhcHNpYmxlKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX01BUDoKKwkJCQlzZXRNYXAoKEJvb2xlYW4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX0NPTExBUFNJQkxFOgorCQkJCXNldENvbGxhcHNpYmxlKChCb29sZWFuKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfVFJFRV9fTUFQOgorCQkJCXNldE1hcChNQVBfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX0NPTExBUFNJQkxFOgorCQkJCXNldENvbGxhcHNpYmxlKENPTExBUFNJQkxFX0VERUZBVUxUKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX01BUDoKKwkJCQlyZXR1cm4gbWFwICE9IE1BUF9FREVGQVVMVDsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUVfX0NPTExBUFNJQkxFOgorCQkJCXJldHVybiBjb2xsYXBzaWJsZSAhPSBDT0xMQVBTSUJMRV9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG1hcDogIik7CisJCXJlc3VsdC5hcHBlbmQobWFwKTsKKwkJcmVzdWx0LmFwcGVuZCgiLCBjb2xsYXBzaWJsZTogIik7CisJCXJlc3VsdC5hcHBlbmQoY29sbGFwc2libGUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9DaGFydFRyZWVJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91dGlsL0NoYXJ0RFNMQWRhcHRlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3V0aWwvQ2hhcnREU0xBZGFwdGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NGZkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC91dGlsL0NoYXJ0RFNMQWRhcHRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDU0OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorICogCisgKiAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisgKiAgIAorICogIENvbnRyaWJ1dG9yczogIAorICogIAkJQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudXRpbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIENoYXJ0RFNMQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIENoYXJ0RFNMUGFja2FnZSBtb2RlbFBhY2thZ2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIENoYXJ0RFNMQWRhcHRlckZhY3RvcnkoKSB7CisJCWlmIChtb2RlbFBhY2thZ2UgPT0gbnVsbCkgeworCQkJbW9kZWxQYWNrYWdlID0gQ2hhcnREU0xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQ2hhcnREU0xTd2l0Y2g8QWRhcHRlcj4gbW9kZWxTd2l0Y2ggPQorCQluZXcgQ2hhcnREU0xTd2l0Y2g8QWRhcHRlcj4oKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydE1vZGVsKENoYXJ0TW9kZWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0TW9kZWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydExhenlSZXNvbHZlcihDaGFydExhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRMYXp5UmVzb2x2ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEJhc2UoQ2hhcnRCYXNlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydEJhc2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydFBhY2thZ2UoQ2hhcnRQYWNrYWdlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydFBhY2thZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydChDaGFydCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydE9wdGlvbihDaGFydE9wdGlvbiBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRPcHRpb25BZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEJhcihDaGFydEJhciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRCYXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydExpbmUoQ2hhcnRMaW5lIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydExpbmVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydFBpZShDaGFydFBpZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRQaWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydERvbnV0KENoYXJ0RG9udXQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0RG9udXRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEJ1YmJsZShDaGFydEJ1YmJsZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRCdWJibGVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEdhdWdlKENoYXJ0R2F1Z2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0R2F1Z2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydFRyZWUoQ2hhcnRUcmVlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydFRyZWVBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEludGVydmFsKENoYXJ0SW50ZXJ2YWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0SW50ZXJ2YWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydE51bWJlckludGVydmFsKENoYXJ0TnVtYmVySW50ZXJ2YWwgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0TnVtYmVySW50ZXJ2YWxBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydERhdGFtYXJ0KENoYXJ0RGF0YW1hcnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0RGF0YW1hcnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEVsZW1lbnQoQ2hhcnRFbGVtZW50IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydEVsZW1lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydExlZ2VuZChDaGFydExlZ2VuZCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRMZWdlbmRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEhpZ2hsaWdodGVyKENoYXJ0SGlnaGxpZ2h0ZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUNoYXJ0SGlnaGxpZ2h0ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydEF4aXMoQ2hhcnRBeGlzIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVDaGFydEF4aXNBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydFJhbmdlRWxlbWVudChDaGFydFJhbmdlRWxlbWVudCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRSYW5nZUVsZW1lbnRBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VDaGFydFNlZ21lbnRDb2xvcihDaGFydFNlZ21lbnRDb2xvciBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQ2hhcnRTZWdtZW50Q29sb3JBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMTGF6eVJlc29sdmVyKExMYXp5UmVzb2x2ZXIgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxMYXp5UmVzb2x2ZXJBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGNhc2VMUGFja2FnZShMUGFja2FnZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlTFBhY2thZ2VBZGFwdGVyKCk7CisJCQl9CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyBBZGFwdGVyIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7CisJCQl9CisJCX07CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHRhcmdldCB0aGUgb2JqZWN0IHRvIGFkYXB0LgorCSAqIEByZXR1cm4gdGhlIGFkYXB0ZXIgZm9yIHRoZSA8Y29kZT50YXJnZXQ8L2NvZGU+LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBZGFwdGVyKE5vdGlmaWVyIHRhcmdldCkgeworCQlyZXR1cm4gbW9kZWxTd2l0Y2guZG9Td2l0Y2goKEVPYmplY3QpdGFyZ2V0KTsKKwl9CisKKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsIDxlbT5DaGFydCBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRNb2RlbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExhenlSZXNvbHZlciA8ZW0+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGF6eVJlc29sdmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoYXJ0TGF6eVJlc29sdmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZSA8ZW0+Q2hhcnQgQmFzZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFzZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydEJhc2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlIDxlbT5DaGFydCBQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoYXJ0UGFja2FnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydCA8ZW0+Q2hhcnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbiA8ZW0+Q2hhcnQgT3B0aW9uPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRPcHRpb24KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRPcHRpb25BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXIgPGVtPkNoYXJ0IEJhcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoYXJ0QmFyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZSA8ZW0+Q2hhcnQgTGluZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGluZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydExpbmVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWUgPGVtPkNoYXJ0IFBpZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUNoYXJ0UGllQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RG9udXQgPGVtPkNoYXJ0IERvbnV0PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREb251dAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydERvbnV0QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QnViYmxlIDxlbT5DaGFydCBCdWJibGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydEJ1YmJsZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEdhdWdlIDxlbT5DaGFydCBHYXVnZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRHYXVnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUgPGVtPkNoYXJ0IFRyZWU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRUcmVlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SW50ZXJ2YWwgPGVtPkNoYXJ0IEludGVydmFsPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRJbnRlcnZhbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydEludGVydmFsQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwgPGVtPkNoYXJ0IE51bWJlciBJbnRlcnZhbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnROdW1iZXJJbnRlcnZhbEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0IDxlbT5DaGFydCBEYXRhbWFydDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnREYXRhbWFydEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQgPGVtPkNoYXJ0IEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRFbGVtZW50QWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kIDxlbT5DaGFydCBMZWdlbmQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExlZ2VuZAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydExlZ2VuZEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyIDxlbT5DaGFydCBIaWdobGlnaHRlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRIaWdobGlnaHRlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMgPGVtPkNoYXJ0IEF4aXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEF4aXMKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRBeGlzQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UmFuZ2VFbGVtZW50IDxlbT5DaGFydCBSYW5nZSBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRSYW5nZUVsZW1lbnQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQ2hhcnRSYW5nZUVsZW1lbnRBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRTZWdtZW50Q29sb3IgPGVtPkNoYXJ0IFNlZ21lbnQgQ29sb3I8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFNlZ21lbnRDb2xvcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVDaGFydFNlZ21lbnRDb2xvckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXIgPGVtPkxMYXp5IFJlc29sdmVyPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxMYXp5UmVzb2x2ZXJBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZSA8ZW0+TFBhY2thZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUxQYWNrYWdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciB0aGUgZGVmYXVsdCBjYXNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0NoYXJ0RFNMQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3V0aWwvQ2hhcnREU0xTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3V0aWwvQ2hhcnREU0xTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2UzOWRjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdXRpbC9DaGFydERTTFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsNjI5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisgKiAKKyAqICBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAqICAgCisgKiAgQ29udHJpYnV0b3JzOiAgCisgKiAgCQlDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIEluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51dGlsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuU3dpdGNoOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxMYXp5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+U3dpdGNoPC9iPiBmb3IgdGhlIG1vZGVsJ3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICogSXQgc3VwcG9ydHMgdGhlIGNhbGwge0BsaW5rICNkb1N3aXRjaChFT2JqZWN0KSBkb1N3aXRjaChvYmplY3QpfQorICogdG8gaW52b2tlIHRoZSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBtZXRob2QgZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsLAorICogc3RhcnRpbmcgd2l0aCB0aGUgYWN0dWFsIGNsYXNzIG9mIHRoZSBvYmplY3QKKyAqIGFuZCBwcm9jZWVkaW5nIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkKKyAqIHVudGlsIGEgbm9uLW51bGwgcmVzdWx0IGlzIHJldHVybmVkLAorICogd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiB0aGUgc3dpdGNoLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBDaGFydERTTFN3aXRjaDxUPiBleHRlbmRzIFN3aXRjaDxUPiB7CisJLyoqCisJICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBDaGFydERTTFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBDaGFydERTTFN3aXRjaCgpIHsKKwkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7CisJCQltb2RlbFBhY2thZ2UgPSBDaGFydERTTFBhY2thZ2UuZUlOU1RBTkNFOworCQl9CisJfQorCisJLyoqCisJICogQ2hlY2tzIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW1ldGVyIGVQYWNrYWdlIHRoZSBwYWNrYWdlIGluIHF1ZXN0aW9uLgorCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgc3dpdGNoIGZvciB0aGUgZ2l2ZW4gcGFja2FnZS4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIGJvb2xlYW4gaXNTd2l0Y2hGb3IoRVBhY2thZ2UgZVBhY2thZ2UpIHsKKwkJcmV0dXJuIGVQYWNrYWdlID09IG1vZGVsUGFja2FnZTsKKwl9CisKKwkvKioKKwkgKiBDYWxscyA8Y29kZT5jYXNlWFhYPC9jb2RlPiBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwgdW50aWwgb25lIHJldHVybnMgYSBub24gbnVsbCByZXN1bHQ7IGl0IHlpZWxkcyB0aGF0IHJlc3VsdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIGZpcnN0IG5vbi1udWxsIHJlc3VsdCByZXR1cm5lZCBieSBhIDxjb2RlPmNhc2VYWFg8L2NvZGU+IGNhbGwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBUIGRvU3dpdGNoKGludCBjbGFzc2lmaWVySUQsIEVPYmplY3QgdGhlRU9iamVjdCkgeworCQlzd2l0Y2ggKGNsYXNzaWZpZXJJRCkgeworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTU9ERUw6IHsKKwkJCQlDaGFydE1vZGVsIGNoYXJ0TW9kZWwgPSAoQ2hhcnRNb2RlbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0TW9kZWwoY2hhcnRNb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEFaWV9SRVNPTFZFUjogeworCQkJCUNoYXJ0TGF6eVJlc29sdmVyIGNoYXJ0TGF6eVJlc29sdmVyID0gKENoYXJ0TGF6eVJlc29sdmVyKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnRMYXp5UmVzb2x2ZXIoY2hhcnRMYXp5UmVzb2x2ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0JBU0U6IHsKKwkJCQlDaGFydEJhc2UgY2hhcnRCYXNlID0gKENoYXJ0QmFzZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0QmFzZShjaGFydEJhc2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0QmFzZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUEFDS0FHRTogeworCQkJCUNoYXJ0UGFja2FnZSBjaGFydFBhY2thZ2UgPSAoQ2hhcnRQYWNrYWdlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnRQYWNrYWdlKGNoYXJ0UGFja2FnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTFBhY2thZ2UoY2hhcnRQYWNrYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMTGF6eVJlc29sdmVyKGNoYXJ0UGFja2FnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlQ6IHsKKwkJCQlDaGFydCBjaGFydCA9IChDaGFydCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0KGNoYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydEJhc2UoY2hhcnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9PUFRJT046IHsKKwkJCQlDaGFydE9wdGlvbiBjaGFydE9wdGlvbiA9IChDaGFydE9wdGlvbil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0T3B0aW9uKGNoYXJ0T3B0aW9uKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydE9wdGlvbik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSOiB7CisJCQkJQ2hhcnRCYXIgY2hhcnRCYXIgPSAoQ2hhcnRCYXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydEJhcihjaGFydEJhcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRPcHRpb24oY2hhcnRCYXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0QmFyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9MSU5FOiB7CisJCQkJQ2hhcnRMaW5lIGNoYXJ0TGluZSA9IChDaGFydExpbmUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydExpbmUoY2hhcnRMaW5lKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydE9wdGlvbihjaGFydExpbmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0TGluZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfUElFOiB7CisJCQkJQ2hhcnRQaWUgY2hhcnRQaWUgPSAoQ2hhcnRQaWUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydFBpZShjaGFydFBpZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRPcHRpb24oY2hhcnRQaWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0UGllKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ET05VVDogeworCQkJCUNoYXJ0RG9udXQgY2hhcnREb251dCA9IChDaGFydERvbnV0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnREb251dChjaGFydERvbnV0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydE9wdGlvbihjaGFydERvbnV0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydERvbnV0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEU6IHsKKwkJCQlDaGFydEJ1YmJsZSBjaGFydEJ1YmJsZSA9IChDaGFydEJ1YmJsZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0QnViYmxlKGNoYXJ0QnViYmxlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydE9wdGlvbihjaGFydEJ1YmJsZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRMYXp5UmVzb2x2ZXIoY2hhcnRCdWJibGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0dBVUdFOiB7CisJCQkJQ2hhcnRHYXVnZSBjaGFydEdhdWdlID0gKENoYXJ0R2F1Z2UpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydEdhdWdlKGNoYXJ0R2F1Z2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0T3B0aW9uKGNoYXJ0R2F1Z2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0TGF6eVJlc29sdmVyKGNoYXJ0R2F1Z2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUU6IHsKKwkJCQlDaGFydFRyZWUgY2hhcnRUcmVlID0gKENoYXJ0VHJlZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0VHJlZShjaGFydFRyZWUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0T3B0aW9uKGNoYXJ0VHJlZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRMYXp5UmVzb2x2ZXIoY2hhcnRUcmVlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9JTlRFUlZBTDogeworCQkJCUNoYXJ0SW50ZXJ2YWwgY2hhcnRJbnRlcnZhbCA9IChDaGFydEludGVydmFsKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnRJbnRlcnZhbChjaGFydEludGVydmFsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydEludGVydmFsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9OVU1CRVJfSU5URVJWQUw6IHsKKwkJCQlDaGFydE51bWJlckludGVydmFsIGNoYXJ0TnVtYmVySW50ZXJ2YWwgPSAoQ2hhcnROdW1iZXJJbnRlcnZhbCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0TnVtYmVySW50ZXJ2YWwoY2hhcnROdW1iZXJJbnRlcnZhbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRJbnRlcnZhbChjaGFydE51bWJlckludGVydmFsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydE51bWJlckludGVydmFsKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9EQVRBTUFSVDogeworCQkJCUNoYXJ0RGF0YW1hcnQgY2hhcnREYXRhbWFydCA9IChDaGFydERhdGFtYXJ0KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnREYXRhbWFydChjaGFydERhdGFtYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydERhdGFtYXJ0KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9FTEVNRU5UOiB7CisJCQkJQ2hhcnRFbGVtZW50IGNoYXJ0RWxlbWVudCA9IChDaGFydEVsZW1lbnQpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydEVsZW1lbnQoY2hhcnRFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydEVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0xFR0VORDogeworCQkJCUNoYXJ0TGVnZW5kIGNoYXJ0TGVnZW5kID0gKENoYXJ0TGVnZW5kKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnRMZWdlbmQoY2hhcnRMZWdlbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0RWxlbWVudChjaGFydExlZ2VuZCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQ2hhcnRMYXp5UmVzb2x2ZXIoY2hhcnRMZWdlbmQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSOiB7CisJCQkJQ2hhcnRIaWdobGlnaHRlciBjaGFydEhpZ2hsaWdodGVyID0gKENoYXJ0SGlnaGxpZ2h0ZXIpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydEhpZ2hsaWdodGVyKGNoYXJ0SGlnaGxpZ2h0ZXIpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0RWxlbWVudChjaGFydEhpZ2hsaWdodGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydEhpZ2hsaWdodGVyKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTOiB7CisJCQkJQ2hhcnRBeGlzIGNoYXJ0QXhpcyA9IChDaGFydEF4aXMpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VDaGFydEF4aXMoY2hhcnRBeGlzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydEVsZW1lbnQoY2hhcnRBeGlzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydEF4aXMpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1JBTkdFX0VMRU1FTlQ6IHsKKwkJCQlDaGFydFJhbmdlRWxlbWVudCBjaGFydFJhbmdlRWxlbWVudCA9IChDaGFydFJhbmdlRWxlbWVudCl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUNoYXJ0UmFuZ2VFbGVtZW50KGNoYXJ0UmFuZ2VFbGVtZW50KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydFJhbmdlRWxlbWVudCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfU0VHTUVOVF9DT0xPUjogeworCQkJCUNoYXJ0U2VnbWVudENvbG9yIGNoYXJ0U2VnbWVudENvbG9yID0gKENoYXJ0U2VnbWVudENvbG9yKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQ2hhcnRTZWdtZW50Q29sb3IoY2hhcnRTZWdtZW50Q29sb3IpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUNoYXJ0UmFuZ2VFbGVtZW50KGNoYXJ0U2VnbWVudENvbG9yKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VDaGFydExhenlSZXNvbHZlcihjaGFydFNlZ21lbnRDb2xvcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJZGVmYXVsdDogcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQl9CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBNb2RlbDwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0TW9kZWwoQ2hhcnRNb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IExhenkgUmVzb2x2ZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydExhenlSZXNvbHZlcihDaGFydExhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgQmFzZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEJhc2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydEJhc2UoQ2hhcnRCYXNlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBQYWNrYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0UGFja2FnZShDaGFydFBhY2thZ2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydChDaGFydCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgT3B0aW9uPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgT3B0aW9uPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnRPcHRpb24oQ2hhcnRPcHRpb24gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEJhcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEJhcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0QmFyKENoYXJ0QmFyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBMaW5lPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgTGluZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0TGluZShDaGFydExpbmUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IFBpZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IFBpZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0UGllKENoYXJ0UGllIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBEb251dDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IERvbnV0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnREb251dChDaGFydERvbnV0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBCdWJibGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBCdWJibGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydEJ1YmJsZShDaGFydEJ1YmJsZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgR2F1Z2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBHYXVnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUNoYXJ0R2F1Z2UoQ2hhcnRHYXVnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgVHJlZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IFRyZWU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydFRyZWUoQ2hhcnRUcmVlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBJbnRlcnZhbDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEludGVydmFsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnRJbnRlcnZhbChDaGFydEludGVydmFsIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBOdW1iZXIgSW50ZXJ2YWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBOdW1iZXIgSW50ZXJ2YWw8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydE51bWJlckludGVydmFsKENoYXJ0TnVtYmVySW50ZXJ2YWwgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IERhdGFtYXJ0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgRGF0YW1hcnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydERhdGFtYXJ0KENoYXJ0RGF0YW1hcnQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnRFbGVtZW50KENoYXJ0RWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgTGVnZW5kPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgTGVnZW5kPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnRMZWdlbmQoQ2hhcnRMZWdlbmQgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEhpZ2hsaWdodGVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgSGlnaGxpZ2h0ZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydEhpZ2hsaWdodGVyKENoYXJ0SGlnaGxpZ2h0ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IEF4aXM8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5DaGFydCBBeGlzPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQ2hhcnRBeGlzKENoYXJ0QXhpcyBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgUmFuZ2UgRWxlbWVudDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IFJhbmdlIEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydFJhbmdlRWxlbWVudChDaGFydFJhbmdlRWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Q2hhcnQgU2VnbWVudCBDb2xvcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkNoYXJ0IFNlZ21lbnQgQ29sb3I8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VDaGFydFNlZ21lbnRDb2xvcihDaGFydFNlZ21lbnRDb2xvciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TExhenkgUmVzb2x2ZXI8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUxMYXp5UmVzb2x2ZXIoTExhenlSZXNvbHZlciBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TFBhY2thZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5MUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZUxQYWNrYWdlKExQYWNrYWdlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2gsIGJ1dCB0aGlzIGlzIHRoZSBsYXN0IGNhc2UgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkVPYmplY3Q8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBUIGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworfSAvL0NoYXJ0RFNMU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Cis8dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CisgIGJvZHkgeworICAgIHNpemU6IDguNWluIDExLjBpbjsKKyAgICBtYXJnaW46IDAuMjVpbiAwLjVpbiAwLjI1aW4gMC41aW47CisgICAgdGFiLWludGVydmFsOiAwLjVpbjsKKyAgICB9CisgIHAgeyAgCQorICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi10b3A6ICAwLjVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKKyAgICB9CisgIHAubGlzdCB7CisgIAltYXJnaW4tbGVmdDogMC41aW47CisgICAgbWFyZ2luLXRvcDogIDAuMDVlbTsKKyAgICBtYXJnaW4tYm90dG9tOiAwLjA1ZW07CisgICAgfQorICA8L3N0eWxlPgorCis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKworPGgyPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvaDI+CisKKzxwPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFCitQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04gT1IKK0RJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMKK0FHUkVFTUVOVC48L3A+CisKKzxwPjxiPjEuIERFRklOSVRJT05TPC9iPjwvcD4KKworPHA+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsCitjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+YikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvcD4KKzxwIGNsYXNzPSJsaXN0Ij5pKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3A+Cis8cCBjbGFzcz0ibGlzdCI+aWkpIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3A+Cis8cCBjbGFzcz0ibGlzdCI+d2hlcmUgc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0KK29yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBCitDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlCitQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24gc3VjaAorQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQorUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkKK2FyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPiJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcwordGhlIFByb2dyYW0uPC9wPgorCis8cD4iTGljZW5zZWQgUGF0ZW50cyIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYQorQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlIG9yIHNhbGUgb2YgaXRzCitDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLjwvcD4KKworPHA+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2UKK3dpdGggdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyCit0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9wPgorCis8cD48Yj4yLiBHUkFOVCBPRiBSSUdIVFM8L2I+PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2gKK0NvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzCitvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluCitzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5iKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaAorQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsCitvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKK0NvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudAorbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlCitQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwKK3N1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkCitieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKK2NvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworbGljZW5zZWQgaGVyZXVuZGVyLjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmMpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IKK2dyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcworYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZQorcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaAorQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieQorYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cworb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kIGxpY2Vuc2VzCitncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0bworc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IKK2V4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50Cit0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlCit0aGF0IGxpY2Vuc2UgYmVmb3JlIGRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3A+CisKKzxwIGNsYXNzPSJsaXN0Ij5kKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0CitoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKK3RoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuPC9wPgorCis8cD48Yj4zLiBSRVFVSVJFTUVOVFM8L2I+PC9wPgorCis8cD5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBpbiBvYmplY3QgY29kZQorZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKK0FncmVlbWVudDsgYW5kPC9wPgorCis8cCBjbGFzcz0ibGlzdCI+YikgaXRzIGxpY2Vuc2UgYWdyZWVtZW50OjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmkpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycworYWxsIHdhcnJhbnRpZXMgYW5kIGNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzCitvciBjb25kaXRpb25zIG9mIHRpdGxlIGFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzCithbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKK2luY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7PC9wPgorCis8cCBjbGFzcz0ibGlzdCI+aWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzCitBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlcgorcGFydHk7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPml2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlCitmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZCBpbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEKK3JlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUKK2V4Y2hhbmdlLjwvcD4KKworPHA+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOjwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvcD4KKworPHAgY2xhc3M9Imxpc3QiPmIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaAorY29weSBvZiB0aGUgUHJvZ3JhbS48L3A+CisKKzxwPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkCit3aXRoaW4gdGhlIFByb2dyYW0uPC9wPgorCis8cD5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cworQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudAorUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLjwvcD4KKworPHA+PGI+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L2I+PC9wPgorCis8cD5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4KK3Jlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZQorbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mCit0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZQorcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IKK2luY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQKK2luZGVtbmlmeSBldmVyeSBvdGhlciBDb250cmlidXRvciAoIkluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIikKK2FnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQgY29zdHMgKGNvbGxlY3RpdmVseSAiTG9zc2VzIikKK2FyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZAorcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlCithY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cworZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKK3JlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbgorb3JkZXIgdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5Cit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsCitDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUKK0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZSBpbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duCitleHBlbnNlLjwvcD4KKworPHA+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKK3Byb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCitjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eQorYWxvbmUuIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0bworZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZQorcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIKK0NvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKK211c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9wPgorCis8cD48Yj41LiBOTyBXQVJSQU5UWTwvYj48L3A+CisKKzxwPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUworUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLAorQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZCitPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5CityZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQKK2Rpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cworZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwordGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywKK2RhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yCitpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy48L3A+CisKKzxwPjxiPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9iPjwvcD4KKworPHA+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UCitOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULAorSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORworV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUgorRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9wPgorCis8cD48Yj43LiBHRU5FUkFMPC9iPjwvcD4KKworPHA+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKK2FwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvciBlbmZvcmNlYWJpbGl0eSBvZgordGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIgYWN0aW9uCitieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtCitleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvcD4KKworPHA+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5CisoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKK1Byb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGggb3RoZXIKK3NvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAorUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUKK2RhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLjwvcD4KKworPHA+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQKK2ZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IgY29uZGl0aW9ucyBvZiB0aGlzCitBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZQorYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzCit1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAorZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKK1JlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQorUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLjwvcD4KKworPHA+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMKK0FncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcworY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUKK0FncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nCityZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUKK0FncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZQorRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEKK3N1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUKK2dpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtIChpbmNsdWRpbmcKK0NvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUKK0FncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uCitvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzCitleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubworcmlnaHRzIG9yIGxpY2Vuc2VzIHRvIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyCit0aGlzIEFncmVlbWVudCwgd2hldGhlciBleHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvcgorb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzCitBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvcD4KKworPHA+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZAordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5Cit0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMgQWdyZWVtZW50IG1vcmUKK3RoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMgaXRzCityaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3A+CisKKworCis8L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/LS0+Cis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Cis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KKzx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgorPC9oZWFkPgorCis8Ym9keSBsYW5nPSJFTi1VUyI+Cis8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKzxwPkZlYnJ1YXJ5IDEsIDIwMTE8L3A+CisKKzxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKworPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisgICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKKyAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbworIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCis8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCitkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gCitzb3VyY2UgY29kZQorICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIAorYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKworPHVsPgorICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gCitmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgCittb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCisoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+CisgICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSYjODQ4MjsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgCitGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgCitzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyAKK25hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIAorb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIAorRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIAorbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorPC91bD4KKworPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSAKK2NvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCAKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueQorIGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKzwvdWw+CisKKzxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIAoraW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0CisgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKK2luc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSAKK0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgCitjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSAKK2ZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgCitmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgorU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSAKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgCitnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIAorVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuCisgIFNPTUUgT0YgVEhFU0UKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCis8dWw+CisgICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgorICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+CisgICAgICAgPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgCitDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIAorb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCitjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgCitnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIAorZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCisgICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIAorYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyAKK2NhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKyAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IAorcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwKKyBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKKyAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0bworIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyAKK1RlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIAorVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCAKK3RoZQorICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgCithY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIAord2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIAorZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKKyAgICAgICBwcm9kdWN0LjwvbGk+CisgICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAKK21heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisgICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIAordGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKyAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSAKK1NvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdAorIGdvdmVybgorICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCAKK3VzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiAKK1Vwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgCit3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KKzwvb2w+CisKKzxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCis8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUKKyBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIAorYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gCitzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAorY29uY2VybmluZyB0aGUgaW1wb3J0LAorICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiAKK3RoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2xvZzRqLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg1MTRjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjIExvZyBjb25maWd1cmF0aW9uIGZvciBYdGV4dCBsb2dnaW5nLgorIyBUaGlzIGxvZyBjb25maWd1cmF0aW9uIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5vbi1VSSBwYXJ0cyBvZiBYdGV4dC4KKyMKKyMgRm9yIHlvdXIgY29udmVuaWVuY2U6IHZhbGlkIGxvZyBsZXZlbHMgYXJlIChmcm9tIGxlYXN0IHRvIG1vc3Qgc2lnbmlmaWNhbnQpOgorIyBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SIGFuZCBGQVRBTAorIyBMb2c0SiBtYW51YWw6IGh0dHA6Ly9sb2dnaW5nLmFwYWNoZS5vcmcvbG9nNGovMS4yL21hbnVhbC5odG1sCisjIFh0ZXh0IGxvZyBjb25maWd1cmF0aW9uIGluZm86IGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL1h0ZXh0X1Byb2plY3RfUGxhbi9GZWF0dXJlcy9Mb2dnaW5nCisKKyMgUm9vdCBsb2dnZXIgY29uZmlndXJhdGlvbi4gRG9uJ3QgY2hhbmdlIHRoaXMuCitsb2c0ai5yb290TG9nZ2VyPUlORk8sIGRlZmF1bHQKKworIyBUaGlzIGFwcGVuZGVyIHdpbGwgd3JpdGUgdG8gdGhlIHN0ZG91dCBjb25zb2xlCitsb2c0ai5hcHBlbmRlci5kZWZhdWx0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5kZWZhdWx0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKK2xvZzRqLmFwcGVuZGVyLmRlZmF1bHQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSUtNHIgWyV0XSAlLTVwICUzNS4zNWMgJXggLSAlbSVuCisKKyMgQ29uZmlndXJlIHlvdXIgbG9nIGNhdGVnb3JpZXMgYmVsb3c6Citsb2c0ai5sb2dnZXIub3JnLmVjbGlwc2UueHRleHQ9SU5GTworbG9nNGoubG9nZ2VyLm9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNldHJlZS5yZWNvbnN0cj1JTkZPClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9tb2RlbC9DaGFydERTTC54Y29yZSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbW9kZWwvQ2hhcnREU0wueGNvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkM2VhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvbW9kZWwvQ2hhcnREU0wueGNvcmUKQEAgLTAsMCArMSwxNzUgQEAKK0BHZW5Nb2RlbChmaWxlRXh0ZW5zaW9ucz0iY2hhcnQiKQorQEdlbk1vZGVsKG1vZGVsTmFtZT0iQ2hhcnREU0wiKQorQEdlbk1vZGVsKHByZWZpeD0iQ2hhcnREU0wiKQorQEdlbk1vZGVsKGNvcHlyaWdodFRleHQ9IkNvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgCisgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisKKyBCYXNlZCBvbiBpZGVhcyBmcm9tIFh0ZXh0LCBYdGVuZCwgWGNvcmUKKyAgCisgQ29udHJpYnV0b3JzOiAgCisgCQlKb2VyZyBSaWVnZWwgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorICIpCitARWNvcmUobnNVUkk9Imh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMIikKK0BFY29yZShuc1ByZWZpeD0iY2hhcnRkc2wiKQorQEVjb3JlKHJvb3RQYWNrYWdlPSJjaGFydGRzbCIpCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRBeGlzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydERlZmluaXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuYXBpLkVjb3JlVXRpbDMKKworY2xhc3MgQ2hhcnRNb2RlbCB7CisJY29udGFpbnMgQ2hhcnRQYWNrYWdlW10gcGFja2FnZXMKK30KKwordHlwZSBJbnRlcm5hbEVPYmplY3Qgd3JhcHMgSW50ZXJuYWxFT2JqZWN0CisKK2NsYXNzIENoYXJ0TGF6eVJlc29sdmVyIHsKKwlvcCBFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KSB7CisJCXJldHVybiBFY29yZVV0aWwzLnJlc29sdmUocHJveHksIHRoaXMuZVJlc291cmNlKCkucmVzb3VyY2VTZXQpOworCX0KK30KKworY2xhc3MgQ2hhcnRCYXNlIGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJ7CisJU3RyaW5nIG5hbWUKK30KKworY2xhc3MgQ2hhcnRQYWNrYWdlIGV4dGVuZHMgTFBhY2thZ2V7CisJY29udGFpbnMgQ2hhcnRbXSBjaGFydHMKK30KKworY2xhc3MgQ2hhcnQgZXh0ZW5kcyBDaGFydEJhc2V7CisJYm9vbGVhbiBkZXNjcmlwdGlvbgorCVN0cmluZyBkZXNjcmlwdGlvblZhbHVlCisJYm9vbGVhbiBwb2xsaW5nCisJaW50IHBvbGxpbmdUaW1lCisJY29udGFpbnMgQ2hhcnRPcHRpb24gY2hhcnR0eXBlIAorCWNvbnRhaW5zIENoYXJ0RGF0YW1hcnQgc291cmNlCit9CisKK2ludGVyZmFjZSBDaGFydE9wdGlvbiBleHRlbmRzIENoYXJ0TGF6eVJlc29sdmVye30KKworY2xhc3MgQ2hhcnRCYXIgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJYm9vbGVhbiBzaGFkb3cKKwlib29sZWFuIGFuaW1hdGVkCisJYm9vbGVhbiBzd2FwcGVkCisJYm9vbGVhbiBzdGFja2VkCit9CisKK2NsYXNzIENoYXJ0TGluZSBleHRlbmRzIENoYXJ0T3B0aW9uIHsKKwlib29sZWFuIGFuaW1hdGVkCisJYm9vbGVhbiBzaG93TWFya2VyCisJYm9vbGVhbiB0cmVuZExpbmUKKwlib29sZWFuIHpvb20KKwlib29sZWFuIGN1cnNvcgorCWJvb2xlYW4gdG9vbHRpcAorCWJvb2xlYW4gZmlsbFRvWmVybworCWJvb2xlYW4gZmlsbEFyZWEKK30KKworY2xhc3MgQ2hhcnRQaWUgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJYm9vbGVhbiBlbXB0eQorfQorCitjbGFzcyBDaGFydERvbnV0IGV4dGVuZHMgQ2hhcnRPcHRpb24geworfQorCitjbGFzcyBDaGFydEJ1YmJsZSBleHRlbmRzIENoYXJ0T3B0aW9uIHsKKwlib29sZWFuIG11bHRpcGxpZXIKKwlTdHJpbmcgbXVsdGlwbGllclZhbHVlIAorCWJvb2xlYW4gZ3JhZGllbnQKKwlib29sZWFuIHRyYW5zcGFyZW50Cit9CisKK2NsYXNzIENoYXJ0R2F1Z2UgZXh0ZW5kcyBDaGFydE9wdGlvbiB7CisJYm9vbGVhbiBsYWJlbGVkCisJU3RyaW5nIGxhYmVsVmFsdWUKKwlib29sZWFuIGhhc1RpY2tzCisJaW50IG1pblZhbHVlCisJaW50IG1heFZhbHVlCisJYm9vbGVhbiBoYXNJbnRlcnZhbHMKKwljb250YWlucyBDaGFydEludGVydmFsW10gaW50ZXJ2YWxzCit9CisKK2NsYXNzIENoYXJ0VHJlZSBleHRlbmRzIENoYXJ0T3B0aW9uIHsKKwlib29sZWFuIG1hcAorCWJvb2xlYW4gY29sbGFwc2libGUKK30KKworaW50ZXJmYWNlIENoYXJ0SW50ZXJ2YWwgZXh0ZW5kcyBDaGFydExhenlSZXNvbHZlciB7fQorCitjbGFzcyBDaGFydE51bWJlckludGVydmFsIGV4dGVuZHMgQ2hhcnRJbnRlcnZhbCB7CisJaW50IG51bWJlckludGVydmFsVmFsdWUKKwljb250YWlucyBDaGFydFJhbmdlRWxlbWVudCBudW1iZXJSYW5nZQorfQorCitjbGFzcyBDaGFydERhdGFtYXJ0IGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIgeworCXJlZmVycyBEYXRhbWFydERlZmluaXRpb24gZGF0YW1hcnRSZWYKKwljb250YWlucyBDaGFydEVsZW1lbnRbXSBlbGVtZW50cworfQorCitpbnRlcmZhY2UgQ2hhcnRFbGVtZW50IGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXJ7fQorCitjbGFzcyBDaGFydExlZ2VuZCBleHRlbmRzIENoYXJ0RWxlbWVudCB7CisJTGVnZW5kUGxhY2VtZW50RW51bSBwbGFjZW1lbnQKKwlib29sZWFuIHRvZ2dsZQorCWJvb2xlYW4gcmVwbG90CisJVG9nZ2xlVHlwZUVudW0gdG9nZ2xlVHlwZQorfQorCitjbGFzcyBDaGFydEhpZ2hsaWdodGVyIGV4dGVuZHMgQ2hhcnRFbGVtZW50IHsKKwlUb29sdGlwTG9jYXRpb25FbnVtIGxvY2F0aW9uCisJYm9vbGVhbiB0b29sdGlwQWx3YXlzCisJYm9vbGVhbiBpbnNpZGVDaGFydAorfQorCitjbGFzcyBDaGFydEF4aXMgZXh0ZW5kcyBDaGFydEVsZW1lbnQgeworCXJlZmVycyBEYXRhbWFydEF4aXMgYXhpcworCVJlbmRlclR5cGVFbnVtIHJlbmRlclR5cGUKKwlib29sZWFuIHNob3J0TGFiZWwKKwlpbnQgYW5nbGUKK30KKworaW50ZXJmYWNlIENoYXJ0UmFuZ2VFbGVtZW50IGV4dGVuZHMgQ2hhcnRMYXp5UmVzb2x2ZXIge30KKworY2xhc3MgQ2hhcnRTZWdtZW50Q29sb3IgZXh0ZW5kcyBDaGFydFJhbmdlRWxlbWVudCB7CisJU3RyaW5nIHJnYgorfQorCitlbnVtIExlZ2VuZFBsYWNlbWVudEVudW17CisJIElOU0lERSBhcyAnaW5zaWRlJworCSBJTlNJREVfR1JJRCBhcyAnaW5zaWRlLWdyaWQnCisJIE9VVFNJREUgYXMgJ291dHNpZGUnCisJIE9VVFNJREVfR1JJRCBhcyAnb3V0c2lkZS1ncmlkJworIH0KKworZW51bSBUb2dnbGVUeXBlRW51bXsKKwlOT1JNQUwgYXMgJ25vcm1hbCcKKwlTTE9XIGFzICdzbG93JworCUZBU1QgYXMgJ2Zhc3QnCit9CisJCitlbnVtIFRvb2x0aXBMb2NhdGlvbkVudW17CisJTk9SVEggYXMgJ25vcnRoJworCU5PUlRIX0VBU1QgYXMgJ25vcnRoLWVhc3QnCisJRUFTVCBhcyAnZWFzdCcKKwlTT1VUSF9FQVNUIGFzICdzb3V0aC1lYXN0JworCVNPVVRIIGFzICdzb3V0aCcKKwlTT1VUSF9XRVNUIGFzICdzb3V0aC13ZXN0JworCVdFU1QgYXMgJ3dlc3QnCisJTk9SVEhfV0VTVCBhcyAnbm9ydGgtd2VzdCcKK30KKwkKK2VudW0gUmVuZGVyVHlwZUVudW17CisJQ0FURUdPUlkgYXMgJ2NhdGVnb3J5JworCUxJTkVBUiBhcyAnbGluZWFyJworCURBVEUgYXMgJ2RhdGUnCisJTE9HIGFzICdsb2dhcml0aG1pYycKKwlQWVJBTUlEIGFzICdweXJhbWlkJworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9wbHVnaW4ucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvcGx1Z2luLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NzI1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorIyAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKKyMgIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAKKyMgIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IAorIyAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgCisjIAorIyAgQmFzZWQgb24gaWRlYXMgZnJvbSBYdGV4dCwgWHRlbmQsIFhjb3JlCisjICAgCisjICBDb250cmlidXRvcnM6ICAKKyMgIAkJSm9lcmcgUmllZ2VsIC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyMgIAorCitwbHVnaW5OYW1lID0gQ2hhcnREU0wgTW9kZWwKK3Byb3ZpZGVyTmFtZSA9IHd3dy5leGFtcGxlLm9yZwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2U1M2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3BsdWdpbi54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgIDxwYWNrYWdlIAorICAgICAgIHVyaSA9ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9jaGFydC9DaGFydERTTCIgCisgICAgICAgY2xhc3MgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydGRzbC5jaGFydERTTC5DaGFydERTTFBhY2thZ2UiCisgICAgICAgZ2VuTW9kZWwgPSAib3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydGRzbC9DaGFydERTTC5nZW5tb2RlbCIgLz4gCisJCisgIDwvZXh0ZW5zaW9uPgorCisKKworCisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgICAgPCEtLSBAZ2VuZXJhdGVkIGNoYXJ0ZHNsIC0tPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvY2hhcnQvQ2hhcnREU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvY2hhcnRkc2wueGNvcmUiLz4KKyAgIDwvZXh0ZW5zaW9uPgorCis8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QxYzIyCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9wb20ueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVjbGlwc2UtcGx1Z2luPC9wYWNrYWdpbmc+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmU1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vUkVBRE1FLnR4dApAQCAtMCwwICsxIEBACitkdW1teSBmaWxlIG5lZWRlZCBmb3IgZ2l0IGZvciBuZWNlc3NhcnkgYnV0IGVtcHR5IGRpcmVjdG9yaWVzIQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0Fic3RyYWN0Q2hhcnREU0xSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NzhlZjcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZS5qYXZhCkBAIC0wLDAgKzEsMzUyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkRlZmF1bHRSdW50aW1lTW9kdWxlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXM7CisKKy8qKgorICogTWFudWFsIG1vZGlmaWNhdGlvbnMgZ28gdG8ge29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xSdW50aW1lTW9kdWxlfQorICovCisgQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDaGFydERTTFJ1bnRpbWVNb2R1bGUgZXh0ZW5kcyBEZWZhdWx0UnVudGltZU1vZHVsZSB7CisKKwlwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShCaW5kZXIgYmluZGVyKSB7CisJCXByb3BlcnRpZXMgPSB0cnlCaW5kUHJvcGVydGllcyhiaW5kZXIsICJvcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMLnByb3BlcnRpZXMiKTsKKwkJc3VwZXIuY29uZmlndXJlKGJpbmRlcik7CisJfQorCQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxhbmd1YWdlTmFtZShCaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChDb25zdGFudHMuTEFOR1VBR0VfTkFNRSkpLnRvSW5zdGFuY2UoIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wiKTsKKwl9CisJCisJcHVibGljIHZvaWQgY29uZmlndXJlRmlsZUV4dGVuc2lvbnMoQmluZGVyIGJpbmRlcikgeworCQlpZiAocHJvcGVydGllcyA9PSBudWxsIHx8IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZJTEVfRVhURU5TSU9OUykgPT0gbnVsbCkKKwkJCWJpbmRlci5iaW5kKFN0cmluZy5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChDb25zdGFudHMuRklMRV9FWFRFTlNJT05TKSkudG9JbnN0YW5jZSgiY2hhcnQiKTsKKwl9CisJCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNlcmlhbGl6ZXIuU2VyaWFsaXplckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JU2VtYW50aWNTZXF1ZW5jZXI+IGJpbmRJU2VtYW50aWNTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcmlhbGl6ZXIuQ2hhcnREU0xTZW1hbnRpY1NlcXVlbmNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3Iuc2VyaWFsaXplci5TZXJpYWxpemVyRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklTeW50YWN0aWNTZXF1ZW5jZXI+IGJpbmRJU3ludGFjdGljU2VxdWVuY2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJpYWxpemVyLkNoYXJ0RFNMU3ludGFjdGljU2VxdWVuY2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5JU2VyaWFsaXplcj4gYmluZElTZXJpYWxpemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5pbXBsLlNlcmlhbGl6ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5JUGFyc2VyPiBiaW5kSVBhcnNlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQucGFyc2VyLmFudGxyLkNoYXJ0RFNMUGFyc2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuSVRva2VuVG9TdHJpbmdDb252ZXJ0ZXI+IGJpbmRJVG9rZW5Ub1N0cmluZ0NvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuVG9TdHJpbmdDb252ZXJ0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcj4gYmluZElBbnRsclRva2VuRmlsZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHIuQ2hhcnREU0xBbnRsclRva2VuRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXI+IGJpbmRMZXhlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQ2hhcnREU0xMZXhlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjxvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbENoYXJ0RFNMTGV4ZXI+IHByb3ZpZGVJbnRlcm5hbENoYXJ0RFNMTGV4ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJQcm92aWRlci5jcmVhdGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxDaGFydERTTExleGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJ1bnRpbWVMZXhlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlckJpbmRpbmdzLlJVTlRJTUUpKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbENoYXJ0RFNMTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSVRva2VuRGVmUHJvdmlkZXI+IGJpbmRJVG9rZW5EZWZQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsclRva2VuRGVmUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JVW5vcmRlcmVkR3JvdXBIZWxwZXI+IGJpbmRJVW5vcmRlcmVkR3JvdXBIZWxwZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuVW5vcmRlcmVkR3JvdXBIZWxwZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnZhbGlkYXRpb24uVmFsaWRhdG9yRnJhZ21lbnQKKwlAb3JnLmVjbGlwc2UueHRleHQuc2VydmljZS5TaW5nbGV0b25CaW5kaW5nKGVhZ2VyPXRydWUpCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC52YWxpZGF0aW9uLkNoYXJ0RFNMVmFsaWRhdG9yPiBiaW5kQ2hhcnREU0xWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnZhbGlkYXRpb24uQ2hhcnREU0xWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNjb3BpbmcuQWJzdHJhY3RTY29waW5nRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJZ25vcmVDYXNlTGlua2luZyhjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kQ29uc3RhbnQoKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSWdub3JlQ2FzZUxpbmtpbmcuY2xhc3MpLnRvKGZhbHNlKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUNvbnRhaW5lci5NYW5hZ2VyPiBiaW5kSUNvbnRhaW5lciRNYW5hZ2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5TdGF0ZUJhc2VkQ29udGFpbmVyTWFuYWdlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5JQWxsQ29udGFpbmVyc1N0YXRlLlByb3ZpZGVyPiBiaW5kSUFsbENvbnRhaW5lcnNTdGF0ZSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuUmVzb3VyY2VTZXRCYXNlZEFsbENvbnRhaW5lcnNTdGF0ZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0QmFzZWRSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUmVzb3VyY2VEZXNjcmlwdGlvbnNQZXJzaXN0ZWQoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlRGVzY3JpcHRpb25zUHJvdmlkZXIuUEVSU0lTVEVEX0RFU0NSSVBUSU9OUykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRCYXNlZFJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZm9ybWF0dGluZy5Gb3JtYXR0ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5JRm9ybWF0dGVyPiBiaW5kSUZvcm1hdHRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZm9ybWF0dGluZy5DaGFydERTTEZvcm1hdHRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuVHlwZXNGYWN0b3J5IGJpbmRUeXBlc0ZhY3RvcnlUb0luc3RhbmNlKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5hY2Nlc3MuSUp2bVR5cGVQcm92aWRlci5GYWN0b3J5PiBiaW5kSUp2bVR5cGVQcm92aWRlciRGYWN0b3J5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5DbGFzc3BhdGhUeXBlUHJvdmlkZXJGYWN0b3J5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcj4gYmluZEFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuQ2xhc3NwYXRoQmFzZWRUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuSUV2YWx1YXRpb25Db250ZXh0PiBiaW5kSUV2YWx1YXRpb25Db250ZXh0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5EZWZhdWx0RXZhbHVhdGlvbkNvbnRleHQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLklFeHByZXNzaW9uSW50ZXJwcmV0ZXI+IGJpbmRJRXhwcmVzc2lvbkludGVycHJldGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuaW50ZXJwcmV0ZXIuaW1wbC5YYmFzZUludGVycHJldGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXI+IGJpbmRJUXVhbGlmaWVkTmFtZUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlUXVhbGlmaWVkTmFtZUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI+IGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5YYmFzZVF1YWxpZmllZE5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlPiBiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbnZlcnNpb24uWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUxpbmtpbmdJU2NvcGVQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQubGlua2luZy5MaW5raW5nU2NvcGVQcm92aWRlckJpbmRpbmcuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSUJhdGNoU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVTZXJpYWxpemVySVNjb3BlUHJvdmlkZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZVByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIudG9rZW5zLlNlcmlhbGl6ZXJTY29wZVByb3ZpZGVyQmluZGluZy5jbGFzcykudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VyaWFsaXplci5TZXJpYWxpemVyU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJU2NvcGVQcm92aWRlckRlbGVnYXRlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChOYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZVNjb3BlUHJvdmlkZXIuTkFNRURfREVMRUdBVEUpKS50byhvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlSW1wb3J0ZWROYW1lc3BhY2VTY29wZVByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubGlua2luZy5JTGlua2VyPiBiaW5kSUxpbmtlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpbmtpbmcuWGJhc2VMYXp5TGlua2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5YdGV4dFJlc291cmNlPiBiaW5kWHRleHRSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnJlc291cmNlLkJhdGNoTGlua2FibGVSZXNvdXJjZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yPiBiaW5kSnZtVHlwZVJlZmVyZW5jZXNWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5mZWF0dXJlY2FsbHMuSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyPiBiaW5kSWRlbnRpZmlhYmxlU2ltcGxlTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmVhdHVyZWNhbGxzLklkZW50aWZpYWJsZVNpbXBsZU5hbWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSURlcml2ZWRTdGF0ZUNvbXB1dGVyPiBiaW5kSURlcml2ZWRTdGF0ZUNvbXB1dGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtTW9kZWxBc3NvY2lhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbi5NYW5hZ2VyPiBiaW5kSVJlc291cmNlRGVzY3JpcHRpb24kTWFuYWdlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VEZXNjcmlwdGlvbk1hbmFnZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5JR2VuZXJhdG9yPiBiaW5kSUdlbmVyYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkp2bU1vZGVsR2VuZXJhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeSBiaW5kWHR5cGVGYWN0b3J5VG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlRmFjdG9yeS5lSU5TVEFOQ0U7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmRlYnVnLklTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQ+IGJpbmRJU3RyYXR1bUJyZWFrcG9pbnRTdXBwb3J0KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZGVidWcuWGJhc2VTdHJhdHVtQnJlYWtwb2ludFN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5MaW5lU2VwYXJhdG9ySGFybW9uaXplcj4gYmluZExpbmVTZXBhcmF0b3JIYXJtb25pemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIub3V0cHV0LlRyYWNlQXdhcmVQb3N0UHJvY2Vzc29yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRGVmYXVsdFJlc291cmNlRGVzY3JpcHRpb25TdHJhdGVneT4gYmluZElEZWZhdWx0UmVzb3VyY2VEZXNjcmlwdGlvblN0cmF0ZWd5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UucmVzb3VyY2UuWGJhc2VSZXNvdXJjZURlc2NyaXB0aW9uU3RyYXRlZ3kuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uU2V2ZXJpdHlDb252ZXJ0ZXI+IGJpbmRTZXZlcml0eUNvbnZlcnRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnZhbGlkYXRpb24uWGJhc2VTZXZlcml0eUNvbnZlcnRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Db25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXI+IGJpbmRDb25maWd1cmFibGVJc3N1ZUNvZGVzUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLlhiYXNlQ29uZmlndXJhYmxlSXNzdWVDb2Rlcy5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuRU9iamVjdEF0T2Zmc2V0SGVscGVyPiBiaW5kRU9iamVjdEF0T2Zmc2V0SGVscGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGlua2luZy5Ccm9rZW5Db25zdHJ1Y3RvckNhbGxBd2FyZUVPYmplY3RBdE9mZnNldEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5DYW5jZWxhYmxlRGlhZ25vc3RpY2lhbj4gYmluZENhbmNlbGFibGVEaWFnbm9zdGljaWFuKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5YYmFzZURpYWdub3N0aWNpYW4uY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuZmVhdHVyZWNhbGxzLlN0YXRpY0ltcGxpY2l0TWV0aG9kc0ZlYXR1cmVGb3JUeXBlUHJvdmlkZXIuRXh0ZW5zaW9uQ2xhc3NOYW1lUHJvdmlkZXI+IGJpbmRTdGF0aWNJbXBsaWNpdE1ldGhvZHNGZWF0dXJlRm9yVHlwZVByb3ZpZGVyJEV4dGVuc2lvbkNsYXNzTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5iYXRjaC5JbXBsaWNpdGx5SW1wb3J0ZWRUeXBlc0FkYXB0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLk11dGFibGVGaWxlU3lzdGVtU3VwcG9ydD4gYmluZE11dGFibGVGaWxlU3lzdGVtU3VwcG9ydCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuSmF2YUlPRmlsZVN5c3RlbVN1cHBvcnQuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZW5kLmxpYi5tYWNyby5maWxlLkZpbGVMb2NhdGlvbnM+IGJpbmRGaWxlTG9jYXRpb25zKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5GaWxlTG9jYXRpb25zSW1wbC5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5Xb3Jrc3BhY2VDb25maWc+PiBwcm92aWRlV29ya3NwYWNlQ29uZmlnKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmlsZS5SdW50aW1lV29ya3NwYWNlQ29uZmlnUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uY29tcHV0YXRpb24uSVR5cGVDb21wdXRlcj4gYmluZElUeXBlQ29tcHV0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zVHlwZUNvbXB1dGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmJhdGNoLlhiYXNlQmF0Y2hTY29wZVByb3ZpZGVyPiBiaW5kWGJhc2VCYXRjaFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5saW5raW5nLklMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcj4gYmluZElMaW5raW5nRGlhZ25vc3RpY01lc3NhZ2VQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnZhbGlkYXRpb24uVW5yZXNvbHZlZEFubm90YXRpb25UeXBlQXdhcmVNZXNzYWdlUHJvZHVjZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklMb2NhdGlvbkluRmlsZVByb3ZpZGVyPiBiaW5kSUxvY2F0aW9uSW5GaWxlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1Mb2NhdGlvbkluRmlsZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklHbG9iYWxTY29wZVByb3ZpZGVyPiBiaW5kSUdsb2JhbFNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMueHRleHQuVHlwZXNBd2FyZURlZmF1bHRHbG9iYWxTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkZlYXR1cmVOYW1lVmFsaWRhdG9yPiBiaW5kRmVhdHVyZU5hbWVWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLkxvZ2ljYWxDb250YWluZXJBd2FyZUZlYXR1cmVOYW1lVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkRlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRCYXRjaFR5cGVSZXNvbHZlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuTG9naWNhbENvbnRhaW5lckF3YXJlQmF0Y2hUeXBlUmVzb2x2ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnR5cGVzeXN0ZW0uaW50ZXJuYWwuRGVmYXVsdFJlZW50cmFudFR5cGVSZXNvbHZlcj4gYmluZERlZmF1bHRSZWVudHJhbnRUeXBlUmVzb2x2ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkxvZ2ljYWxDb250YWluZXJBd2FyZVJlZW50cmFudFR5cGVSZXNvbHZlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5JUmVzb3VyY2VWYWxpZGF0b3I+IGJpbmRJUmVzb3VyY2VWYWxpZGF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLkRlcml2ZWRTdGF0ZUF3YXJlUmVzb3VyY2VWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1Nb2RlbEluZmVycmVyPiBiaW5kSUp2bU1vZGVsSW5mZXJyZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0Lmp2bW1vZGVsLkNoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ3JhbW1hckFjY2Vzcy5HcmFtbWFyQWNjZXNzRnJhZ21lbnQKKwlwdWJsaWMgamF2YS5sYW5nLkNsYXNzTG9hZGVyIGJpbmRDbGFzc0xvYWRlclRvSW5zdGFuY2UoKSB7CisJCXJldHVybiBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdyYW1tYXJBY2Nlc3MuR3JhbW1hckFjY2Vzc0ZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5JR3JhbW1hckFjY2Vzcz4gYmluZElHcmFtbWFyQWNjZXNzKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJ2aWNlcy5DaGFydERTTEdyYW1tYXJBY2Nlc3MuY2xhc3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzdlNzdiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuSVNldHVwOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCisvKioKKyAqIEdlbmVyYXRlZCBmcm9tIFN0YW5kYWxvbmVTZXR1cC54cHQhCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkIGltcGxlbWVudHMgSVNldHVwIHsKKworCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCkgeworCQlvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5YYmFzZVdpdGhBbm5vdGF0aW9uc1N0YW5kYWxvbmVTZXR1cC5kb1NldHVwKCk7CisKKwkJSW5qZWN0b3IgaW5qZWN0b3IgPSBjcmVhdGVJbmplY3RvcigpOworCQlyZWdpc3RlcihpbmplY3Rvcik7CisJCXJldHVybiBpbmplY3RvcjsKKwl9CisJCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yKCkgeworCQlyZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xSdW50aW1lTW9kdWxlKCkpOworCX0KKwkKKwlwdWJsaWMgdm9pZCByZWdpc3RlcihJbmplY3RvciBpbmplY3RvcikgeworCisJCW9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkgcmVzb3VyY2VGYWN0b3J5ID0gaW5qZWN0b3IuZ2V0SW5zdGFuY2Uob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeS5jbGFzcyk7CisJCW9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2VQcm92aWRlciBzZXJ2aWNlUHJvdmlkZXIgPSBpbmplY3Rvci5nZXRJbnN0YW5jZShvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOworCQlSZXNvdXJjZS5GYWN0b3J5LlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiY2hhcnQiLCByZXNvdXJjZUZhY3RvcnkpOworCQlvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJjaGFydCIsIHNlcnZpY2VQcm92aWRlcik7CisJCQorCisKKworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9DaGFydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9DaGFydERTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDJhZTA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL0NoYXJ0RFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JQW50bHJUb2tlbkZpbGVQcm92aWRlcjsKKworcHVibGljIGNsYXNzIENoYXJ0RFNMQW50bHJUb2tlbkZpbGVQcm92aWRlciBpbXBsZW1lbnRzIElBbnRsclRva2VuRmlsZVByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0QW50bHJUb2tlbkZpbGUoKSB7CisJCUNsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpOworICAgIAlyZXR1cm4gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbSgib3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC50b2tlbnMiKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvQ2hhcnREU0xQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9DaGFydERTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZDFiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvQ2hhcnREU0xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQucGFyc2VyLmFudGxyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJ2aWNlcy5DaGFydERTTEdyYW1tYXJBY2Nlc3M7CisKK3B1YmxpYyBjbGFzcyBDaGFydERTTFBhcnNlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BYnN0cmFjdEFudGxyUGFyc2VyIHsKKwkKKwlASW5qZWN0CisJcHJpdmF0ZSBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsSGlkZGVuVG9rZW5zKFh0ZXh0VG9rZW5TdHJlYW0gdG9rZW5TdHJlYW0pIHsKKwkJdG9rZW5TdHJlYW0uc2V0SW5pdGlhbEhpZGRlblRva2VucygiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbENoYXJ0RFNMUGFyc2VyIGNyZWF0ZVBhcnNlcihYdGV4dFRva2VuU3RyZWFtIHN0cmVhbSkgeworCQlyZXR1cm4gbmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQ2hhcnREU0xQYXJzZXIoc3RyZWFtLCBnZXRHcmFtbWFyQWNjZXNzKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUgCisJcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0UnVsZU5hbWUoKSB7CisJCXJldHVybiAiQ2hhcnRNb2RlbCI7CisJfQorCQorCXB1YmxpYyBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ3JhbW1hckFjY2VzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworCQl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjZmI1NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nCkBAIC0wLDAgKzEsODYyNiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworZ3JhbW1hciBJbnRlcm5hbENoYXJ0RFNMOworCitvcHRpb25zIHsKKwlzdXBlckNsYXNzPUFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKKwkKK30KKworQGxleGVyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnBhcnNlci5hbnRsci5pbnRlcm5hbDsgCisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLlh0ZXh0VG9rZW5TdHJlYW0uSGlkZGVuVG9rZW5zOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5BbnRsckRhdGF0eXBlUnVsZVRva2VuOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2VydmljZXMuQ2hhcnREU0xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworCisgCXByaXZhdGUgQ2hhcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgCQorICAgIHB1YmxpYyBJbnRlcm5hbENoYXJ0RFNMUGFyc2VyKFRva2VuU3RyZWFtIGlucHV0LCBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICAgICAgcmVnaXN0ZXJSdWxlcyhncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RSdWxlTmFtZSgpIHsKKyAgICAJcmV0dXJuICJDaGFydE1vZGVsIjsJCisgICAJfQorICAgCQorICAgCUBPdmVycmlkZQorICAgCXByb3RlY3RlZCBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKyAgIAkJcmV0dXJuIGdyYW1tYXJBY2Nlc3M7CisgICAJfQorfQorCitAcnVsZWNhdGNoIHsgCisgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICB9IAorfQorCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0TW9kZWwKK2VudHJ5UnVsZUNoYXJ0TW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE1vZGVsUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRNb2RlbD1ydWxlQ2hhcnRNb2RlbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0TW9kZWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0TW9kZWwKK3J1bGVDaGFydE1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRNb2RlbEFjY2VzcygpLmdldFBhY2thZ2VzQ2hhcnRQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFja2FnZXNfMF8wPXJ1bGVDaGFydFBhY2thZ2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRNb2RlbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYWNrYWdlcyIsCisgICAgICAgIAkJbHZfcGFja2FnZXNfMF8wLCAKKyAgICAgICAgCQkiQ2hhcnRQYWNrYWdlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0UGFja2FnZQorZW50cnlSdWxlQ2hhcnRQYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRQYWNrYWdlPXJ1bGVDaGFydFBhY2thZ2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDaGFydFBhY2thZ2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0UGFja2FnZQorcnVsZUNoYXJ0UGFja2FnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldENoYXJ0UGFja2FnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3BhY2thZ2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9uYW1lXzJfMD1ydWxlUXVhbGlmaWVkTmFtZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8yXzAsIAorICAgICAgICAJCSJRdWFsaWZpZWROYW1lIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNDaGFydEltcG9ydFBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9pbXBvcnRzXzRfMD1ydWxlQ2hhcnRJbXBvcnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltcG9ydHMiLAorICAgICAgICAJCWx2X2ltcG9ydHNfNF8wLCAKKyAgICAgICAgCQkiQ2hhcnRJbXBvcnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKigKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRDaGFydHNDaGFydFBhcnNlclJ1bGVDYWxsXzNfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9jaGFydHNfNV8wPXJ1bGVDaGFydAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY2hhcnRzIiwKKyAgICAgICAgCQlsdl9jaGFydHNfNV8wLCAKKyAgICAgICAgCQkiQ2hhcnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzMoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydAorZW50cnlSdWxlQ2hhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUNoYXJ0PXJ1bGVDaGFydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydAorcnVsZUNoYXJ0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2NoYXJ0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldENoYXJ0S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldE5hbWVUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV8yXzA9cnVsZVRSQU5TTEFUQUJMRUlECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgCQkiVFJBTlNMQVRBQkxFSUQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgKKygKKwkJbHZfZGVzY3JpcHRpb25fM18wPQknZGVzY3JpYmVkIGJ5JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2Rlc2NyaXB0aW9uXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZGVzY3JpcHRpb24iLCB0cnVlLCAiZGVzY3JpYmVkIGJ5Iik7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uVmFsdWVUUkFOU0xBVEFCTEVTVFJJTkdQYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZXNjcmlwdGlvblZhbHVlIiwKKyAgICAgICAgCQlsdl9kZXNjcmlwdGlvblZhbHVlXzRfMCwgCisgICAgICAgIAkJIlRSQU5TTEFUQUJMRVNUUklORyIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPwlvdGhlcmx2XzU9J2FzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEFzS2V5d29yZF80KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldENoYXJ0dHlwZUNoYXJ0T3B0aW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9jaGFydHR5cGVfNl8wPXJ1bGVDaGFydE9wdGlvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjaGFydHR5cGUiLAorICAgICAgICAJCWx2X2NoYXJ0dHlwZV82XzAsIAorICAgICAgICAJCSJDaGFydE9wdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKAorKAorCQlsdl9wb2xsaW5nXzdfMD0JJ3BvbGxpbmcnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfcG9sbGluZ183XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRQb2xsaW5nUG9sbGluZ0tleXdvcmRfNl8wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJwb2xsaW5nIiwgdHJ1ZSwgInBvbGxpbmciKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9wb2xsaW5nVGltZV84XzA9UlVMRV9JTlQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfcG9sbGluZ1RpbWVfOF8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0UG9sbGluZ1RpbWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzZfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwb2xsaW5nVGltZSIsCisgICAgICAgIAkJbHZfcG9sbGluZ1RpbWVfOF8wLCAKKyAgICAgICAgCQkiSU5UIik7CisJICAgIH0KKworKQorKSk/KAlvdGhlcmx2Xzk9J3VzaW5nJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldFVzaW5nS2V5d29yZF83XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0U291cmNlQ2hhcnREYXRhbWFydFBhcnNlclJ1bGVDYWxsXzdfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9zb3VyY2VfMTBfMD1ydWxlQ2hhcnREYXRhbWFydAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJzb3VyY2UiLAorICAgICAgICAJCWx2X3NvdXJjZV8xMF8wLCAKKyAgICAgICAgCQkiQ2hhcnREYXRhbWFydCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0T3B0aW9uCitlbnRyeVJ1bGVDaGFydE9wdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRPcHRpb249cnVsZUNoYXJ0T3B0aW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRPcHRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0T3B0aW9uCitydWxlQ2hhcnRPcHRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydEJhclBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0QmFyXzA9cnVsZUNoYXJ0QmFyCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19DaGFydEJhcl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0TGluZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0TGluZV8xPXJ1bGVDaGFydExpbmUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0TGluZV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0UGllUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfQ2hhcnRQaWVfMj1ydWxlQ2hhcnRQaWUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0UGllXzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnREb251dFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0RG9udXRfMz1ydWxlQ2hhcnREb251dAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfQ2hhcnREb251dF8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0QnViYmxlUGFyc2VyUnVsZUNhbGxfNCgpKTsgCisgICAgfQorICAgIHRoaXNfQ2hhcnRCdWJibGVfND1ydWxlQ2hhcnRCdWJibGUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0QnViYmxlXzQuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRHYXVnZVBhcnNlclJ1bGVDYWxsXzUoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0R2F1Z2VfNT1ydWxlQ2hhcnRHYXVnZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfQ2hhcnRHYXVnZV81LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0VHJlZVBhcnNlclJ1bGVDYWxsXzYoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0VHJlZV82PXJ1bGVDaGFydFRyZWUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0VHJlZV82LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRCYXIKK2VudHJ5UnVsZUNoYXJ0QmFyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydEJhcj1ydWxlQ2hhcnRCYXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDaGFydEJhci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRCYXIKK3J1bGVDaGFydEJhciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0Q2hhcnRCYXJBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdiYXInIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0QmFyS2V5d29yZF8xKCkpOworICAgIH0KKygKKworKAorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCX0KKwkoCisJCSgKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigKKygKKwkJbHZfc2hhZG93XzNfMD0JJ3NoYWRlZCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9zaGFkb3dfM18wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0U2hhZG93U2hhZGVkS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInNoYWRvdyIsIHRydWUsICJzaGFkZWQiKTsKKwkgICAgfQorCispCispKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigKKygKKwkJbHZfYW5pbWF0ZWRfNF8wPQknYW5pbWF0ZWQnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfYW5pbWF0ZWRfNF8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0QW5pbWF0ZWRBbmltYXRlZEtleXdvcmRfMl8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJhbmltYXRlZCIsIHRydWUsICJhbmltYXRlZCIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9zd2FwcGVkXzVfMD0JJ3N3YXBwZWQnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfc3dhcHBlZF81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTd2FwcGVkU3dhcHBlZEtleXdvcmRfMl8yXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJzd2FwcGVkIiwgdHJ1ZSwgInN3YXBwZWQiKTsKKwkgICAgfQorCispCispKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMyl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAzKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigKKygKKwkJbHZfc3RhY2tlZF82XzA9CSdzdGFja2VkJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3N0YWNrZWRfNl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0U3RhY2tlZFN0YWNrZWRLZXl3b3JkXzJfM18wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAic3RhY2tlZCIsIHRydWUsICJzdGFja2VkIik7CisJICAgIH0KKworKQorKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICAKKworCQkpKgkKKwkpCispCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRMaW5lCitlbnRyeVJ1bGVDaGFydExpbmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydExpbmU9cnVsZUNoYXJ0TGluZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0TGluZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRMaW5lCitydWxlQ2hhcnRMaW5lIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q2hhcnRMaW5lQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nbGluZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0TGluZUtleXdvcmRfMSgpKTsKKyAgICB9CisoCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oCisoCisJCWx2X2FuaW1hdGVkXzNfMD0JJ2FuaW1hdGVkJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2FuaW1hdGVkXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRBbmltYXRlZEFuaW1hdGVkS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJhbmltYXRlZCIsIHRydWUsICJhbmltYXRlZCIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9zaG93TWFya2VyXzRfMD0JJ3Nob3dNYXJrZXInIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfc2hvd01hcmtlcl80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0U2hvd01hcmtlclNob3dNYXJrZXJLZXl3b3JkXzJfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInNob3dNYXJrZXIiLCB0cnVlLCAic2hvd01hcmtlciIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl90cmVuZExpbmVfNV8wPQkndHJlbmRMaW5lJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3RyZW5kTGluZV81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VHJlbmRMaW5lVHJlbmRMaW5lS2V5d29yZF8yXzJfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJ0cmVuZExpbmUiLCB0cnVlLCAidHJlbmRMaW5lIik7CisJICAgIH0KKworKQorKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMyl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMyk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oKAorKAorCQlsdl9jdXJzb3JfNl8wPQknY3Vyc29yJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2N1cnNvcl82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q3Vyc29yQ3Vyc29yS2V5d29yZF8yXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImN1cnNvciIsIHRydWUsICJjdXJzb3IiKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl96b29tXzdfMD0JJ3pvb20nIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfem9vbV83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Wm9vbVpvb21LZXl3b3JkXzJfM18xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiem9vbSIsIHRydWUsICJ6b29tIik7CisJICAgIH0KKworKQorKT8oCisoCisJCWx2X3Rvb2x0aXBfOF8wPQkndG9vbHRpcCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl90b29sdGlwXzhfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRUb29sdGlwVG9vbHRpcEtleXdvcmRfMl8zXzJfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJ0b29sdGlwIiwgdHJ1ZSwgInRvb2x0aXAiKTsKKwkgICAgfQorCispCispPykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDQpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDQpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9maWxsVG9aZXJvXzlfMD0JJ2ZpbGxaZXJvJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2ZpbGxUb1plcm9fOV8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEZpbGxUb1plcm9GaWxsWmVyb0tleXdvcmRfMl80XzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZmlsbFRvWmVybyIsIHRydWUsICJmaWxsWmVybyIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDUpfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDUpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KAorKAorCQlsdl9maWxsQXJlYV8xMF8wPQknZmlsbGVkJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2ZpbGxBcmVhXzEwXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0RmlsbEFyZWFGaWxsZWRLZXl3b3JkXzJfNV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImZpbGxBcmVhIiwgdHJ1ZSwgImZpbGxlZCIpOworCSAgICB9CisKKykKKykpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIAorCisJCSkqCQorCSkKKykKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRQaWUKK2VudHJ5UnVsZUNoYXJ0UGllIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydFBpZT1ydWxlQ2hhcnRQaWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDaGFydFBpZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRQaWUKK3J1bGVDaGFydFBpZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0Q2hhcnRQaWVBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdwaWUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0UGllS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJbHZfZW1wdHlfMl8wPQknZW1wdHknIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZW1wdHlfMl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllQWNjZXNzKCkuZ2V0RW1wdHlFbXB0eUtleXdvcmRfMl8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZW1wdHkiLCB0cnVlLCAiZW1wdHkiKTsKKwkgICAgfQorCispCispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0RG9udXQKK2VudHJ5UnVsZUNoYXJ0RG9udXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0UnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnREb251dD1ydWxlQ2hhcnREb251dCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0RG9udXQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0RG9udXQKK3J1bGVDaGFydERvbnV0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldENoYXJ0RG9udXRBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkb251dCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dEFjY2VzcygpLmdldERvbnV0S2V5d29yZF8xKCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0QnViYmxlCitlbnRyeVJ1bGVDaGFydEJ1YmJsZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRCdWJibGU9cnVsZUNoYXJ0QnViYmxlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRCdWJibGUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0QnViYmxlCitydWxlQ2hhcnRCdWJibGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldENoYXJ0QnViYmxlQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nYnViYmxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEJ1YmJsZUtleXdvcmRfMSgpKTsKKyAgICB9CisoCisKKygKKwl7IAorCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwl9CisJKAorCQkoCisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCk7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oKAorKAorCQlsdl9tdWx0aXBsaWVyXzNfMD0JJ211bHRpcGxpZXInIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfbXVsdGlwbGllcl8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyTXVsdGlwbGllcktleXdvcmRfMl8wXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIm11bHRpcGxpZXIiLCB0cnVlLCAibXVsdGlwbGllciIpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyVmFsdWVOdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPXJ1bGVOdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibXVsdGlwbGllclZhbHVlIiwKKyAgICAgICAgCQlsdl9tdWx0aXBsaWVyVmFsdWVfNF8wLCAKKyAgICAgICAgCQkiTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgfAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KCgKKygKKwkJbHZfZ3JhZGllbnRfNV8wPQknZ3JhZGllbnQnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZ3JhZGllbnRfNV8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0R3JhZGllbnRHcmFkaWVudEtleXdvcmRfMl8xXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImdyYWRpZW50IiwgdHJ1ZSwgImdyYWRpZW50Iik7CisJICAgIH0KKworKQorKQorICAgIHwoCisoCisJCWx2X3RyYW5zcGFyZW50XzZfMD0JJ3RyYW5zcGFyZW50JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3RyYW5zcGFyZW50XzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFRyYW5zcGFyZW50VHJhbnNwYXJlbnRLZXl3b3JkXzJfMV8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJ0cmFuc3BhcmVudCIsIHRydWUsICJ0cmFuc3BhcmVudCIpOworCSAgICB9CisKKykKKykpKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIAorCisJCSkrCisJICAJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSl9PwkKKwkpCispCisJeyAKKwkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0R2F1Z2UKK2VudHJ5UnVsZUNoYXJ0R2F1Z2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRHYXVnZT1ydWxlQ2hhcnRHYXVnZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0R2F1Z2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0R2F1Z2UKK3J1bGVDaGFydEdhdWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldENoYXJ0R2F1Z2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdnYXVnZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldEdhdWdlS2V5d29yZF8xKCkpOworICAgIH0KKygKKworKAorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCSgKKwkJKAorCisJCQkoIAorCQkJCXtnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApfT89PigKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKTsKKwkgCQkJCX0KKwkJCQkJKHt0cnVlfT89PigoCisoCisJCWx2X2xhYmVsZWRfM18wPQknbGFiZWwnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfbGFiZWxlZF8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldExhYmVsZWRMYWJlbEtleXdvcmRfMl8wXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAibGFiZWxlZCIsIHRydWUsICJsYWJlbCIpOworCSAgICB9CisKKykKKykoCisoCisJCWx2X2xhYmVsVmFsdWVfNF8wPVJVTEVfU1RSSU5HCisJCXsKKwkJCW5ld0xlYWZOb2RlKGx2X2xhYmVsVmFsdWVfNF8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRMYWJlbFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImxhYmVsVmFsdWUiLAorICAgICAgICAJCWx2X2xhYmVsVmFsdWVfNF8wLCAKKyAgICAgICAgCQkiU1RSSU5HIik7CisJICAgIH0KKworKQorKSkpCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCSAJCQkJfQorIAkJCQkpCisJCQkpICB8CisKKwkJCSggCisJCQkJe2dldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSl9Pz0+KAorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpOworCSAJCQkJfQorCQkJCQkoe3RydWV9Pz0+KCgKKygKKwkJbHZfaGFzVGlja3NfNV8wPQknaGFzVGlja3MnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfaGFzVGlja3NfNV8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRIYXNUaWNrc0hhc1RpY2tzS2V5d29yZF8yXzFfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJoYXNUaWNrcyIsIHRydWUsICJoYXNUaWNrcyIpOworCSAgICB9CisKKykKKykJb3RoZXJsdl82PSdtaW5pbXVtJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWluaW11bUtleXdvcmRfMl8xXzEoKSk7CisgICAgfQorKAorKAorCQlsdl9taW5WYWx1ZV83XzA9UlVMRV9JTlQKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfbWluVmFsdWVfN18wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNaW5WYWx1ZUlOVFRlcm1pbmFsUnVsZUNhbGxfMl8xXzJfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtaW5WYWx1ZSIsCisgICAgICAgIAkJbHZfbWluVmFsdWVfN18wLCAKKyAgICAgICAgCQkiSU5UIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzg9J21heGltdW0nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNYXhpbXVtS2V5d29yZF8yXzFfMygpKTsKKyAgICB9CisoCisoCisJCWx2X21heFZhbHVlXzlfMD1SVUxFX0lOVAorCQl7CisJCQluZXdMZWFmTm9kZShsdl9tYXhWYWx1ZV85XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldE1heFZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfNF8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1heFZhbHVlIiwKKyAgICAgICAgCQlsdl9tYXhWYWx1ZV85XzAsIAorICAgICAgICAJCSJJTlQiKTsKKwkgICAgfQorCispCispKSkKKwkJCQkJeyAKKwkgCQkJCSAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJIAkJCQl9CisgCQkJCSkKKwkJCSkgIHwKKworCQkJKCAKKwkJCQl7Z2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAyKX0/PT4oCisJCQkJCXsgCisJIAkJCQkgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMik7CisJIAkJCQl9CisJCQkJCSh7dHJ1ZX0/PT4oKAorKAorCQlsdl9oYXNJbnRlcnZhbHNfMTBfMD0JJ2ludGVydmFscycgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9oYXNJbnRlcnZhbHNfMTBfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SGFzSW50ZXJ2YWxzSW50ZXJ2YWxzS2V5d29yZF8yXzJfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJoYXNJbnRlcnZhbHMiLCB0cnVlLCAiaW50ZXJ2YWxzIik7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzExPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SW50ZXJ2YWxzQ2hhcnRJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzJfMl8yXzAoKSk7IAorCSAgICB9CisJCWx2X2ludGVydmFsc18xMl8wPXJ1bGVDaGFydEludGVydmFsCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaW50ZXJ2YWxzIiwKKyAgICAgICAgCQlsdl9pbnRlcnZhbHNfMTJfMCwgCisgICAgICAgIAkJIkNoYXJ0SW50ZXJ2YWwiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzEzPSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yXzJfMygpKTsKKyAgICB9CispKQorCQkJCQl7IAorCSAJCQkJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKwkgCQkJCX0KKyAJCQkJKQorCQkJKSAgCisKKwkJKSoJCisJKQorKQorCXsgCisJICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisJfQorCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRUcmVlCitlbnRyeVJ1bGVDaGFydFRyZWUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydFRyZWU9cnVsZUNoYXJ0VHJlZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0VHJlZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRUcmVlCitydWxlQ2hhcnRUcmVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0Q2hhcnRUcmVlQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndHJlZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0VHJlZUtleXdvcmRfMSgpKTsKKyAgICB9CisoKAorKAorCQlsdl9tYXBfMl8wPQknbWFwJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X21hcF8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0TWFwTWFwS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJtYXAiLCB0cnVlLCAibWFwIik7CisJICAgIH0KKworKQorKQorICAgIHwoCisoCisJCWx2X2NvbGxhcHNpYmxlXzNfMD0JJ2NvbGxhcHNpYmxlJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2NvbGxhcHNpYmxlXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVBY2Nlc3MoKS5nZXRDb2xsYXBzaWJsZUNvbGxhcHNpYmxlS2V5d29yZF8yXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJjb2xsYXBzaWJsZSIsIHRydWUsICJjb2xsYXBzaWJsZSIpOworCSAgICB9CisKKykKKykpKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRJbnRlcnZhbAorZW50cnlSdWxlQ2hhcnRJbnRlcnZhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW50ZXJ2YWxSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydEludGVydmFsPXJ1bGVDaGFydEludGVydmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRJbnRlcnZhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRJbnRlcnZhbAorcnVsZUNoYXJ0SW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICB9CisgICAgdGhpc19DaGFydE51bWJlckludGVydmFsXzA9cnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0TnVtYmVySW50ZXJ2YWxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnROdW1iZXJJbnRlcnZhbAorZW50cnlSdWxlQ2hhcnROdW1iZXJJbnRlcnZhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydE51bWJlckludGVydmFsPXJ1bGVDaGFydE51bWJlckludGVydmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnROdW1iZXJJbnRlcnZhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnROdW1iZXJJbnRlcnZhbAorcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3VwIHRvJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0VXBUb0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlckludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X251bWJlckludGVydmFsVmFsdWVfMl8wPXJ1bGVTaWduZWROdW1iZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJudW1iZXJJbnRlcnZhbFZhbHVlIiwKKyAgICAgICAgCQlsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlclJhbmdlQ2hhcnRSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X251bWJlclJhbmdlXzNfMD1ydWxlQ2hhcnRSYW5nZUVsZW1lbnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJudW1iZXJSYW5nZSIsCisgICAgICAgIAkJbHZfbnVtYmVyUmFuZ2VfM18wLCAKKyAgICAgICAgCQkiQ2hhcnRSYW5nZUVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnREYXRhbWFydAorZW50cnlSdWxlQ2hhcnREYXRhbWFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydERhdGFtYXJ0PXJ1bGVDaGFydERhdGFtYXJ0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnREYXRhbWFydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnREYXRhbWFydAorcnVsZUNoYXJ0RGF0YW1hcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdkYXRhbWFydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0S2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldEVsZW1lbnRzQ2hhcnRFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18zXzA9cnVsZUNoYXJ0RWxlbWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAJCSJDaGFydEVsZW1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKglvdGhlcmx2XzQ9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydEVsZW1lbnQKK2VudHJ5UnVsZUNoYXJ0RWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUNoYXJ0RWxlbWVudD1ydWxlQ2hhcnRFbGVtZW50IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRFbGVtZW50LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydEVsZW1lbnQKK3J1bGVDaGFydEVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRBeGlzUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfQ2hhcnRBeGlzXzA9cnVsZUNoYXJ0QXhpcworICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfQ2hhcnRBeGlzXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0TGVnZW5kUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfQ2hhcnRMZWdlbmRfMT1ydWxlQ2hhcnRMZWdlbmQKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0TGVnZW5kXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0SGlnaGxpZ2h0ZXJQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICB9CisgICAgdGhpc19DaGFydEhpZ2hsaWdodGVyXzI9cnVsZUNoYXJ0SGlnaGxpZ2h0ZXIKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0NoYXJ0SGlnaGxpZ2h0ZXJfMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0TGVnZW5kCitlbnRyeVJ1bGVDaGFydExlZ2VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kUnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRMZWdlbmQ9cnVsZUNoYXJ0TGVnZW5kIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRMZWdlbmQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0TGVnZW5kCitydWxlQ2hhcnRMZWdlbmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdsZWdlbmQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0TGVnZW5kS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFBsYWNlbWVudExlZ2VuZFBsYWNlbWVudEVudW1FbnVtUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9wbGFjZW1lbnRfMV8wPXJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBsYWNlbWVudCIsCisgICAgICAgIAkJbHZfcGxhY2VtZW50XzFfMCwgCisgICAgICAgIAkJIkxlZ2VuZFBsYWNlbWVudEVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgKKygKKwkJbHZfdG9nZ2xlXzJfMD0JJ3RvZ2dsZScgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl90b2dnbGVfMl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0VG9nZ2xlVG9nZ2xlS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInRvZ2dsZSIsIHRydWUsICJ0b2dnbGUiKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9yZXBsb3RfM18wPQkncmVwbG90JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3JlcGxvdF8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRSZXBsb3RSZXBsb3RLZXl3b3JkXzJfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAicmVwbG90IiwgdHJ1ZSwgInJlcGxvdCIpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRUb2dnbGVUeXBlVG9nZ2xlVHlwZUVudW1FbnVtUnVsZUNhbGxfMl8yXzAoKSk7IAorCSAgICB9CisJCWx2X3RvZ2dsZVR5cGVfNF8wPXJ1bGVUb2dnbGVUeXBlRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0b2dnbGVUeXBlIiwKKyAgICAgICAgCQlsdl90b2dnbGVUeXBlXzRfMCwgCisgICAgICAgIAkJIlRvZ2dsZVR5cGVFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlcgorZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydEhpZ2hsaWdodGVyPXJ1bGVDaGFydEhpZ2hsaWdodGVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRIaWdobGlnaHRlci5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRIaWdobGlnaHRlcgorcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSd0b29sdGlwJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0VG9vbHRpcEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldExvY2F0aW9uVG9vbHRpcExvY2F0aW9uRW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2xvY2F0aW9uXzFfMD1ydWxlVG9vbHRpcExvY2F0aW9uRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImxvY2F0aW9uIiwKKyAgICAgICAgCQlsdl9sb2NhdGlvbl8xXzAsIAorICAgICAgICAJCSJUb29sdGlwTG9jYXRpb25FbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgoCisoCisJCWx2X3Rvb2x0aXBBbHdheXNfMl8wPQknYWx3YXlzJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3Rvb2x0aXBBbHdheXNfMl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJBY2Nlc3MoKS5nZXRUb29sdGlwQWx3YXlzQWx3YXlzS2V5d29yZF8yXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAidG9vbHRpcEFsd2F5cyIsIHRydWUsICJhbHdheXMiKTsKKwkgICAgfQorCispCispPygKKygKKwkJbHZfaW5zaWRlQ2hhcnRfM18wPQknaW5zaWRlJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2luc2lkZUNoYXJ0XzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0SW5zaWRlQ2hhcnRJbnNpZGVLZXl3b3JkXzJfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJpbnNpZGVDaGFydCIsIHRydWUsICJpbnNpZGUiKTsKKwkgICAgfQorCispCispPykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydEF4aXMKK2VudHJ5UnVsZUNoYXJ0QXhpcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc1J1bGUoKSk7IH0KKwkgaXZfcnVsZUNoYXJ0QXhpcz1ydWxlQ2hhcnRBeGlzIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRBeGlzLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydEF4aXMKK3J1bGVDaGFydEF4aXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdheGlzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBeGlzS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBeGlzRGF0YW1hcnRBeGlzQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykJb3RoZXJsdl8yPSdyZW5kZXJzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRSZW5kZXJzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRSZW5kZXJUeXBlUmVuZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9yZW5kZXJUeXBlXzNfMD1ydWxlUmVuZGVyVHlwZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJlbmRlclR5cGUiLAorICAgICAgICAJCWx2X3JlbmRlclR5cGVfM18wLCAKKyAgICAgICAgCQkiUmVuZGVyVHlwZUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9zaG9ydExhYmVsXzRfMD0JJ3Nob3J0TGFiZWwnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfc2hvcnRMYWJlbF80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0U2hvcnRMYWJlbFNob3J0TGFiZWxLZXl3b3JkXzRfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJzaG9ydExhYmVsIiwgdHJ1ZSwgInNob3J0TGFiZWwiKTsKKwkgICAgfQorCispCispPygJb3RoZXJsdl81PSd0aWNrYW5nbGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFRpY2thbmdsZUtleXdvcmRfNV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBbmdsZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hbmdsZV82XzA9cnVsZVNpZ25lZE51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYW5nbGUiLAorICAgICAgICAJCWx2X2FuZ2xlXzZfMCwgCisgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50CitlbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50UnVsZSgpKTsgfQorCSBpdl9ydWxlQ2hhcnRSYW5nZUVsZW1lbnQ9cnVsZUNoYXJ0UmFuZ2VFbGVtZW50IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQ2hhcnRSYW5nZUVsZW1lbnQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIENoYXJ0UmFuZ2VFbGVtZW50CitydWxlQ2hhcnRSYW5nZUVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJhbmdlRWxlbWVudEFjY2VzcygpLmdldENoYXJ0U2VnbWVudENvbG9yUGFyc2VyUnVsZUNhbGwoKSk7IAorICAgIH0KKyAgICB0aGlzX0NoYXJ0U2VnbWVudENvbG9yXzA9cnVsZUNoYXJ0U2VnbWVudENvbG9yCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19DaGFydFNlZ21lbnRDb2xvcl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvcgorZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvclJ1bGUoKSk7IH0KKwkgaXZfcnVsZUNoYXJ0U2VnbWVudENvbG9yPXJ1bGVDaGFydFNlZ21lbnRDb2xvciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0U2VnbWVudENvbG9yLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydFNlZ21lbnRDb2xvcgorcnVsZUNoYXJ0U2VnbWVudENvbG9yIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nc2VnbWVudGNvbG9yJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvckFjY2VzcygpLmdldFNlZ21lbnRjb2xvcktleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCWx2X3JnYl8xXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfcmdiXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvckFjY2VzcygpLmdldFJnYlNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wKCkpOyAKKwkJfQorCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZ2IiLAorICAgICAgICAJCWx2X3JnYl8xXzAsIAorICAgICAgICAJCSJTVFJJTkciKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRJbXBvcnQKK2VudHJ5UnVsZUNoYXJ0SW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRSdWxlKCkpOyB9CisJIGl2X3J1bGVDaGFydEltcG9ydD1ydWxlQ2hhcnRJbXBvcnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVDaGFydEltcG9ydC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQ2hhcnRJbXBvcnQKK3J1bGVDaGFydEltcG9ydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2ltcG9ydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD1ydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0SW1wb3J0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltcG9ydGVkTmFtZXNwYWNlIiwKKyAgICAgICAgCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAsIAorICAgICAgICAJCSJDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlU2lnbmVkTnVtYmVyCitlbnRyeVJ1bGVTaWduZWROdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFNpZ25lZE51bWJlclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVTaWduZWROdW1iZXI9cnVsZVNpZ25lZE51bWJlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVNpZ25lZE51bWJlci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBTaWduZWROdW1iZXIKK3J1bGVTaWduZWROdW1iZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisJa3c9Jy0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMCgpKTsgCisgICAgfQorKT8gICAgdGhpc19JTlRfMT1SVUxFX0lOVCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSU5UXzEpOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JTlRfMSwgZ3JhbW1hckFjY2Vzcy5nZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyk/CisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCitlbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9cnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3J1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfUXVhbGlmaWVkTmFtZV8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKAorCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgCisgICAgfQorCisJa3c9JyonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyAKKyAgICB9CispPykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFRSQU5TTEFUQUJMRVNUUklORworcnVsZVRSQU5TTEFUQUJMRVNUUklORyByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorICAgIHRoaXNfU1RSSU5HXzA9UlVMRV9TVFJJTkcgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1NUUklOR18wKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfU1RSSU5HXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVUUkFOU0xBVEFCTEVJRD1ydWxlVFJBTlNMQVRBQkxFSUQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUUkFOU0xBVEFCTEVJRC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBUUkFOU0xBVEFCTEVJRAorcnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisgICAgdGhpc19JRF8wPVJVTEVfSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JRF8wLCBncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICB9CisKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbgorZW50cnlSdWxlWEFubm90YXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uPXJ1bGVYQW5ub3RhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBbm5vdGF0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbgorcnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J0AnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlSnZtQW5ub3RhdGlvblR5cGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJygnIAorKT0+CW90aGVybHZfMz0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKTsKKyAgICB9CispKCgoKCgoCisoCisJCXJ1bGVWYWxpZElECispCispCSc9JyAKKykpPT4KKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50VmFsdWVQYWlycyIsCisgICAgICAgIAkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wLCAKKyAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl81PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMF8xXzAoKSk7CisgICAgfQorKCgoKAorKAorCQlydWxlVmFsaWRJRAorKQorKQknPScgCispKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50VmFsdWVQYWlycyIsCisgICAgICAgIAkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wLCAKKyAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorICAgIHwoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RQYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl92YWx1ZV83XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzdfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8Jb3RoZXJsdl84PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsKKyAgICB9CispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgorcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgKKygKKwkJcnVsZVZhbGlkSUQKKykKKykJJz0nIAorKSk9PigoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVsZW1lbnRKdm1PcGVyYXRpb25Dcm9zc1JlZmVyZW5jZV8wXzBfMF8wKCkpOyAKKwkgICAgfQorCQlydWxlVmFsaWRJRAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMT0nPScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMF8wXzEoKSk7CisgICAgfQorKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfMl8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzJfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsgfQorCSBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgoKCgKKykJJyMnIAorCSdbJyAKKykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9JyMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J1snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsKKyAgICB9CispKSgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18zXzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl80PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c181XzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8Jb3RoZXJsdl82PSddJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgfQorKQorICAgIHwoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzcuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZEFkZCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgJb3RoZXJsdl85PScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18xMF8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c18xMF8wLCAKKyAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSspPykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQorcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgoKCgKKykJJyMnIAorCSdbJyAKKykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPScjJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nWycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsKKyAgICB9CispKSgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfM18wLCAKKyAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzQ9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzY9J10nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgfQorKQorICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KK2VudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25PckV4cHJlc3Npb24KK3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbm5vdGF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWEFubm90YXRpb25fMD1ydWxlWEFubm90YXRpb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hBbm5vdGF0aW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19YRXhwcmVzc2lvbl8xPXJ1bGVYRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEV4cHJlc3Npb25fMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uCitlbnRyeVJ1bGVYRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEV4cHJlc3Npb249cnVsZVhFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uCitydWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKworICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBc3NpZ25tZW50XzA9cnVsZVhBc3NpZ25tZW50CisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQXNzaWdubWVudF8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQXNzaWdubWVudAorZW50cnlSdWxlWEFzc2lnbm1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBc3NpZ25tZW50PXJ1bGVYQXNzaWdubWVudCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBc3NpZ25tZW50LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQXNzaWdubWVudAorcnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBY3Rpb25fMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVGZWF0dXJlQ2FsbElECQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRPcFNpbmdsZUFzc2lnblBhcnNlclJ1bGVDYWxsXzBfMigpKTsgCisgICAgfQorcnVsZU9wU2luZ2xlQXNzaWduCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8wXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfM18wPXJ1bGVYQXNzaWdubWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgIAkJbHZfdmFsdWVfM18wLCAKKyAgICAgICAgCQkiWEFzc2lnbm1lbnQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorICAgIHwoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWE9yRXhwcmVzc2lvbl80PXJ1bGVYT3JFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YT3JFeHByZXNzaW9uXzQuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wTXVsdGlBc3NpZ24KKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BNdWx0aUFzc2lnbgkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF83XzA9cnVsZVhBc3NpZ25tZW50CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzdfMCwgCisgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/KSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduCitlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BTaW5nbGVBc3NpZ249cnVsZU9wU2luZ2xlQXNzaWduIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BTaW5nbGVBc3NpZ24uY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BTaW5nbGVBc3NpZ24KK3J1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorCisJa3c9Jz0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICB9CisKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE11bHRpQXNzaWduCitlbnRyeVJ1bGVPcE11bHRpQXNzaWduIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wTXVsdGlBc3NpZ249cnVsZU9wTXVsdGlBc3NpZ24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcE11bHRpQXNzaWduLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wTXVsdGlBc3NpZ24KK3J1bGVPcE11bHRpQXNzaWduIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jys9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBsdXNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSctPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nKj0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy89JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFNvbGlkdXNFcXVhbHNTaWduS2V5d29yZF8zKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyU9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBlcmNlbnRTaWduRXF1YWxzU2lnbktleXdvcmRfNCgpKTsgCisgICAgfQorCisgICAgfCgKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMCgpKTsgCisgICAgfQorCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7IAorICAgIH0KKworCWt3PSc9JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzVfMigpKTsgCisgICAgfQorKQorICAgIHwoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IAorICAgIH0KKygKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMSgpKTsgCisgICAgfQorKT8KKwlrdz0nPj0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfNl8yKCkpOyAKKyAgICB9CispKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhPckV4cHJlc3Npb24KK2VudHJ5UnVsZVhPckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWE9yRXhwcmVzc2lvbj1ydWxlWE9yRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhPckV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhPckV4cHJlc3Npb24KK3J1bGVYT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5kRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hBbmRFeHByZXNzaW9uXzA9cnVsZVhBbmRFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQW5kRXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcE9yCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BPcgkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhBbmRFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWEFuZEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE9yCitlbnRyeVJ1bGVPcE9yIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wT3I9cnVsZU9wT3IgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcE9yLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wT3IKK3J1bGVPcE9yIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisKKwlrdz0nfHwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE9yQWNjZXNzKCkuZ2V0VmVydGljYWxMaW5lVmVydGljYWxMaW5lS2V5d29yZCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFuZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhBbmRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYQW5kRXhwcmVzc2lvbj1ydWxlWEFuZEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQW5kRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFuZEV4cHJlc3Npb24KK3J1bGVYQW5kRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFcXVhbGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BBbmQKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcEFuZAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWEVxdWFsaXR5RXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQW5kCitlbnRyeVJ1bGVPcEFuZCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BBbmQ9cnVsZU9wQW5kIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BBbmQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BBbmQKK3J1bGVPcEFuZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorCisJa3c9JyYmJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKKyAgICB9CisKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCitlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXF1YWxpdHlFeHByZXNzaW9uCitydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wRXF1YWxpdHkKKykKKykpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcEVxdWFsaXR5CQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgIAkJIlhSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wRXF1YWxpdHkKK2VudHJ5UnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BFcXVhbGl0eT1ydWxlT3BFcXVhbGl0eSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wRXF1YWxpdHkuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BFcXVhbGl0eQorcnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKwlrdz0nPT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nIT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSc9PT0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8yKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9JyE9PScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhSZWxhdGlvbmFsRXhwcmVzc2lvbgorcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD1ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoKAorKQknaW5zdGFuY2VvZicgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzI9J2luc3RhbmNlb2YnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlIiwKKyAgICAgICAgCQlsdl90eXBlXzNfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorICAgIHwoKCgoKAorKSgKKygKKwkJcnVsZU9wQ29tcGFyZQorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVPcENvbXBhcmUJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF82XzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfNl8wLCAKKyAgICAgICAgCQkiWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQ29tcGFyZQorZW50cnlSdWxlT3BDb21wYXJlIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BDb21wYXJlPXJ1bGVPcENvbXBhcmUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcENvbXBhcmUuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BDb21wYXJlCitydWxlT3BDb21wYXJlIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9Jz49JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgfQorCisgICAgfCgKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8wKCkpOyAKKyAgICB9CisKKwlrdz0nPScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzFfMSgpKTsgCisgICAgfQorKQorICAgIHwKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorCisgICAgfAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCitlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCitydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9cnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgoCispKAorKAorCQlydWxlT3BPdGhlcgorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wT3RoZXIJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBZGRpdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgCQkiWEFkZGl0aXZlRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wT3RoZXIKK2VudHJ5UnVsZU9wT3RoZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyB9IAorCSBpdl9ydWxlT3BPdGhlcj1ydWxlT3BPdGhlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU9wT3RoZXIuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BPdGhlcgorcnVsZU9wT3RoZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKwlrdz0nLT4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLi48JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BMZXNzVGhhblNpZ25LZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwoCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8yXzAoKSk7IAorICAgIH0KKworCWt3PScuLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8yXzEoKSk7IAorICAgIH0KKykKKyAgICB8CisJa3c9Jy4uJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nPT4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgCisgICAgfQorCisgICAgfCgKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMCgpKTsgCisgICAgfQorKCgoKAorCSc+JyAKKworCSc+JyAKKykpPT4oCisJa3c9Jz4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzAoKSk7IAorICAgIH0KKworCWt3PSc+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzBfMF8xKCkpOyAKKyAgICB9CispKQorICAgIHwKKwlrdz0nPicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyAKKyAgICB9CispKQorICAgIHwoCisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzAoKSk7IAorICAgIH0KKygoKCgKKwknPCcgCisKKwknPCcgCispKT0+KAorCWt3PSc8JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzBfMF8wKCkpOyAKKyAgICB9CisKKwlrdz0nPCcgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMSgpKTsgCisgICAgfQorKSkKKyAgICB8CisJa3c9JzwnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMSgpKTsgCisgICAgfQorCisgICAgfAorCWt3PSc9PicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF82XzFfMigpKTsgCisgICAgfQorKSkKKyAgICB8CisJa3c9Jzw+JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgCisgICAgfQorCisgICAgfAorCWt3PSc/OicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRRdWVzdGlvbk1hcmtDb2xvbktleXdvcmRfOCgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KK2VudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBZGRpdGl2ZUV4cHJlc3Npb24KK3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoKAorKSgKKygKKwkJcnVsZU9wQWRkCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BBZGQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAJCSJYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BBZGQKK2VudHJ5UnVsZU9wQWRkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVPcEFkZD1ydWxlT3BBZGQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcEFkZC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcEFkZAorcnVsZU9wQWRkIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9JysnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldFBsdXNTaWduS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hVbmFyeU9wZXJhdGlvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykoCisoCisJCXJ1bGVPcE11bHRpCispCispKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BNdWx0aQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYVW5hcnlPcGVyYXRpb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAJCSJYVW5hcnlPcGVyYXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE11bHRpCitlbnRyeVJ1bGVPcE11bHRpIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wTXVsdGk9cnVsZU9wTXVsdGkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcE11bHRpLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wTXVsdGkKK3J1bGVPcE11bHRpIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9JyonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nKionIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tBc3Rlcmlza0tleXdvcmRfMSgpKTsgCisgICAgfQorCisgICAgfAorCWt3PScvJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFNvbGlkdXNLZXl3b3JkXzIoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nJScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRQZXJjZW50U2lnbktleXdvcmRfMygpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbgorZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uPXJ1bGVYVW5hcnlPcGVyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYVW5hcnlPcGVyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhVbmFyeU9wZXJhdGlvbgorcnVsZVhVbmFyeU9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYVW5hcnlPcGVyYXRpb25BY3Rpb25fMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8wXzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZU9wVW5hcnkJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRPcGVyYW5kWFVuYXJ5T3BlcmF0aW9uUGFyc2VyUnVsZUNhbGxfMF8yXzAoKSk7IAorCSAgICB9CisJCWx2X29wZXJhbmRfMl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm9wZXJhbmQiLAorICAgICAgICAJCWx2X29wZXJhbmRfMl8wLCAKKyAgICAgICAgCQkiWFVuYXJ5T3BlcmF0aW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz1ydWxlWENhc3RlZEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFVuYXJ5CitlbnRyeVJ1bGVPcFVuYXJ5IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5UnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wVW5hcnk9cnVsZU9wVW5hcnkgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVPcFVuYXJ5LmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wVW5hcnkKK3J1bGVPcFVuYXJ5IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9JyEnIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrS2V5d29yZF8wKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9Jy0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nKycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMigpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249cnVsZVhDYXN0ZWRFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWENhc3RlZEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDYXN0ZWRFeHByZXNzaW9uCitydWxlWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9cnVsZVhQb3N0Zml4T3BlcmF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YUG9zdGZpeE9wZXJhdGlvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgKKykJJ2FzJyAKKykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzI9J2FzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzS2V5d29yZF8xXzBfMF8xKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZV8zXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZSIsCisgICAgICAgIAkJbHZfdHlwZV8zXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24KK2VudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYUG9zdGZpeE9wZXJhdGlvbj1ydWxlWFBvc3RmaXhPcGVyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYUG9zdGZpeE9wZXJhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFBvc3RmaXhPcGVyYXRpb24KK3J1bGVYUG9zdGZpeE9wZXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPXJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKAorKSgKKygKKwkJcnVsZU9wUG9zdGZpeAorKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlT3BQb3N0Zml4CQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcFBvc3RmaXgKK2VudHJ5UnVsZU9wUG9zdGZpeCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4UnVsZSgpKTsgfSAKKwkgaXZfcnVsZU9wUG9zdGZpeD1ydWxlT3BQb3N0Zml4IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlT3BQb3N0Zml4LmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wUG9zdGZpeAorcnVsZU9wUG9zdGZpeCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PScrKycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldFBsdXNTaWduUGx1c1NpZ25LZXl3b3JkXzAoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0nLS0nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0h5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsCitlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOyB9CisJIGl2X3J1bGVYTWVtYmVyRmVhdHVyZUNhbGw9cnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE1lbWJlckZlYXR1cmVDYWxsCitydWxlWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhQcmltYXJ5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wPXJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hQcmltYXJ5RXhwcmVzc2lvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKCgoKCgoCispKAknLicgCisKKyAgICB8KAorKAorCSc6OicgCisgCisKKykKKykpKAorKAorCQlydWxlRmVhdHVyZUNhbGxJRAorKQorKQlydWxlT3BTaW5nbGVBc3NpZ24pKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAlvdGhlcmx2XzI9Jy4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzBfMF8wXzFfMCgpKTsKKyAgICB9CisKKyAgICB8KAorKAorCQlsdl9leHBsaWNpdFN0YXRpY18zXzA9CSc6OicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdFN0YXRpY18zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzBfMF8wXzFfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4cGxpY2l0U3RhdGljIiwgdHJ1ZSwgIjo6Iik7CisJICAgIH0KKworKQorKSkoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMF8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVGZWF0dXJlQ2FsbElECQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8xXzBfMF8wXzMoKSk7IAorICAgIH0KK3J1bGVPcFNpbmdsZUFzc2lnbgorICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMV8wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdmFsdWVfNl8wPXJ1bGVYQXNzaWdubWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzZfMCwgCisgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKyAgICB8KCgoKCgKKykoCScuJyAKKworICAgIHwoCisoCisJJz8uJyAKKyAKKworKQorKQorICAgIHwoCisoCisJJzo6JyAKKyAKKworKQorKSkpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgJb3RoZXJsdl84PScuJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8xXzBfMF8xXzAoKSk7CisgICAgfQorCisgICAgfCgKKygKKwkJbHZfbnVsbFNhZmVfOV8wPQknPy4nIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfbnVsbFNhZmVfOV8wLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE51bGxTYWZlUXVlc3Rpb25NYXJrRnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAibnVsbFNhZmUiLCB0cnVlLCAiPy4iKTsKKwkgICAgfQorCispCispCisgICAgfCgKKygKKwkJbHZfZXhwbGljaXRTdGF0aWNfMTBfMD0JJzo6JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0U3RhdGljXzEwXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNDb2xvbkNvbG9uS2V5d29yZF8xXzFfMF8wXzFfMl8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4cGxpY2l0U3RhdGljIiwgdHJ1ZSwgIjo6Iik7CisJICAgIH0KKworKQorKSkpKSgJb3RoZXJsdl8xMT0nPCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUFyZ3VtZW50c18xMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVBcmd1bWVudHMiLAorICAgICAgICAJCWx2X3R5cGVBcmd1bWVudHNfMTJfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTM9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzFfMl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzFfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVBcmd1bWVudHNfMTRfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl90eXBlQXJndW1lbnRzXzE0XzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSoJb3RoZXJsdl8xNT0nPicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzE1LCBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV8xXzFfMygpKTsKKyAgICB9CispPygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlSWRPclN1cGVyCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgKKygKKwknKCcgCisgCisKKykKKyk9PgorKAorCQlsdl9leHBsaWNpdE9wZXJhdGlvbkNhbGxfMTdfMD0JJygnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXhwbGljaXRPcGVyYXRpb25DYWxsXzE3XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8xXzFfM18wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXhwbGljaXRPcGVyYXRpb25DYWxsIiwgdHJ1ZSwgIigiKTsKKwkgICAgfQorCispCispKCgoKCgKKykoKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSgJJywnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKSkqKT8oCisoCisJJ3wnIAorIAorCispCispKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X21lbWJlckNhbGxBcmd1bWVudHNfMThfMD1ydWxlWFNob3J0Q2xvc3VyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWVtYmVyQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfbWVtYmVyQ2FsbEFyZ3VtZW50c18xOF8wLCAKKyAgICAgICAgCQkiWFNob3J0Q2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB8KCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfM18xXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtZW1iZXJDYWxsQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzE5XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMjA9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yMCwgZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzNfMV8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzNfMV8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJtZW1iZXJDYWxsQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9tZW1iZXJDYWxsQXJndW1lbnRzXzIxXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikpPwlvdGhlcmx2XzIyPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMjIsIGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMV8xXzNfMigpKTsKKyAgICB9CispPygoKCgKKykJJ1snIAorKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldE1lbWJlckNhbGxBcmd1bWVudHNYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzFfMV80XzAoKSk7IAorCSAgICB9CisJCWx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMD1ydWxlWENsb3N1cmUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1lbWJlckNhbGxBcmd1bWVudHMiLAorICAgICAgICAJCWx2X21lbWJlckNhbGxBcmd1bWVudHNfMjNfMCwgCisgICAgICAgIAkJIlhDbG9zdXJlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8pKSopCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24KK2VudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhQcmltYXJ5RXhwcmVzc2lvbj1ydWxlWFByaW1hcnlFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFByaW1hcnlFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUHJpbWFyeUV4cHJlc3Npb24KK3J1bGVYUHJpbWFyeUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENvbnN0cnVjdG9yQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hDb25zdHJ1Y3RvckNhbGxfMD1ydWxlWENvbnN0cnVjdG9yQ2FsbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWENvbnN0cnVjdG9yQ2FsbF8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWEJsb2NrRXhwcmVzc2lvbl8xPXJ1bGVYQmxvY2tFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQmxvY2tFeHByZXNzaW9uXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgfQorICAgIHRoaXNfWFN3aXRjaEV4cHJlc3Npb25fMj1ydWxlWFN3aXRjaEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hTd2l0Y2hFeHByZXNzaW9uXzIuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8KCgoKAorKQknc3luY2hyb25pemVkJyAKKwknKCcgCispKT0+CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgfQorICAgIHRoaXNfWFN5bmNocm9uaXplZEV4cHJlc3Npb25fMz1ydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uXzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF80KCkpOyAKKyAgICB9CisgICAgdGhpc19YRmVhdHVyZUNhbGxfND1ydWxlWEZlYXR1cmVDYWxsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRmVhdHVyZUNhbGxfNC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WExpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICB9CisgICAgdGhpc19YTGl0ZXJhbF81PXJ1bGVYTGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWExpdGVyYWxfNS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WElmRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzYoKSk7IAorICAgIH0KKyAgICB0aGlzX1hJZkV4cHJlc3Npb25fNj1ydWxlWElmRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWElmRXhwcmVzc2lvbl82LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfCgoKCgKKykJJ2ZvcicgCisJJygnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKQknOicgCispKT0+CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzcoKSk7IAorICAgIH0KKyAgICB0aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83PXJ1bGVYRm9yTG9vcEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hGb3JMb29wRXhwcmVzc2lvbl83LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF84KCkpOyAKKyAgICB9CisgICAgdGhpc19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl84PXJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fOC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFdoaWxlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzkoKSk7IAorICAgIH0KKyAgICB0aGlzX1hXaGlsZUV4cHJlc3Npb25fOT1ydWxlWFdoaWxlRXhwcmVzc2lvbgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFdoaWxlRXhwcmVzc2lvbl85LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRG9XaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMCgpKTsgCisgICAgfQorICAgIHRoaXNfWERvV2hpbGVFeHByZXNzaW9uXzEwPXJ1bGVYRG9XaGlsZUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hEb1doaWxlRXhwcmVzc2lvbl8xMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRocm93RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzExKCkpOyAKKyAgICB9CisgICAgdGhpc19YVGhyb3dFeHByZXNzaW9uXzExPXJ1bGVYVGhyb3dFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YVGhyb3dFeHByZXNzaW9uXzExLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEyKCkpOyAKKyAgICB9CisgICAgdGhpc19YUmV0dXJuRXhwcmVzc2lvbl8xMj1ydWxlWFJldHVybkV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hSZXR1cm5FeHByZXNzaW9uXzEyLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEzKCkpOyAKKyAgICB9CisgICAgdGhpc19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl8xMz1ydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uXzEzLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xNCgpKTsgCisgICAgfQorICAgIHRoaXNfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uXzE0PXJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl8xNC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhMaXRlcmFsCitlbnRyeVJ1bGVYTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpKTsgfQorCSBpdl9ydWxlWExpdGVyYWw9cnVsZVhMaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWExpdGVyYWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhMaXRlcmFsCitydWxlWExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ29sbGVjdGlvbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YQ29sbGVjdGlvbkxpdGVyYWxfMD1ydWxlWENvbGxlY3Rpb25MaXRlcmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQ29sbGVjdGlvbkxpdGVyYWxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwoKCgoCispCSdbJyAKKykpPT4KKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hDbG9zdXJlXzE9cnVsZVhDbG9zdXJlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQ2xvc3VyZV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQm9vbGVhbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICB9CisgICAgdGhpc19YQm9vbGVhbkxpdGVyYWxfMj1ydWxlWEJvb2xlYW5MaXRlcmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YQm9vbGVhbkxpdGVyYWxfMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzMoKSk7IAorICAgIH0KKyAgICB0aGlzX1hOdW1iZXJMaXRlcmFsXzM9cnVsZVhOdW1iZXJMaXRlcmFsCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YTnVtYmVyTGl0ZXJhbF8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdWxsTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzQoKSk7IAorICAgIH0KKyAgICB0aGlzX1hOdWxsTGl0ZXJhbF80PXJ1bGVYTnVsbExpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hOdWxsTGl0ZXJhbF80LmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgCisgICAgfQorICAgIHRoaXNfWFN0cmluZ0xpdGVyYWxfNT1ydWxlWFN0cmluZ0xpdGVyYWwKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1hTdHJpbmdMaXRlcmFsXzUuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNigpKTsgCisgICAgfQorICAgIHRoaXNfWFR5cGVMaXRlcmFsXzY9cnVsZVhUeXBlTGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFR5cGVMaXRlcmFsXzYuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwKK2VudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbD1ydWxlWENvbGxlY3Rpb25MaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWENvbGxlY3Rpb25MaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ29sbGVjdGlvbkxpdGVyYWwKK3J1bGVYQ29sbGVjdGlvbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19YU2V0TGl0ZXJhbF8wPXJ1bGVYU2V0TGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWFNldExpdGVyYWxfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWExpc3RMaXRlcmFsXzE9cnVsZVhMaXN0TGl0ZXJhbAorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWExpc3RMaXRlcmFsXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU2V0TGl0ZXJhbAorZW50cnlSdWxlWFNldExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhTZXRMaXRlcmFsPXJ1bGVYU2V0TGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhTZXRMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU2V0TGl0ZXJhbAorcnVsZVhTZXRMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRYU2V0TGl0ZXJhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9JyMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7CisgICAgfQorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxlbWVudHNfM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzQ9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c181XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c181XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfNj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTGlzdExpdGVyYWwKK2VudHJ5UnVsZVhMaXN0TGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhMaXN0TGl0ZXJhbD1ydWxlWExpc3RMaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWExpc3RMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYTGlzdExpdGVyYWwKK3J1bGVYTGlzdExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPScjJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9J1snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8yKCkpOworICAgIH0KKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9lbGVtZW50c18zXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgIAkJbHZfZWxlbWVudHNfM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzQ9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2VsZW1lbnRzXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgCQlsdl9lbGVtZW50c181XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfNj0nXScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF80KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDbG9zdXJlCitlbnRyeVJ1bGVYQ2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgfQorCSBpdl9ydWxlWENsb3N1cmU9cnVsZVhDbG9zdXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWENsb3N1cmUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDbG9zdXJlCitydWxlWENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKCgoCispCSdbJyAKKykpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRYQ2xvc3VyZUFjdGlvbl8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdbJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzBfMSgpKTsKKyAgICB9CispKSgoKCgoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKAknLCcgCisoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKSopPygKKygKKwknfCcgCisgCisKKykKKykpKT0+KCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8xXzBfMF8wXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzA9cnVsZUp2bUZvcm1hbFBhcmFtZXRlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMiLAorICAgICAgICAJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18yXzAsIAorICAgICAgICAJCSJKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMF8wXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNKdm1Gb3JtYWxQYXJhbWV0ZXJQYXJzZXJSdWxlQ2FsbF8xXzBfMF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycyIsCisgICAgICAgIAkJbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzRfMCwgCisgICAgICAgIAkJIkp2bUZvcm1hbFBhcmFtZXRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/KAorKAorCQlsdl9leHBsaWNpdFN5bnRheF81XzA9CSd8JyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0U3ludGF4XzVfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4VmVydGljYWxMaW5lS2V5d29yZF8xXzBfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXhwbGljaXRTeW50YXgiLCB0cnVlLCAifCIpOworCSAgICB9CisKKykKKykpKT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25JbkNsb3N1cmVQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fNl8wPXJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uXzZfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uSW5DbG9zdXJlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2Xzc9J10nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8zKCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCitlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpKTsgfQorCSBpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmU9cnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uSW5DbG9zdXJlCitydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFhCbG9ja0V4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbnNYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbnNfMV8wPXJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbnMiLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25zXzFfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMj0nOycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzFfMSgpKTsKKyAgICB9CispPykqKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFNob3J0Q2xvc3VyZQorZW50cnlSdWxlWFNob3J0Q2xvc3VyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOyB9CisJIGl2X3J1bGVYU2hvcnRDbG9zdXJlPXJ1bGVYU2hvcnRDbG9zdXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFNob3J0Q2xvc3VyZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNob3J0Q2xvc3VyZQorcnVsZVhTaG9ydENsb3N1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoKCgoCispKCgKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykoCScsJyAKKygKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykpKik/KAorKAorCSd8JyAKKyAKKworKQorKSkpPT4oKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldFhDbG9zdXJlQWN0aW9uXzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0p2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzBfMF8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzXzFfMD1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzIiwKKyAgICAgICAgCQlsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfMV8wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8yPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMF8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0p2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzBfMF8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9kZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNfM18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMiLAorICAgICAgICAJCWx2X2RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc18zXzAsIAorICAgICAgICAJCSJKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPygKKygKKwkJbHZfZXhwbGljaXRTeW50YXhfNF8wPQknfCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdFN5bnRheF80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEV4cGxpY2l0U3ludGF4VmVydGljYWxMaW5lS2V5d29yZF8wXzBfMl8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJleHBsaWNpdFN5bnRheCIsIHRydWUsICJ8Iik7CisJICAgIH0KKworKQorKSkpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb249cnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOworICAgIH0KKworICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hFeHByZXNzaW9uXzE9cnVsZVhFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRXhwcmVzc2lvbl8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCW90aGVybHZfMj0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uCitlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhJZkV4cHJlc3Npb249cnVsZVhJZkV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYSWZFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYSWZFeHByZXNzaW9uCitydWxlWElmRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0naWYnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJZktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfaWZfM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImlmIiwKKyAgICAgICAgCQlsdl9pZl8zXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl80PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFRoZW5YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfdGhlbl81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidGhlbiIsCisgICAgICAgIAkJbHZfdGhlbl81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJ2Vsc2UnIAorKT0+CW90aGVybHZfNj0nZWxzZScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldEVsc2VLZXl3b3JkXzZfMCgpKTsKKyAgICB9CispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF82XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZWxzZV83XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZWxzZSIsCisgICAgICAgIAkJbHZfZWxzZV83XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uCitlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFN3aXRjaEV4cHJlc3Npb249cnVsZVhTd2l0Y2hFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFN3aXRjaEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTd2l0Y2hFeHByZXNzaW9uCitydWxlWFN3aXRjaEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nc3dpdGNoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEtleXdvcmRfMSgpKTsKKyAgICB9CisoKCgoKAknKCcgCisoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispCSc6JyAKKykpPT4oCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzJfMF8wXzBfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMl8wXzBfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkUGFyYW1fM18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVjbGFyZWRQYXJhbSIsCisgICAgICAgIAkJbHZfZGVjbGFyZWRQYXJhbV8zXzAsIAorICAgICAgICAJCSJKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfND0nOicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8wXzBfMF8yKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9zd2l0Y2hfNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJzd2l0Y2giLAorICAgICAgICAJCWx2X3N3aXRjaF81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl82PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzJfMF8yKCkpOworICAgIH0KKykKKyAgICB8KCgoKCgKKygKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKykKKykJJzonIAorKSk9PigoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtSnZtRm9ybWFsUGFyYW1ldGVyUGFyc2VyUnVsZUNhbGxfMl8xXzBfMF8wXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkUGFyYW1fN18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZGVjbGFyZWRQYXJhbSIsCisgICAgICAgIAkJbHZfZGVjbGFyZWRQYXJhbV83XzAsIAorICAgICAgICAJCSJKdm1Gb3JtYWxQYXJhbWV0ZXIiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfOD0nOicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb2xvbktleXdvcmRfMl8xXzBfMF8xKCkpOworICAgIH0KKykpPygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfc3dpdGNoXzlfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkic3dpdGNoIiwKKyAgICAgICAgCQlsdl9zd2l0Y2hfOV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkJb3RoZXJsdl8xMD0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEwLCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXNlc1hDYXNlUGFydFBhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfY2FzZXNfMTFfMD1ydWxlWENhc2VQYXJ0CQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNhc2VzIiwKKyAgICAgICAgCQlsdl9jYXNlc18xMV8wLCAKKyAgICAgICAgCQkiWENhc2VQYXJ0Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSooCW90aGVybHZfMTI9J2RlZmF1bHQnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMiwgZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlZmF1bHRLZXl3b3JkXzVfMCgpKTsKKyAgICB9CisJb3RoZXJsdl8xMz0nOicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzVfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXREZWZhdWx0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF81XzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVmYXVsdF8xNF8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkZWZhdWx0IiwKKyAgICAgICAgCQlsdl9kZWZhdWx0XzE0XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPwlvdGhlcmx2XzE1PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTUsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2FzZVBhcnQKK2VudHJ5UnVsZVhDYXNlUGFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhDYXNlUGFydD1ydWxlWENhc2VQYXJ0IAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWENhc2VQYXJ0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2FzZVBhcnQKK3J1bGVYQ2FzZVBhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRYQ2FzZVBhcnRBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0VHlwZUd1YXJkSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUd1YXJkXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZUd1YXJkIiwKKyAgICAgICAgCQlsdl90eXBlR3VhcmRfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/KAlvdGhlcmx2XzI9J2Nhc2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldENhc2VLZXl3b3JkXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X2Nhc2VfM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY2FzZSIsCisgICAgICAgIAkJbHZfY2FzZV8zXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPygoCW90aGVybHZfND0nOicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q29sb25LZXl3b3JkXzNfMF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90aGVuXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInRoZW4iLAorICAgICAgICAJCWx2X3RoZW5fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorICAgIHwoCisoCisJCWx2X2ZhbGxUaHJvdWdoXzZfMD0JJywnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZmFsbFRocm91Z2hfNl8wLCBncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEZhbGxUaHJvdWdoQ29tbWFLZXl3b3JkXzNfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImZhbGxUaHJvdWdoIiwgdHJ1ZSwgIiwiKTsKKwkgICAgfQorCispCispKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbgorZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEZvckxvb3BFeHByZXNzaW9uPXJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRm9yTG9vcEV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGb3JMb29wRXhwcmVzc2lvbgorcnVsZVhGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgoKCgKKykJJ2ZvcicgCisJJygnIAorKAorKAorcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgorKQorKQknOicgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjdGlvbl8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdmb3InIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEZvcktleXdvcmRfMF8wXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzBfMF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2RlY2xhcmVkUGFyYW1fM18wPXJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkUGFyYW0iLAorICAgICAgICAJCWx2X2RlY2xhcmVkUGFyYW1fM18wLCAKKyAgICAgICAgCQkiSnZtRm9ybWFsUGFyYW1ldGVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzQ9JzonIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldENvbG9uS2V5d29yZF8wXzBfNCgpKTsKKyAgICB9CispKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGb3JFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ZvckV4cHJlc3Npb25fNV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZm9yRXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZm9yRXhwcmVzc2lvbl81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl82PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFYWNoRXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9lYWNoRXhwcmVzc2lvbl83XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlYWNoRXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZWFjaEV4cHJlc3Npb25fN18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK2VudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbj1ydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdmb3InIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yS2V5d29yZF8xKCkpOworICAgIH0KKwlvdGhlcmx2XzI9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbml0RXhwcmVzc2lvbnNYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8zXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfaW5pdEV4cHJlc3Npb25zXzNfMD1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImluaXRFeHByZXNzaW9ucyIsCisgICAgICAgIAkJbHZfaW5pdEV4cHJlc3Npb25zXzNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfND0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfaW5pdEV4cHJlc3Npb25zXzVfMD1ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImluaXRFeHByZXNzaW9ucyIsCisgICAgICAgIAkJbHZfaW5pdEV4cHJlc3Npb25zXzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKik/CW90aGVybHZfNj0nOycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzQoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzdfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl83XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKyk/CW90aGVybHZfOD0nOycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzYoKSk7CisgICAgfQorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83XzBfMCgpKTsgCisJICAgIH0KKwkJbHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ1cGRhdGVFeHByZXNzaW9ucyIsCisgICAgICAgIAkJbHZfdXBkYXRlRXhwcmVzc2lvbnNfOV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzEwPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfN18xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VXBkYXRlRXhwcmVzc2lvbnNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzdfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3VwZGF0ZUV4cHJlc3Npb25zXzExXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInVwZGF0ZUV4cHJlc3Npb25zIiwKKyAgICAgICAgCQlsdl91cGRhdGVFeHByZXNzaW9uc18xMV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzEyPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF84KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85XzAoKSk7IAorCSAgICB9CisJCWx2X2VhY2hFeHByZXNzaW9uXzEzXzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVhY2hFeHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9lYWNoRXhwcmVzc2lvbl8xM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYV2hpbGVFeHByZXNzaW9uPXJ1bGVYV2hpbGVFeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFdoaWxlRXhwcmVzc2lvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFdoaWxlRXhwcmVzc2lvbgorcnVsZVhXaGlsZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3doaWxlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0V2hpbGVLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9wcmVkaWNhdGVfM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInByZWRpY2F0ZSIsCisgICAgICAgIAkJbHZfcHJlZGljYXRlXzNfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzQ9JyknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF80KCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkpOyAKKwkgICAgfQorCQlsdl9ib2R5XzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJib2R5IiwKKyAgICAgICAgCQlsdl9ib2R5XzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbgorZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWERvV2hpbGVFeHByZXNzaW9uPXJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRG9XaGlsZUV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhEb1doaWxlRXhwcmVzc2lvbgorcnVsZVhEb1doaWxlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2RvJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXREb0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Qm9keVhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9ib2R5XzJfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImJvZHkiLAorICAgICAgICAJCWx2X2JvZHlfMl8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfMz0nd2hpbGUnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFdoaWxlS2V5d29yZF8zKCkpOworICAgIH0KKwlvdGhlcmx2XzQ9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfNCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UHJlZGljYXRlWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X3ByZWRpY2F0ZV81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwcmVkaWNhdGUiLAorICAgICAgICAJCWx2X3ByZWRpY2F0ZV81XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl82PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF82KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24KK2VudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEJsb2NrRXhwcmVzc2lvbj1ydWxlWEJsb2NrRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhCbG9ja0V4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCbG9ja0V4cHJlc3Npb24KK3J1bGVYQmxvY2tFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCbG9ja0V4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMSgpKTsKKyAgICB9CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzJfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uc18yXzA9cnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb25zIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uc18yXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzM9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzJfMSgpKTsKKyAgICB9CispPykqCW90aGVybHZfND0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uPXJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1hWYXJpYWJsZURlY2xhcmF0aW9uXzA9cnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YVmFyaWFibGVEZWNsYXJhdGlvbl8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hFeHByZXNzaW9uXzE9cnVsZVhFeHByZXNzaW9uCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRXhwcmVzc2lvbl8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KK2VudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYVmFyaWFibGVEZWNsYXJhdGlvbj1ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYVmFyaWFibGVEZWNsYXJhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFZhcmlhYmxlRGVjbGFyYXRpb24KK3J1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoKAorKAorCQlsdl93cml0ZWFibGVfMV8wPQkndmFyJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3dyaXRlYWJsZV8xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXcml0ZWFibGVWYXJLZXl3b3JkXzFfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAid3JpdGVhYmxlIiwgdHJ1ZSwgInZhciIpOworCSAgICB9CisKKykKKykKKyAgICB8CW90aGVybHZfMj0ndmFsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFZhbEtleXdvcmRfMV8xKCkpOworICAgIH0KKykoKCgoKAorKAorcnVsZUp2bVR5cGVSZWZlcmVuY2UKKykKKykoCisoCitydWxlVmFsaWRJRAorKQorKSkpPT4oKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8yXzBfMF8wXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGUiLAorICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzJfMF8wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV80XzA9cnVsZVZhbGlkSUQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV80XzAsIAorICAgICAgICAJCSJWYWxpZElEIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisgICAgfCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldE5hbWVWYWxpZElEUGFyc2VyUnVsZUNhbGxfMl8xXzAoKSk7IAorCSAgICB9CisJCWx2X25hbWVfNV8wPXJ1bGVWYWxpZElECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfNV8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKAlvdGhlcmx2XzY9Jz0nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfM18wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJpZ2h0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcmlnaHRfN18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyaWdodCIsCisgICAgICAgIAkJbHZfcmlnaHRfN18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKK2VudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bUZvcm1hbFBhcmFtZXRlcj1ydWxlSnZtRm9ybWFsUGFyYW1ldGVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtRm9ybWFsUGFyYW1ldGVyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Gb3JtYWxQYXJhbWV0ZXIKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzAoKSk7IAorCSAgICB9CisJCWx2X3BhcmFtZXRlclR5cGVfMF8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYXJhbWV0ZXJUeXBlIiwKKyAgICAgICAgCQlsdl9wYXJhbWV0ZXJUeXBlXzBfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV8xXzA9cnVsZVZhbGlkSUQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAJCWx2X25hbWVfMV8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCitlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0KKwkgaXZfcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI9cnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCitydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UGFyYW1ldGVyVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzAoKSk7IAorCSAgICB9CisJCWx2X3BhcmFtZXRlclR5cGVfMF8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFyYW1ldGVyVHlwZSIsCisgICAgICAgIAkJbHZfcGFyYW1ldGVyVHlwZV8wXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZVZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X25hbWVfMV8wPXJ1bGVWYWxpZElECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJWYWxpZElEIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGZWF0dXJlQ2FsbAorZW50cnlSdWxlWEZlYXR1cmVDYWxsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsgfQorCSBpdl9ydWxlWEZlYXR1cmVDYWxsPXJ1bGVYRmVhdHVyZUNhbGwgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRmVhdHVyZUNhbGwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGZWF0dXJlQ2FsbAorcnVsZVhGZWF0dXJlQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgJb3RoZXJsdl8xPSc8JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlQXJndW1lbnRzXzJfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl90eXBlQXJndW1lbnRzXzJfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMz0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8yXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUFyZ3VtZW50c180XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZUFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfdHlwZUFyZ3VtZW50c180XzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSoJb3RoZXJsdl81PSc+JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMygpKTsKKyAgICB9CispPygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVJZE9yU3VwZXIJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgoKAorKAorCScoJyAKKyAKKworKQorKT0+CisoCisJCWx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzA9CScoJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4cGxpY2l0T3BlcmF0aW9uQ2FsbF83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRPcGVyYXRpb25DYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJleHBsaWNpdE9wZXJhdGlvbkNhbGwiLCB0cnVlLCAiKCIpOworCSAgICB9CisKKykKKykoKCgoKAorKSgoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKAknLCcgCisoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKSopPygKKygKKwknfCcgCisgCisKKykKKykpKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYU2hvcnRDbG9zdXJlUGFyc2VyUnVsZUNhbGxfM18xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wPXJ1bGVYU2hvcnRDbG9zdXJlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmZWF0dXJlQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOF8wLCAKKyAgICAgICAgCQkiWFNob3J0Q2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB8KCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c185XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmZWF0dXJlQ2FsbEFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfOV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzEwPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzNfMV8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMV8xXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xMV8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmVhdHVyZUNhbGxBcmd1bWVudHMiLAorICAgICAgICAJCWx2X2ZlYXR1cmVDYWxsQXJndW1lbnRzXzExXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikpPwlvdGhlcmx2XzEyPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOworICAgIH0KKyk/KCgoKAorKQknWycgCispKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfZmVhdHVyZUNhbGxBcmd1bWVudHNfMTNfMD1ydWxlWENsb3N1cmUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImZlYXR1cmVDYWxsQXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9mZWF0dXJlQ2FsbEFyZ3VtZW50c18xM18wLCAKKyAgICAgICAgCQkiWENsb3N1cmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQKK2VudHJ5UnVsZUZlYXR1cmVDYWxsSUQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyB9IAorCSBpdl9ydWxlRmVhdHVyZUNhbGxJRD1ydWxlRmVhdHVyZUNhbGxJRCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUZlYXR1cmVDYWxsSUQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgRmVhdHVyZUNhbGxJRAorcnVsZUZlYXR1cmVDYWxsSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzA9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKwlrdz0nZXh0ZW5kcycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKyAgICB8CisJa3c9J3N0YXRpYycgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRTdGF0aWNLZXl3b3JkXzIoKSk7IAorICAgIH0KKworICAgIHwKKwlrdz0naW1wb3J0JyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMygpKTsgCisgICAgfQorCisgICAgfAorCWt3PSdleHRlbnNpb24nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uS2V5d29yZF80KCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSWRPclN1cGVyCitlbnRyeVJ1bGVJZE9yU3VwZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVJZE9yU3VwZXI9cnVsZUlkT3JTdXBlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUlkT3JTdXBlci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBJZE9yU3VwZXIKK3J1bGVJZE9yU3VwZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX0ZlYXR1cmVDYWxsSURfMD1ydWxlRmVhdHVyZUNhbGxJRCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfRmVhdHVyZUNhbGxJRF8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorCWt3PSdzdXBlcicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8xKCkpOyAKKyAgICB9CispCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbAorZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOyB9CisJIGl2X3J1bGVYQ29uc3RydWN0b3JDYWxsPXJ1bGVYQ29uc3RydWN0b3JDYWxsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWENvbnN0cnVjdG9yQ2FsbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENvbnN0cnVjdG9yQ2FsbAorcnVsZVhDb25zdHJ1Y3RvckNhbGwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J25ldycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldE5ld0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29uc3RydWN0b3JKdm1Db25zdHJ1Y3RvckNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJICAgIH0KKwkJcnVsZVF1YWxpZmllZE5hbWUJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgoKAknPCcgCispPT4Jb3RoZXJsdl8zPSc8JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zXzAoKSk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlQXJndW1lbnRzXzRfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZUFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfdHlwZUFyZ3VtZW50c180XzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzU9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18yXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfM18yXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfdHlwZUFyZ3VtZW50c182XzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVBcmd1bWVudHMiLAorICAgICAgICAJCWx2X3R5cGVBcmd1bWVudHNfNl8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqCW90aGVybHZfNz0nPicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzcsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfM18zKCkpOworICAgIH0KKyk/KCgoCisoCisJJygnIAorIAorCispCispPT4KKygKKwkJbHZfZXhwbGljaXRDb25zdHJ1Y3RvckNhbGxfOF8wPQknKCcgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl9leHBsaWNpdENvbnN0cnVjdG9yQ2FsbF84XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsTGVmdFBhcmVudGhlc2lzS2V5d29yZF80XzBfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXhwbGljaXRDb25zdHJ1Y3RvckNhbGwiLCB0cnVlLCAiKCIpOworCSAgICB9CisKKykKKykoKCgoKAorKSgoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKAknLCcgCisoCisoCitydWxlSnZtRm9ybWFsUGFyYW1ldGVyCispCispKSopPygKKygKKwknfCcgCisgCisKKykKKykpKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hTaG9ydENsb3N1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfOV8wPXJ1bGVYU2hvcnRDbG9zdXJlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfOV8wLCAKKyAgICAgICAgCQkiWFNob3J0Q2xvc3VyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB8KCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0QXJndW1lbnRzWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF80XzFfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18xMF8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzEwXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMTE9JywnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzRfMV8xXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c1hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNF8xXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2FyZ3VtZW50c18xMl8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzEyXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKikpPwlvdGhlcmx2XzEzPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTMsIGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzRfMigpKTsKKyAgICB9CispPygoKCgKKykJJ1snIAorKSk9PgorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNYQ2xvc3VyZVBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzE0XzA9cnVsZVhDbG9zdXJlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfMTRfMCwgCisgICAgICAgIAkJIlhDbG9zdXJlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwKK2VudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhCb29sZWFuTGl0ZXJhbD1ydWxlWEJvb2xlYW5MaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWEJvb2xlYW5MaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQm9vbGVhbkxpdGVyYWwKK3J1bGVYQm9vbGVhbkxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRYQm9vbGVhbkxpdGVyYWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykoCW90aGVybHZfMT0nZmFsc2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEZhbHNlS2V5d29yZF8xXzAoKSk7CisgICAgfQorCisgICAgfCgKKygKKwkJbHZfaXNUcnVlXzJfMD0JJ3RydWUnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfaXNUcnVlXzJfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVUcnVlS2V5d29yZF8xXzFfMCgpKTsKKyAgICB9CisgCisJICAgIHsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoJGN1cnJlbnQsICJpc1RydWUiLCB0cnVlLCAidHJ1ZSIpOworCSAgICB9CisKKykKKykpKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE51bGxMaXRlcmFsCitlbnRyeVJ1bGVYTnVsbExpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkpOyB9CisJIGl2X3J1bGVYTnVsbExpdGVyYWw9cnVsZVhOdWxsTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhOdWxsTGl0ZXJhbC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bGxMaXRlcmFsCitydWxlWE51bGxMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bGxMaXRlcmFsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nbnVsbCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0TnVsbEtleXdvcmRfMSgpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbAorZW50cnlSdWxlWE51bWJlckxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhOdW1iZXJMaXRlcmFsPXJ1bGVYTnVtYmVyTGl0ZXJhbCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhOdW1iZXJMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYTnVtYmVyTGl0ZXJhbAorcnVsZVhOdW1iZXJMaXRlcmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlTnVtYmVyUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl92YWx1ZV8xXzA9cnVsZU51bWJlcgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgIAkJbHZfdmFsdWVfMV8wLCAKKyAgICAgICAgCQkiTnVtYmVyIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsCitlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpKTsgfQorCSBpdl9ydWxlWFN0cmluZ0xpdGVyYWw9cnVsZVhTdHJpbmdMaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFN0cmluZ0xpdGVyYWwuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTdHJpbmdMaXRlcmFsCitydWxlWFN0cmluZ0xpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispKAorKAorCQlsdl92YWx1ZV8xXzA9UlVMRV9TVFJJTkcKKwkJeworCQkJbmV3TGVhZk5vZGUobHZfdmFsdWVfMV8wLCBncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpKTsgCisJCX0KKwkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAJCWx2X3ZhbHVlXzFfMCwgCisgICAgICAgIAkJIlNUUklORyIpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHlwZUxpdGVyYWwKK2VudHJ5UnVsZVhUeXBlTGl0ZXJhbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhUeXBlTGl0ZXJhbD1ydWxlWFR5cGVMaXRlcmFsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFR5cGVMaXRlcmFsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVHlwZUxpdGVyYWwKK3J1bGVYVHlwZUxpdGVyYWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRYVHlwZUxpdGVyYWxBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd0eXBlb2YnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldFR5cGVvZktleXdvcmRfMSgpKTsKKyAgICB9CisJb3RoZXJsdl8yPScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzIoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZUNyb3NzUmVmZXJlbmNlXzNfMCgpKTsgCisJICAgIH0KKwkJcnVsZVF1YWxpZmllZE5hbWUJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRBcnJheURpbWVuc2lvbnNBcnJheUJyYWNrZXRzUGFyc2VyUnVsZUNhbGxfNF8wKCkpOyAKKwkgICAgfQorCQlsdl9hcnJheURpbWVuc2lvbnNfNF8wPXJ1bGVBcnJheUJyYWNrZXRzCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcnJheURpbWVuc2lvbnMiLAorICAgICAgICAJCWx2X2FycmF5RGltZW5zaW9uc180XzAsIAorICAgICAgICAJCSJBcnJheUJyYWNrZXRzIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl81PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF81KCkpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24KK2VudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFRocm93RXhwcmVzc2lvbj1ydWxlWFRocm93RXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhUaHJvd0V4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhUaHJvd0V4cHJlc3Npb24KK3J1bGVYVGhyb3dFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSd0aHJvdycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFRocm93S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzJfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uXzJfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uCitlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWFJldHVybkV4cHJlc3Npb249cnVsZVhSZXR1cm5FeHByZXNzaW9uIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlWFJldHVybkV4cHJlc3Npb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhSZXR1cm5FeHByZXNzaW9uCitydWxlWFJldHVybkV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZXR1cm5FeHByZXNzaW9uQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncmV0dXJuJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJldHVybktleXdvcmRfMSgpKTsKKyAgICB9CisoKAknZXh0ZW5kcycgCisgfCAJJ3N0YXRpYycgCisgfCAJJ2ltcG9ydCcgCisgfCAJJ2V4dGVuc2lvbicgCisgfCAJJyEnIAorIHwgCSctJyAKKyB8IAknKycgCisgfCAJJ25ldycgCisgfCAJJ3snIAorIHwgCSdzd2l0Y2gnIAorIHwgCSdzeW5jaHJvbml6ZWQnIAorIHwgCSc8JyAKKyB8IAknc3VwZXInIAorIHwgCScjJyAKKyB8IAknWycgCisgfCAJJ2ZhbHNlJyAKKyB8IAkndHJ1ZScgCisgfCAJJ251bGwnIAorIHwgCSd0eXBlb2YnIAorIHwgCSdpZicgCisgfCAJJ2ZvcicgCisgfCAJJ3doaWxlJyAKKyB8IAknZG8nIAorIHwgCSd0aHJvdycgCisgfCAJJ3JldHVybicgCisgfCAJJ3RyeScgCisgfCAJJygnIAorIHwgCVJVTEVfSUQgfCAJUlVMRV9IRVggfCAJUlVMRV9JTlQgfCAJUlVMRV9ERUNJTUFMIHwgCVJVTEVfU1RSSU5HKT0+CisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fMl8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJleHByZXNzaW9uIiwKKyAgICAgICAgCQlsdl9leHByZXNzaW9uXzJfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uPXJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgorcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3RyeScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUcnlLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9leHByZXNzaW9uXzJfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl8yXzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgoCSdjYXRjaCcgCispPT4KKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldENhdGNoQ2xhdXNlc1hDYXRjaENsYXVzZVBhcnNlclJ1bGVDYWxsXzNfMF8wXzAoKSk7IAorCSAgICB9CisJCWx2X2NhdGNoQ2xhdXNlc18zXzA9cnVsZVhDYXRjaENsYXVzZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjYXRjaENsYXVzZXMiLAorICAgICAgICAJCWx2X2NhdGNoQ2xhdXNlc18zXzAsIAorICAgICAgICAJCSJYQ2F0Y2hDbGF1c2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKygoKAknZmluYWxseScgCispPT4Jb3RoZXJsdl80PSdmaW5hbGx5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlLZXl3b3JkXzNfMF8xXzAoKSk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZpbmFsbHlFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zXzBfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMD1ydWxlWEV4cHJlc3Npb24JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZmluYWxseUV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2ZpbmFsbHlFeHByZXNzaW9uXzVfMCwgCisgICAgICAgIAkJIlhFeHByZXNzaW9uIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSk/KQorICAgIHwoCW90aGVybHZfNj0nZmluYWxseScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5S2V5d29yZF8zXzFfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvblhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfM18xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZmluYWxseUV4cHJlc3Npb25fN18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJmaW5hbGx5RXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZmluYWxseUV4cHJlc3Npb25fN18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSkpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgorZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uPXJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3luY2hyb25pemVkRXhwcmVzc2lvbgorcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgoKAorKQknc3luY2hyb25pemVkJyAKKwknKCcgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY3Rpb25fMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nc3luY2hyb25pemVkJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFN5bmNocm9uaXplZEtleXdvcmRfMF8wXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF8yKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFyYW1fM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYXJhbSIsCisgICAgICAgIAkJbHZfcGFyYW1fM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfND0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbl81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhdGNoQ2xhdXNlCitlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyB9CisJIGl2X3J1bGVYQ2F0Y2hDbGF1c2U9cnVsZVhDYXRjaENsYXVzZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDYXRjaENsYXVzZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhdGNoQ2xhdXNlCitydWxlWENhdGNoQ2xhdXNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgJJ2NhdGNoJyAKKyk9PglvdGhlcmx2XzA9J2NhdGNoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRDYXRjaEtleXdvcmRfMCgpKTsKKyAgICB9CispCW90aGVybHZfMT0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtRnVsbEp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVjbGFyZWRQYXJhbV8yXzA9cnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkUGFyYW0iLAorICAgICAgICAJCWx2X2RlY2xhcmVkUGFyYW1fMl8wLCAKKyAgICAgICAgCQkiRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8zPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fNF8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl80XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVF1YWxpZmllZE5hbWU9cnVsZVF1YWxpZmllZE5hbWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWUKK3J1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVmFsaWRJRF8wPXJ1bGVWYWxpZElEICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19WYWxpZElEXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgKKwknLicgCispPT4KKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICB9CispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzI9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMik7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykqKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU51bWJlcgorZW50cnlSdWxlTnVtYmVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCUBpbml0IHsgCisJCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworCX0KKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyUnVsZSgpKTsgfSAKKwkgaXZfcnVsZU51bWJlcj1ydWxlTnVtYmVyIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlTnVtYmVyLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworZmluYWxseSB7CisJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKK30KKworLy8gUnVsZSBOdW1iZXIKK3J1bGVOdW1iZXIgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorCQlIaWRkZW5Ub2tlbnMgbXlIaWRkZW5Ub2tlblN0YXRlID0gKChYdGV4dFRva2VuU3RyZWFtKWlucHV0KS5zZXRIaWRkZW5Ub2tlbnMoKTsKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoICAgIHRoaXNfSEVYXzA9UlVMRV9IRVggICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0hFWF8wKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfSEVYXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SEVYVGVybWluYWxSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisKKyAgICB8KCggICAgdGhpc19JTlRfMT1SVUxFX0lOVCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSU5UXzEpOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JTlRfMSwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMF8wKCkpOyAKKyAgICB9CisKKyAgICB8ICAgIHRoaXNfREVDSU1BTF8yPVJVTEVfREVDSU1BTCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfREVDSU1BTF8yKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfREVDSU1BTF8yLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkpOyAKKyAgICB9CispKAorCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wKCkpOyAKKyAgICB9CisoICAgIHRoaXNfSU5UXzQ9UlVMRV9JTlQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0lOVF80KTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfSU5UXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKyAgICB9CisKKyAgICB8ICAgIHRoaXNfREVDSU1BTF81PVJVTEVfREVDSU1BTCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfREVDSU1BTF81KTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfREVDSU1BTF81LCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzEoKSk7IAorICAgIH0KKykpPykpCisgICAgOworZmluYWxseSB7CisJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKK30KKworCisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bVR5cGVSZWZlcmVuY2U9cnVsZUp2bVR5cGVSZWZlcmVuY2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1UeXBlUmVmZXJlbmNlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1UeXBlUmVmZXJlbmNlCitydWxlSnZtVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV8wPXJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKygoKCgKKykJcnVsZUFycmF5QnJhY2tldHMpKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlQ29tcG9uZW50VHlwZUFjdGlvbl8wXzFfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJyYXlCcmFja2V0c1BhcnNlclJ1bGVDYWxsXzBfMV8wXzEoKSk7IAorICAgIH0KK3J1bGVBcnJheUJyYWNrZXRzCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykpKikKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRYRnVuY3Rpb25UeXBlUmVmUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfWEZ1bmN0aW9uVHlwZVJlZl8zPXJ1bGVYRnVuY3Rpb25UeXBlUmVmCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19YRnVuY3Rpb25UeXBlUmVmXzMuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzCitlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgfSAKKwkgaXZfcnVsZUFycmF5QnJhY2tldHM9cnVsZUFycmF5QnJhY2tldHMgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVBcnJheUJyYWNrZXRzLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIEFycmF5QnJhY2tldHMKK3J1bGVBcnJheUJyYWNrZXRzIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisJa3c9J1snIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzAoKSk7IAorICAgIH0KKworCWt3PSddJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMSgpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYKK2VudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgfQorCSBpdl9ydWxlWEZ1bmN0aW9uVHlwZVJlZj1ydWxlWEZ1bmN0aW9uVHlwZVJlZiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhGdW5jdGlvblR5cGVSZWYuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGdW5jdGlvblR5cGVSZWYKK3J1bGVYRnVuY3Rpb25UeXBlUmVmIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAlvdGhlcmx2XzA9JygnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMCgpKTsKKyAgICB9CisoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IAorCSAgICB9CisJCWx2X3BhcmFtVHlwZXNfMV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFyYW1UeXBlcyIsCisgICAgICAgIAkJbHZfcGFyYW1UeXBlc18xXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8yPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRQYXJhbVR5cGVzSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFyYW1UeXBlc18zXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYXJhbVR5cGVzIiwKKyAgICAgICAgCQlsdl9wYXJhbVR5cGVzXzNfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSopPwlvdGhlcmx2XzQ9JyknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzIoKSk7CisgICAgfQorKT8Jb3RoZXJsdl81PSc9PicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSZXR1cm5UeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfcmV0dXJuVHlwZV82XzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyZXR1cm5UeXBlIiwKKyAgICAgICAgCQlsdl9yZXR1cm5UeXBlXzZfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZT1ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVKdm1UeXBlQ3Jvc3NSZWZlcmVuY2VfMF8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgoCSc8JyAKKyk9PglvdGhlcmx2XzE9JzwnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8xXzAoKSk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfMl8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfMl8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8zPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfNF8wPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXJndW1lbnRzIiwKKyAgICAgICAgCQlsdl9hcmd1bWVudHNfNF8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqCW90aGVybHZfNT0nPicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzFfMygpKTsKKyAgICB9CisoKCgoKAorKQknLicgCispKT0+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtSW5uZXJUeXBlUmVmZXJlbmNlT3V0ZXJBY3Rpb25fMV80XzBfMF8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2Xzc9Jy4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl83LCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfNF8wXzBfMSgpKTsKKyAgICB9CispKSgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVKdm1UeXBlQ3Jvc3NSZWZlcmVuY2VfMV80XzFfMCgpKTsgCisJICAgIH0KKwkJcnVsZVZhbGlkSUQJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgoKAknPCcgCispPT4Jb3RoZXJsdl85PSc8JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV80XzJfMCgpKTsKKyAgICB9CispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV80XzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfMTBfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzEwXzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAlvdGhlcmx2XzExPScsJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMTEsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV80XzJfMl8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfNF8yXzJfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9hcmd1bWVudHNfMTJfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzEyXzAsIAorICAgICAgICAJCSJKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKSoJb3RoZXJsdl8xMz0nPicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEzLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzRfMl8zKCkpOworICAgIH0KKyk/KSopPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlPXJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQorcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfSnZtVHlwZVJlZmVyZW5jZV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Kdm1UeXBlUmVmZXJlbmNlXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKyAgICB8CisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV8xPXJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U9cnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCitydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nPycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrS2V5d29yZF8xKCkpOworICAgIH0KKygoKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtVXBwZXJCb3VuZFBhcnNlclJ1bGVDYWxsXzJfMF8wXzAoKSk7IAorCSAgICB9CisJCWx2X2NvbnN0cmFpbnRzXzJfMD1ydWxlSnZtVXBwZXJCb3VuZAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29uc3RyYWludHMiLAorICAgICAgICAJCWx2X2NvbnN0cmFpbnRzXzJfMCwgCisgICAgICAgIAkJIkp2bVVwcGVyQm91bmQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzSnZtVXBwZXJCb3VuZEFuZGVkUGFyc2VyUnVsZUNhbGxfMl8wXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfY29uc3RyYWludHNfM18wPXJ1bGVKdm1VcHBlckJvdW5kQW5kZWQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbnN0cmFpbnRzIiwKKyAgICAgICAgCQlsdl9jb25zdHJhaW50c18zXzAsIAorICAgICAgICAJCSJKdm1VcHBlckJvdW5kQW5kZWQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKikKKyAgICB8KCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0p2bUxvd2VyQm91bmRQYXJzZXJSdWxlQ2FsbF8yXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9jb25zdHJhaW50c180XzA9cnVsZUp2bUxvd2VyQm91bmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbnN0cmFpbnRzIiwKKyAgICAgICAgCQlsdl9jb25zdHJhaW50c180XzAsIAorICAgICAgICAJCSJKdm1Mb3dlckJvdW5kIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0p2bUxvd2VyQm91bmRBbmRlZFBhcnNlclJ1bGVDYWxsXzJfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X2NvbnN0cmFpbnRzXzVfMD1ydWxlSnZtTG93ZXJCb3VuZEFuZGVkCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb25zdHJhaW50cyIsCisgICAgICAgIAkJbHZfY29uc3RyYWludHNfNV8wLCAKKyAgICAgICAgCQkiSnZtTG93ZXJCb3VuZEFuZGVkIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSopKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kCitlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bVVwcGVyQm91bmQ9cnVsZUp2bVVwcGVyQm91bmQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1VcHBlckJvdW5kLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1VcHBlckJvdW5kCitydWxlSnZtVXBwZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2V4dGVuZHMnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVSZWZlcmVuY2VfMV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZVJlZmVyZW5jZSIsCisgICAgICAgIAkJbHZfdHlwZVJlZmVyZW5jZV8xXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZAorZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkPXJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1VcHBlckJvdW5kQW5kZWQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVVwcGVyQm91bmRBbmRlZAorcnVsZUp2bVVwcGVyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9JyYnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVSZWZlcmVuY2VfMV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlUmVmZXJlbmNlIiwKKyAgICAgICAgCQlsdl90eXBlUmVmZXJlbmNlXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtTG93ZXJCb3VuZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1Mb3dlckJvdW5kPXJ1bGVKdm1Mb3dlckJvdW5kIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtTG93ZXJCb3VuZC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtTG93ZXJCb3VuZAorcnVsZUp2bUxvd2VyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdzdXBlcicgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVSZWZlcmVuY2VfMV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZVJlZmVyZW5jZSIsCisgICAgICAgIAkJbHZfdHlwZVJlZmVyZW5jZV8xXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZAorZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkPXJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUxvd2VyQm91bmRBbmRlZAorcnVsZUp2bUxvd2VyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9JyYnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldEFtcGVyc2FuZEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X3R5cGVSZWZlcmVuY2VfMV8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJ0eXBlUmVmZXJlbmNlIiwKKyAgICAgICAgCQlsdl90eXBlUmVmZXJlbmNlXzFfMCwgCisgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyB9IAorCSBpdl9ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZD1ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldFF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19RdWFsaWZpZWROYW1lXzA9cnVsZVF1YWxpZmllZE5hbWUgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1F1YWxpZmllZE5hbWVfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xKCkpOyAKKyAgICB9CisKKwlrdz0nKicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMigpKTsgCisgICAgfQorKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVZhbGlkSUQKK2VudHJ5UnVsZVZhbGlkSUQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyB9IAorCSBpdl9ydWxlVmFsaWRJRD1ydWxlVmFsaWRJRCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVZhbGlkSUQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVmFsaWRJRAorcnVsZVZhbGlkSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKyAgICB0aGlzX0lEXzA9UlVMRV9JRCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbgorZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBpdl9ydWxlWEltcG9ydERlY2xhcmF0aW9uPXJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYSW1wb3J0RGVjbGFyYXRpb24uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJbXBvcnREZWNsYXJhdGlvbgorcnVsZVhJbXBvcnREZWNsYXJhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2ltcG9ydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0S2V5d29yZF8wKCkpOworICAgIH0KKygoKAorKAorCQlsdl9zdGF0aWNfMV8wPQknc3RhdGljJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3N0YXRpY18xXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljU3RhdGljS2V5d29yZF8xXzBfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgInN0YXRpYyIsIHRydWUsICJzdGF0aWMiKTsKKwkgICAgfQorCispCispKAorKAorCQlsdl9leHRlbnNpb25fMl8wPQknZXh0ZW5zaW9uJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X2V4dGVuc2lvbl8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uRXh0ZW5zaW9uS2V5d29yZF8xXzBfMV8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgImV4dGVuc2lvbiIsIHRydWUsICJleHRlbnNpb24iKTsKKwkgICAgfQorCispCispPygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlQ3Jvc3NSZWZlcmVuY2VfMV8wXzJfMCgpKTsgCisJICAgIH0KKwkJcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKCgKKygKKwkJbHZfd2lsZGNhcmRfNF8wPQknKicgCisgICAgeworICAgICAgICBuZXdMZWFmTm9kZShsdl93aWxkY2FyZF80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3Rlcmlza0tleXdvcmRfMV8wXzNfMF8wKCkpOworICAgIH0KKyAKKwkgICAgeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgkY3VycmVudCwgIndpbGRjYXJkIiwgdHJ1ZSwgIioiKTsKKwkgICAgfQorCispCispCisgICAgfCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lVmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMF8zXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbWVtYmVyTmFtZV81XzA9cnVsZVZhbGlkSUQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJIm1lbWJlck5hbWUiLAorICAgICAgICAJCWx2X21lbWJlck5hbWVfNV8wLCAKKyAgICAgICAgCQkiVmFsaWRJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKQorICAgIHwoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUp2bURlY2xhcmVkVHlwZUNyb3NzUmVmZXJlbmNlXzFfMV8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZQkJeyAKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCisgICAgfCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRQYXJzZXJSdWxlQ2FsbF8xXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfN18wPXJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbXBvcnRlZE5hbWVzcGFjZSIsCisgICAgICAgIAkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfN18wLCAKKyAgICAgICAgCQkiUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKAlvdGhlcmx2Xzg9JzsnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMigpKTsKKyAgICB9CispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkpOyB9IAorCSBpdl9ydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0PXJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CitydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzA9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworCWt3PScuJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzEoKSk7IAorICAgIH0KKykrCisgICAgOworCisKKworCisKKy8vIFJ1bGUgTGVnZW5kUGxhY2VtZW50RW51bQorcnVsZUxlZ2VuZFBsYWNlbWVudEVudW0gcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCWVudW1MaXRlcmFsXzA9J2luc2lkZScgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldElOU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMCwgZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0SU5TSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfMT0naW5zaWRlLWdyaWQnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldExlZ2VuZFBsYWNlbWVudEVudW1BY2Nlc3MoKS5nZXRJTlNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0SU5TSURFX0dSSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8yPSdvdXRzaWRlJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0T1VUU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0T1VUU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzM9J291dHNpZGUtZ3JpZCcgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0TGVnZW5kUGxhY2VtZW50RW51bUFjY2VzcygpLmdldE9VVFNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMygpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMywgZ3JhbW1hckFjY2Vzcy5nZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0T1VUU0lERV9HUklERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyAKKyAgICB9CispKTsKKworCisKKy8vIFJ1bGUgVG9nZ2xlVHlwZUVudW0KK3J1bGVUb2dnbGVUeXBlRW51bSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgJZW51bUxpdGVyYWxfMD0nbm9ybWFsJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldE5PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzE9J3Nsb3cnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFRvZ2dsZVR5cGVFbnVtQWNjZXNzKCkuZ2V0U0xPV0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldFNMT1dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8yPSdmYXN0JyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRUb2dnbGVUeXBlRW51bUFjY2VzcygpLmdldEZBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzIsIGdyYW1tYXJBY2Nlc3MuZ2V0VG9nZ2xlVHlwZUVudW1BY2Nlc3MoKS5nZXRGQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyAKKyAgICB9CispKTsKKworCisKKy8vIFJ1bGUgVG9vbHRpcExvY2F0aW9uRW51bQorcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gcmV0dXJucyBbRW51bWVyYXRvciBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCWVudW1MaXRlcmFsXzA9J25vcnRoJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0Tk9SVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfMT0nbm9ydGgtZWFzdCcgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8yPSdlYXN0JyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0RUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0RUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzM9J3NvdXRoLWVhc3QnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRTT1VUSF9FQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8zLCBncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRTT1VUSF9FQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfND0nc291dGgnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRTT1VUSEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNCwgZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF81PSdzb3V0aC13ZXN0JyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNSwgZ3JhbW1hckFjY2Vzcy5nZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0U09VVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzY9J3dlc3QnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRXRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF82LCBncmFtbWFyQWNjZXNzLmdldFRvb2x0aXBMb2NhdGlvbkVudW1BY2Nlc3MoKS5nZXRXRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl82KCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfNz0nbm9ydGgtd2VzdCcgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX1dFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzcsIGdyYW1tYXJBY2Nlc3MuZ2V0VG9vbHRpcExvY2F0aW9uRW51bUFjY2VzcygpLmdldE5PUlRIX1dFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzcoKSk7IAorICAgIH0KKykpOworCisKKworLy8gUnVsZSBSZW5kZXJUeXBlRW51bQorcnVsZVJlbmRlclR5cGVFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAllbnVtTGl0ZXJhbF8wPSdjYXRlZ29yeScgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRDQVRFR09SWUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldENBVEVHT1JZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfMT0nbGluZWFyJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldExJTkVBUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldExJTkVBUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzI9J2RhdGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0REFURUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldERBVEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8zPSdsb2dhcml0aG1pYycgCisJeworICAgICAgICAkY3VycmVudCA9IGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRMT0dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzMsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRMT0dFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF80PSdweXJhbWlkJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSZW5kZXJUeXBlRW51bUFjY2VzcygpLmdldFBZUkFNSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzQsIGdyYW1tYXJBY2Nlc3MuZ2V0UmVuZGVyVHlwZUVudW1BY2Nlc3MoKS5nZXRQWVJBTUlERW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyAKKyAgICB9CispKTsKKworCisKK1JVTEVfSEVYIDogKCcweCd8JzBYJykgKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnfCdfJykrICgnIycgKCgnYid8J0InKSAoJ2knfCdJJyl8KCdsJ3wnTCcpKSk/OworCitSVUxFX0lOVCA6ICcwJy4uJzknICgnMCcuLic5J3wnXycpKjsKKworUlVMRV9ERUNJTUFMIDogUlVMRV9JTlQgKCgnZSd8J0UnKSAoJysnfCctJyk/IFJVTEVfSU5UKT8gKCgnYid8J0InKSAoJ2knfCdJJ3wnZCd8J0QnKXwoJ2wnfCdMJ3wnZCd8J0QnfCdmJ3wnRicpKT87CisKK1JVTEVfSUQgOiAnXic/ICgnYScuLid6J3wnQScuLidaJ3wnJCd8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JyQnfCdfJ3wnMCcuLic5JykqOworCitSVUxFX1NUUklORyA6ICgnIicgKCdcXCcgLnx+KCgnXFwnfCciJykpKSogJyInP3wnXCcnICgnXFwnIC58figoJ1xcJ3wnXCcnKSkpKiAnXCcnPyk7CisKK1JVTEVfTUxfQ09NTUVOVCA6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4gKSonKi8nOworCitSVUxFX1NMX0NPTU1FTlQgOiAnLy8nIH4oKCdcbid8J1xyJykpKiAoJ1xyJz8gJ1xuJyk/OworCitSVUxFX1dTIDogKCcgJ3wnXHQnfCdccid8J1xuJykrOworCitSVUxFX0FOWV9PVEhFUiA6IC47CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wudG9rZW5zIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZTA1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC50b2tlbnMKQEAgLTAsMCArMSwyODkgQEAKKychJz05OQorJyE9Jz04NQorJyE9PSc9ODcKKycjJz03MQorJyUnPTk4CisnJT0nPTc4CisnJiYnPTgzCisnJic9MTMzCisnKCc9NjcKKycpJz02OQorJyonPTY1CisnKionPTk2CisnKj0nPTc2CisnKyc9OTUKKycrKyc9MTAwCisnKz0nPTc0CisnLCc9NjgKKyctJz02MworJy0tJz0xMDEKKyctPSc9NzUKKyctPic9ODkKKycuJz02NAorJy4uJz05MQorJy4uPCc9OTAKKycvJz05NworJy89Jz03NworJzonPTEwOQorJzo6Jz0xMDIKKyc7Jz0xMDUKKyc8Jz03OQorJzw+Jz05MworJz0nPTcwCisnPT0nPTg0CisnPT09Jz04NgorJz0+Jz05MgorJz4nPTgwCisnPj0nPTgxCisnPyc9MTMyCisnPy4nPTEwMworJz86Jz05NAorJ0AnPTY2CisnWyc9NzIKKyddJz03MworJ2Fsd2F5cyc9NTUKKydhbmltYXRlZCc9MjMKKydhcyc9MTgKKydheGlzJz01NworJ2Jhcic9MjEKKydidWJibGUnPTM3CisnY2FzZSc9MTExCisnY2F0Y2gnPTEzMQorJ2NhdGVnb3J5Jz0xNDgKKydjaGFydCc9MTYKKydjb2xsYXBzaWJsZSc9NDkKKydjdXJzb3InPTI5CisnZGF0YW1hcnQnPTUxCisnZGF0ZSc9MTUwCisnZGVmYXVsdCc9MTEwCisnZGVzY3JpYmVkIGJ5Jz0xNworJ2RvJz0xMTQKKydkb251dCc9MzYKKydlYXN0Jz0xNDIKKydlbHNlJz0xMDcKKydlbXB0eSc9MzUKKydleHRlbmRzJz0xMTcKKydleHRlbnNpb24nPTExOQorJ2ZhbHNlJz0xMjIKKydmYXN0Jz0xMzkKKydmaWxsWmVybyc9MzIKKydmaWxsZWQnPTMzCisnZmluYWxseSc9MTI5CisnZm9yJz0xMTIKKydnYXVnZSc9NDEKKydncmFkaWVudCc9MzkKKydoYXNUaWNrcyc9NDMKKydpZic9MTA2CisnaW1wb3J0Jz02MgorJ2luc2lkZSc9NTYKKydpbnNpZGUtZ3JpZCc9MTM0CisnaW5zdGFuY2VvZic9ODgKKydpbnRlcnZhbHMnPTQ2CisnbGFiZWwnPTQyCisnbGVnZW5kJz01MgorJ2xpbmUnPTI2CisnbGluZWFyJz0xNDkKKydsb2dhcml0aG1pYyc9MTUxCisnbWFwJz00OAorJ21heGltdW0nPTQ1CisnbWluaW11bSc9NDQKKydtdWx0aXBsaWVyJz0zOAorJ25ldyc9MTIxCisnbm9ybWFsJz0xMzcKKydub3J0aCc9MTQwCisnbm9ydGgtZWFzdCc9MTQxCisnbm9ydGgtd2VzdCc9MTQ3CisnbnVsbCc9MTI0Cisnb3V0c2lkZSc9MTM1Cisnb3V0c2lkZS1ncmlkJz0xMzYKKydwYWNrYWdlJz0xMworJ3BpZSc9MzQKKydwb2xsaW5nJz0xOQorJ3B5cmFtaWQnPTE1MgorJ3JlbmRlcnMnPTU4CisncmVwbG90Jz01NAorJ3JldHVybic9MTI3Cisnc2VnbWVudGNvbG9yJz02MQorJ3NoYWRlZCc9MjIKKydzaG9ydExhYmVsJz01OQorJ3Nob3dNYXJrZXInPTI3Cisnc2xvdyc9MTM4Cisnc291dGgnPTE0NAorJ3NvdXRoLWVhc3QnPTE0MworJ3NvdXRoLXdlc3QnPTE0NQorJ3N0YWNrZWQnPTI1Cisnc3RhdGljJz0xMTgKKydzdXBlcic9MTIwCisnc3dhcHBlZCc9MjQKKydzd2l0Y2gnPTEwOAorJ3N5bmNocm9uaXplZCc9MTMwCisndGhyb3cnPTEyNgorJ3RpY2thbmdsZSc9NjAKKyd0b2dnbGUnPTUzCisndG9vbHRpcCc9MzEKKyd0cmFuc3BhcmVudCc9NDAKKyd0cmVlJz00NworJ3RyZW5kTGluZSc9MjgKKyd0cnVlJz0xMjMKKyd0cnknPTEyOAorJ3R5cGVvZic9MTI1CisndXAgdG8nPTUwCisndXNpbmcnPTIwCisndmFsJz0xMTYKKyd2YXInPTExNQorJ3dlc3QnPTE0NgorJ3doaWxlJz0xMTMKKyd6b29tJz0zMAorJ3snPTE0CisnfCc9MTA0CisnfHwnPTgyCisnfSc9MTUKK1JVTEVfQU5ZX09USEVSPTEyCitSVUxFX0RFQ0lNQUw9OAorUlVMRV9IRVg9NworUlVMRV9JRD02CitSVUxFX0lOVD00CitSVUxFX01MX0NPTU1FTlQ9OQorUlVMRV9TTF9DT01NRU5UPTEwCitSVUxFX1NUUklORz01CitSVUxFX1dTPTExCitUX18xMDA9MTAwCitUX18xMDE9MTAxCitUX18xMDI9MTAyCitUX18xMDM9MTAzCitUX18xMDQ9MTA0CitUX18xMDU9MTA1CitUX18xMDY9MTA2CitUX18xMDc9MTA3CitUX18xMDg9MTA4CitUX18xMDk9MTA5CitUX18xMTA9MTEwCitUX18xMTE9MTExCitUX18xMTI9MTEyCitUX18xMTM9MTEzCitUX18xMTQ9MTE0CitUX18xMTU9MTE1CitUX18xMTY9MTE2CitUX18xMTc9MTE3CitUX18xMTg9MTE4CitUX18xMTk9MTE5CitUX18xMjA9MTIwCitUX18xMjE9MTIxCitUX18xMjI9MTIyCitUX18xMjM9MTIzCitUX18xMjQ9MTI0CitUX18xMjU9MTI1CitUX18xMjY9MTI2CitUX18xMjc9MTI3CitUX18xMjg9MTI4CitUX18xMjk9MTI5CitUX18xMzA9MTMwCitUX18xMzE9MTMxCitUX18xMzI9MTMyCitUX18xMzM9MTMzCitUX18xMzQ9MTM0CitUX18xMzU9MTM1CitUX18xMzY9MTM2CitUX18xMzc9MTM3CitUX18xMzg9MTM4CitUX18xMzk9MTM5CitUX18xMz0xMworVF9fMTQwPTE0MAorVF9fMTQxPTE0MQorVF9fMTQyPTE0MgorVF9fMTQzPTE0MworVF9fMTQ0PTE0NAorVF9fMTQ1PTE0NQorVF9fMTQ2PTE0NgorVF9fMTQ3PTE0NworVF9fMTQ4PTE0OAorVF9fMTQ5PTE0OQorVF9fMTQ9MTQKK1RfXzE1MD0xNTAKK1RfXzE1MT0xNTEKK1RfXzE1Mj0xNTIKK1RfXzE1PTE1CitUX18xNj0xNgorVF9fMTc9MTcKK1RfXzE4PTE4CitUX18xOT0xOQorVF9fMjA9MjAKK1RfXzIxPTIxCitUX18yMj0yMgorVF9fMjM9MjMKK1RfXzI0PTI0CitUX18yNT0yNQorVF9fMjY9MjYKK1RfXzI3PTI3CitUX18yOD0yOAorVF9fMjk9MjkKK1RfXzMwPTMwCitUX18zMT0zMQorVF9fMzI9MzIKK1RfXzMzPTMzCitUX18zND0zNAorVF9fMzU9MzUKK1RfXzM2PTM2CitUX18zNz0zNworVF9fMzg9MzgKK1RfXzM5PTM5CitUX180MD00MAorVF9fNDE9NDEKK1RfXzQyPTQyCitUX180Mz00MworVF9fNDQ9NDQKK1RfXzQ1PTQ1CitUX180Nj00NgorVF9fNDc9NDcKK1RfXzQ4PTQ4CitUX180OT00OQorVF9fNTA9NTAKK1RfXzUxPTUxCitUX181Mj01MgorVF9fNTM9NTMKK1RfXzU0PTU0CitUX181NT01NQorVF9fNTY9NTYKK1RfXzU3PTU3CitUX181OD01OAorVF9fNTk9NTkKK1RfXzYwPTYwCitUX182MT02MQorVF9fNjI9NjIKK1RfXzYzPTYzCitUX182ND02NAorVF9fNjU9NjUKK1RfXzY2PTY2CitUX182Nz02NworVF9fNjg9NjgKK1RfXzY5PTY5CitUX183MD03MAorVF9fNzE9NzEKK1RfXzcyPTcyCitUX183Mz03MworVF9fNzQ9NzQKK1RfXzc1PTc1CitUX183Nj03NgorVF9fNzc9NzcKK1RfXzc4PTc4CitUX183OT03OQorVF9fODA9ODAKK1RfXzgxPTgxCitUX184Mj04MgorVF9fODM9ODMKK1RfXzg0PTg0CitUX184NT04NQorVF9fODY9ODYKK1RfXzg3PTg3CitUX184OD04OAorVF9fODk9ODkKK1RfXzkwPTkwCitUX185MT05MQorVF9fOTI9OTIKK1RfXzkzPTkzCitUX185ND05NAorVF9fOTU9OTUKK1RfXzk2PTk2CitUX185Nz05NworVF9fOTg9OTgKK1RfXzk5PTk5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTExleGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTExleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzYjYwNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMTGV4ZXIuamF2YQpAQCAtMCwwICsxLDYwMjUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHIuaW50ZXJuYWw7CisKKy8vIEhhY2s6IFVzZSBvdXIgb3duIExleGVyIHN1cGVyY2xhc3MgYnkgbWVhbnMgb2YgaW1wb3J0LiAKKy8vIEN1cnJlbnRseSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gc3BlY2lmeSB0aGUgc3VwZXJjbGFzcyBmb3IgdGhlIGxleGVyLgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlcjsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxDaGFydERTTExleGVyIGV4dGVuZHMgTGV4ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0ND0xNDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQzPTE0MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDY9MTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ1PTE0NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDA9MTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Mj0xNDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQxPTE0MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzc9MTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUyPTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNj0xMzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM5PTEzOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzg9MTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMz0xMzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMyPTEzMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzU9MTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYxPTYxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzND0xMzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD02OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzMT0xMzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMwPTEzMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lOVD00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY2PTY2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfTUxfQ09NTUVOVD05OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY3PTY3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOT0xMjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI2PTEyNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjU9MTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzY0PTY0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyOD0xMjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI3PTEyNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTE9MTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MD0xNTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUyPTE1MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDg9MTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQxPTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nz0xNDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ5PTE0OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjI9MTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcwPTcwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMT0xMjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI0PTEyNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjM9MTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMD0xMjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE5PTExOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTg9MTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc5PTc5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzczPTczOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNT0xMTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExND0xMTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzU9NzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE3PTExNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nj03NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTY9MTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMT0xMTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEwPTExMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Mj04MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTM9MTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMj0xMTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDg9MTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg5PTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA5PTEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDQ9MTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg1PTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMz0xMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODY9ODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDU9MTA1OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisgICAgcHVibGljIEludGVybmFsQ2hhcnREU0xMZXhlcigpIHs7fSAKKyAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTExleGVyKENoYXJTdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICB9CisgICAgcHVibGljIEludGVybmFsQ2hhcnREU0xMZXhlcihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsc3RhdGUpOworCisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmciOyB9CisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE6NzogKCAncGFja2FnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTo5OiAncGFja2FnZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwYWNrYWdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOjc6ICggJ3snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI6OTogJ3snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgneycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM6NzogKCAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzo5OiAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCd9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDo3OiAoICdjaGFydCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDo5OiAnY2hhcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2hhcnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU6NzogKCAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1Ojk6ICdkZXNjcmliZWQgYnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZGVzY3JpYmVkIGJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2Ojc6ICggJ2FzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2Ojk6ICdhcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzo3OiAoICdwb2xsaW5nJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3Ojk6ICdwb2xsaW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInBvbGxpbmciKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg6NzogKCAndXNpbmcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg6OTogJ3VzaW5nJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzaW5nIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5Ojc6ICggJ2JhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTo5OiAnYmFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImJhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDo3OiAoICdzaGFkZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA6OTogJ3NoYWRlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaGFkZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE6NzogKCAnYW5pbWF0ZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE6OTogJ2FuaW1hdGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFuaW1hdGVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyOjc6ICggJ3N3YXBwZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI6OTogJ3N3YXBwZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dhcHBlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzo3OiAoICdzdGFja2VkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOjk6ICdzdGFja2VkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YWNrZWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ6NzogKCAnbGluZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDo5OiAnbGluZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsaW5lIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Ojc6ICggJ3Nob3dNYXJrZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU6OTogJ3Nob3dNYXJrZXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic2hvd01hcmtlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjo3OiAoICd0cmVuZExpbmUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY6OTogJ3RyZW5kTGluZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cmVuZExpbmUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc6NzogKCAnY3Vyc29yJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3Ojk6ICdjdXJzb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY3Vyc29yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4Ojc6ICggJ3pvb20nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg6OTogJ3pvb20nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiem9vbSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTo3OiAoICd0b29sdGlwJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5Ojk6ICd0b29sdGlwJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRvb2x0aXAiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA6NzogKCAnZmlsbFplcm8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA6OTogJ2ZpbGxaZXJvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZpbGxaZXJvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxOjc6ICggJ2ZpbGxlZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTo5OiAnZmlsbGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZpbGxlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjo3OiAoICdwaWUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI6OTogJ3BpZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwaWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM6NzogKCAnZW1wdHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM6OTogJ2VtcHR5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVtcHR5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0Ojc6ICggJ2RvbnV0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0Ojk6ICdkb251dCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkb251dCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNTo3OiAoICdidWJibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzU6OTogJ2J1YmJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJidWJibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzY6NzogKCAnbXVsdGlwbGllcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNjo5OiAnbXVsdGlwbGllcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtdWx0aXBsaWVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM3Ojc6ICggJ2dyYWRpZW50JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM3Ojk6ICdncmFkaWVudCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJncmFkaWVudCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozODo3OiAoICd0cmFuc3BhcmVudCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozODo5OiAndHJhbnNwYXJlbnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJhbnNwYXJlbnQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzk6NzogKCAnZ2F1Z2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mzk6OTogJ2dhdWdlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImdhdWdlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQwOjc6ICggJ2xhYmVsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQwOjk6ICdsYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsYWJlbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTo3OiAoICdoYXNUaWNrcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MTo5OiAnaGFzVGlja3MnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaGFzVGlja3MiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDI6NzogKCAnbWluaW11bScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Mjo5OiAnbWluaW11bScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJtaW5pbXVtIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQzOjc6ICggJ21heGltdW0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDM6OTogJ21heGltdW0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibWF4aW11bSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NDo3OiAoICdpbnRlcnZhbHMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDQ6OTogJ2ludGVydmFscycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnRlcnZhbHMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDU6NzogKCAndHJlZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTo5OiAndHJlZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cmVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2Ojc6ICggJ21hcCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Njo5OiAnbWFwJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm1hcCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Nzo3OiAoICdjb2xsYXBzaWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0Nzo5OiAnY29sbGFwc2libGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY29sbGFwc2libGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDg6NzogKCAndXAgdG8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDg6OTogJ3VwIHRvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVwIHRvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzUwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ5Ojc6ICggJ2RhdGFtYXJ0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ5Ojk6ICdkYXRhbWFydCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkYXRhbWFydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MDo3OiAoICdsZWdlbmQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTA6OTogJ2xlZ2VuZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJsZWdlbmQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTE6NzogKCAndG9nZ2xlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUxOjk6ICd0b2dnbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidG9nZ2xlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzUzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUyOjc6ICggJ3JlcGxvdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mjo5OiAncmVwbG90JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJlcGxvdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzo3OiAoICdhbHdheXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTM6OTogJ2Fsd2F5cycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbHdheXMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQ6NzogKCAnaW5zaWRlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU0Ojk6ICdpbnNpZGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zaWRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU1Ojc6ICggJ2F4aXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTU6OTogJ2F4aXMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYXhpcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Njo3OiAoICdyZW5kZXJzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2Ojk6ICdyZW5kZXJzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJlbmRlcnMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTc6NzogKCAnc2hvcnRMYWJlbCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Nzo5OiAnc2hvcnRMYWJlbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzaG9ydExhYmVsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU4Ojc6ICggJ3RpY2thbmdsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1ODo5OiAndGlja2FuZ2xlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRpY2thbmdsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1OTo3OiAoICdzZWdtZW50Y29sb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTk6OTogJ3NlZ21lbnRjb2xvcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzZWdtZW50Y29sb3IiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjA6NzogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwOjk6ICdpbXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW1wb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYxOjc6ICggJy0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjE6OTogJy0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI6NzogKCAnLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Mjo5OiAnLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Mzo3OiAoICcqJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzOjk6ICcqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0Ojc6ICggJ0AnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjQ6OTogJ0AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnQCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjU6NzogKCAnKCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NTo5OiAnKCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcoJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Njo3OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2Ojk6ICcsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJywnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY3Ojc6ICggJyknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njc6OTogJyknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njg6NzogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2ODo5OiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTo3OiAoICcjJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5Ojk6ICcjJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcwOjc6ICggJ1snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzA6OTogJ1snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnWycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzczIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE6NzogKCAnXScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MTo5OiAnXScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mjo3OiAoICcrPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mjo5OiAnKz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzM6NzogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzM6OTogJy09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi09Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc0Ojc6ICggJyo9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc0Ojk6ICcqPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NTo3OiAoICcvPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NTo5OiAnLz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzY6NzogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzY6OTogJyU9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiU9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3Ojc6ICggJzwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzc6OTogJzwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzg6NzogKCAnPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3ODo5OiAnPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc+Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3OTo3OiAoICc+PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3OTo5OiAnPj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA6NzogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA6OTogJ3x8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInx8Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgxOjc6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgxOjk6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCImJiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mjo3OiAoICc9PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Mjo5OiAnPT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODM6NzogKCAnIT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODM6OTogJyE9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg0Ojc6ICggJz09PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NDo5OiAnPT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj09PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTo3OiAoICchPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU6OTogJyE9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODY6NzogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4Njo5OiAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnN0YW5jZW9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg3Ojc6ICggJy0+JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg3Ojk6ICctPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4ODo3OiAoICcuLjwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODg6OTogJy4uPCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIuLjwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODk6NzogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODk6OTogJy4uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwOjc6ICggJz0+JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwOjk6ICc9PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MTo3OiAoICc8PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MTo5OiAnPD4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPD4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTI6NzogKCAnPzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTI6OTogJz86JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj86Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzOjc6ICggJysnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTM6OTogJysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQ6NzogKCAnKionICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQ6OTogJyoqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIioqIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk1Ojc6ICggJy8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU6OTogJy8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTY6NzogKCAnJScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5Njo5OiAnJScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCclJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5Nzo3OiAoICchJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk3Ojk6ICchJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyEnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk4Ojg6ICggJysrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk4OjEwOiAnKysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKysiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk5Ojg6ICggJy0tJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk5OjEwOiAnLS0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLS0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMDo4OiAoICc6OicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDA6MTA6ICc6OicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI6OiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAxOjg6ICggJz8uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMToxMDogJz8uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj8uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDI6ODogKCAnfCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDI6MTA6ICd8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDM6ODogKCAnOycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDM6MTA6ICc7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzsnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDQ6ODogKCAnaWYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA0OjEwOiAnaWYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaWYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNTo4OiAoICdlbHNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNToxMDogJ2Vsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZWxzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA2Ojg6ICggJ3N3aXRjaCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDY6MTA6ICdzd2l0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3dpdGNoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDc6ODogKCAnOicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDc6MTA6ICc6JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDg6ODogKCAnZGVmYXVsdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDg6MTA6ICdkZWZhdWx0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRlZmF1bHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwOTo4OiAoICdjYXNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwOToxMDogJ2Nhc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2FzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTEyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEwOjg6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTA6MTA6ICdmb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZm9yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTEzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTEzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTE6ODogKCAnd2hpbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTExOjEwOiAnd2hpbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgid2hpbGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTEzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMjo4OiAoICdkbycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTI6MTA6ICdkbycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkbyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzOjg6ICggJ3ZhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTM6MTA6ICd2YXInCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidmFyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTQ6ODogKCAndmFsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNDoxMDogJ3ZhbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzExNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNTo4OiAoICdleHRlbmRzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNToxMDogJ2V4dGVuZHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXh0ZW5kcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzExOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzExODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE2Ojg6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTY6MTA6ICdzdGF0aWMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3RhdGljIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzExOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTc6ODogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNzoxMDogJ2V4dGVuc2lvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbnNpb24iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExODo4OiAoICdzdXBlcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTg6MTA6ICdzdXBlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdXBlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE5Ojg6ICggJ25ldycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTk6MTA6ICduZXcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjA6ODogKCAnZmFsc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwOjEwOiAnZmFsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTIyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMTo4OiAoICd0cnVlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMToxMDogJ3RydWUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJ1ZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyOjg6ICggJ251bGwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyOjEwOiAnbnVsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjM6ODogKCAndHlwZW9mJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMzoxMDogJ3R5cGVvZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0eXBlb2YiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNDo4OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjQ6MTA6ICd0aHJvdycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0aHJvdyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEyNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEyNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI1Ojg6ICggJ3JldHVybicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjU6MTA6ICdyZXR1cm4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEyNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjY6ODogKCAndHJ5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNjoxMDogJ3RyeScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTI4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEyOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNzo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyNzoxMDogJ2ZpbmFsbHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmluYWxseSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMjkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzMDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI4Ojg6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg6MTA6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTMxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTMxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjk6ODogKCAnY2F0Y2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI5OjEwOiAnY2F0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2F0Y2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMDo4OiAoICc/JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMDoxMDogJz8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzMygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMTo4OiAoICcmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMToxMDogJyYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTMzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMjo4OiAoICdpbnNpZGUtZ3JpZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzI6MTA6ICdpbnNpZGUtZ3JpZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnNpZGUtZ3JpZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMzOjg6ICggJ291dHNpZGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMzOjEwOiAnb3V0c2lkZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvdXRzaWRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzQ6ODogKCAnb3V0c2lkZS1ncmlkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNDoxMDogJ291dHNpZGUtZ3JpZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJvdXRzaWRlLWdyaWQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEzNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMzc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNTo4OiAoICdub3JtYWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM1OjEwOiAnbm9ybWFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5vcm1hbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEzOCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEzODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2Ojg6ICggJ3Nsb3cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2OjEwOiAnc2xvdycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzbG93Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEzOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzc6ODogKCAnZmFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzc6MTA6ICdmYXN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZhc3QiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzODo4OiAoICdub3J0aCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzg6MTA6ICdub3J0aCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub3J0aCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0MTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM5Ojg6ICggJ25vcnRoLWVhc3QnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM5OjEwOiAnbm9ydGgtZWFzdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub3J0aC1lYXN0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDA6ODogKCAnZWFzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDA6MTA6ICdlYXN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVhc3QiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MTo4OiAoICdzb3V0aC1lYXN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MToxMDogJ3NvdXRoLWVhc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic291dGgtZWFzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQyOjg6ICggJ3NvdXRoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MjoxMDogJ3NvdXRoJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNvdXRoIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDM6ODogKCAnc291dGgtd2VzdCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDM6MTA6ICdzb3V0aC13ZXN0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInNvdXRoLXdlc3QiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDo4OiAoICd3ZXN0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDoxMDogJ3dlc3QnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgid2VzdCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE0NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ1Ojg6ICggJ25vcnRoLXdlc3QnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ1OjEwOiAnbm9ydGgtd2VzdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub3J0aC13ZXN0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQ4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTQ4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY6ODogKCAnY2F0ZWdvcnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ2OjEwOiAnY2F0ZWdvcnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2F0ZWdvcnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTQ4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNDk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Nzo4OiAoICdsaW5lYXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ3OjEwOiAnbGluZWFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImxpbmVhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNDkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE1MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4Ojg6ICggJ2RhdGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4OjEwOiAnZGF0ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkYXRlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE1MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTUxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDk6ODogKCAnbG9nYXJpdGhtaWMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ5OjEwOiAnbG9nYXJpdGhtaWMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibG9nYXJpdGhtaWMiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MDo4OiAoICdweXJhbWlkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MDoxMDogJ3B5cmFtaWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicHlyYW1pZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNTIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfSEVYIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0hFWCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0hFWDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU5ODoxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTk4OjEyOiAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU5ODoxMjogKCAnMHgnIHwgJzBYJyApCisgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMV8wPT0nMCcpICkgeworICAgICAgICAgICAgICAgIGludCBMQTFfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExXzE9PSd4JykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTFfMT09J1gnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1OTg6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU5ODoxODogJzBYJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIwWCIpOyAKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTk4OjI0OiAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKworICAgICAgICAgICAgaW50IGNudDI9MDsKKyAgICAgICAgICAgIGxvb3AyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICAgICAgaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyXzA+PScwJyAmJiBMQTJfMDw9JzknKXx8KExBMl8wPj0nQScgJiYgTEEyXzA8PSdGJyl8fExBMl8wPT0nXyd8fChMQTJfMD49J2EnICYmIExBMl8wPD0nZicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J0YnKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSdmJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBpZiAoIGNudDIgPj0gMSApIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyLCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNudDIrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1OTg6NTg6ICggJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT0nIycpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU5ODo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU5ODo2MzogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PSdCJ3x8TEEzXzA9PSdiJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTNfMD09J0wnfHxMQTNfMD09J2wnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1OTg6NjQ6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1OTg6ODQ6ICggJ2wnIHwgJ0wnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0hFWCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjAwOjEwOiAoICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwMDoxMjogJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoUmFuZ2UoJzAnLCc5Jyk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjAwOjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE1XzA+PScwJyAmJiBMQTVfMDw9JzknKXx8TEE1XzA9PSdfJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8aW5wdXQuTEEoMSk9PSdfJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A1OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0RFQ0lNQUwiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfREVDSU1BTCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0RFQ0lNQUw7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDI6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDI6MTY6IFJVTEVfSU5UICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKSB8ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwMjoyNTogKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/CisgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBN18wPT0nRSd8fExBN18wPT0nZScpICkgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwMjoyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdFJ3x8aW5wdXQuTEEoMSk9PSdlJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjAyOjM2OiAoICcrJyB8ICctJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Nj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTZfMD09JysnfHxMQTZfMD09Jy0nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JysnfHxpbnB1dC5MQSgxKT09Jy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDI6NTg6ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgaW50IGFsdDg9MzsKKyAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQThfMD09J0InfHxMQThfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBOF8wPT0nRCd8fExBOF8wPT0nRid8fExBOF8wPT0nTCd8fExBOF8wPT0nZCd8fExBOF8wPT0nZid8fExBOF8wPT0nbCcpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwMjo1OTogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nSSd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0naScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDI6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfREVDSU1BTCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA0Ojk6ICggKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNDoxMTogKCAnXicgKT8gKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyApICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDQ6MTE6ICggJ14nICk/CisgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOV8wPT0nXicpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNDoxMTogJ14nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ14nKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nWicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J3onKSApIHsKKyAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNDo0NDogKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIGxvb3AxMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzA9PSckJ3x8KExBMTBfMD49JzAnICYmIExBMTBfMDw9JzknKXx8KExBMTBfMD49J0EnICYmIExBMTBfMDw9J1onKXx8TEExMF8wPT0nXyd8fChMQTEwXzA+PSdhJyAmJiBMQTEwXzA8PSd6JykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBpbnB1dC5MQSgxKT09JyQnfHwoaW5wdXQuTEEoMSk+PScwJyAmJiBpbnB1dC5MQSgxKTw9JzknKXx8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSUQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU1RSSU5HIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NUUklORygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NUUklORzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNjoxMzogKCAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNjoxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA2OjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICBpbnQgYWx0MTU9MjsKKyAgICAgICAgICAgIGludCBMQTE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExNV8wPT0nXCInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxNT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE1XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxNSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDY6MTY6ICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA2OjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj0nXHUwMDAwJyAmJiBMQTExXzA8PSchJyl8fChMQTExXzA+PScjJyAmJiBMQTExXzA8PSdbJyl8fChMQTExXzA+PSddJyAmJiBMQTExXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNjoyMTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDY6Mjg6IH4gKCAoICdcXFxcJyB8ICdcIicgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyEnKXx8KGlucHV0LkxBKDEpPj0nIycgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA2OjQ0OiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNjo0NDogJ1wiJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDY6NDk6ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcJycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA2OjU0OiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMzoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzPTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTNfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTNfMD49J1x1MDAwMCcgJiYgTEExM18wPD0nJicpfHwoTEExM18wPj0nKCcgJiYgTEExM18wPD0nWycpfHwoTEExM18wPj0nXScgJiYgTEExM18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDY6NTU6ICdcXFxcJyAuCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoKCdcXCcpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA2OjYyOiB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nJicpfHwoaW5wdXQuTEEoMSk+PScoJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MDY6Nzk6ICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwNjo3OTogJ1xcJycKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NUUklORyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9NTF9DT01NRU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX01MX0NPTU1FTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9NTF9DT01NRU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA4OjE3OiAoICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjA4OjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwODoyNDogKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqCisgICAgICAgICAgICBsb29wMTY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8wPT0nKicpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEExNl8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8xPT0nLycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTE2XzE+PSdcdTAwMDAnICYmIExBMTZfMTw9Jy4nKXx8KExBMTZfMT49JzAnICYmIExBMTZfMTw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMD49J1x1MDAwMCcgJiYgTEExNl8wPD0nKScpfHwoTEExNl8wPj0nKycgJiYgTEExNl8wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNj0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYwODo1MjogLgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBtYXRjaCgiKi8iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9NTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1NMX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU0xfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX1NMX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MTA6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxMDoxOTogJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLy8iKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxMDoyNDogKH4gKCAoICdcXG4nIHwgJ1xccicgKSApICkqCisgICAgICAgICAgICBsb29wMTc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE3PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTdfMD49J1x1MDAwMCcgJiYgTEExN18wPD0nXHQnKXx8KExBMTdfMD49J1x1MDAwQicgJiYgTEExN18wPD0nXGYnKXx8KExBMTdfMD49J1x1MDAwRScgJiYgTEExN18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxNz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxNykgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxMDoyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MTA6NDA6ICggKCAnXFxyJyApPyAnXFxuJyApPworICAgICAgICAgICAgaW50IGFsdDE5PTI7CisgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTlfMD09J1xuJ3x8TEExOV8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxMDo0MTogKCAnXFxyJyApPyAnXFxuJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxMDo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMThfMD09J1xyJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjEwOjQxOiAnXFxyJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXHInKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcbicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9TTF9DT01NRU5UIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX1dTIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1dTKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfV1M7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MTI6OTogKCAoICcgJyB8ICdcXHQnIHwgJ1xccicgfCAnXFxuJyApKyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MTI6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2MTI6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICBpbnQgY250MjA9MDsKKyAgICAgICAgICAgIGxvb3AyMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEEyMF8wPj0nXHQnICYmIExBMjBfMDw9J1xuJyl8fExBMjBfMD09J1xyJ3x8TEEyMF8wPT0nICcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdCcgJiYgaW5wdXQuTEEoMSk8PSdcbicpfHxpbnB1dC5MQSgxKT09J1xyJ3x8aW5wdXQuTEEoMSk9PScgJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MjAgPj0gMSApIGJyZWFrIGxvb3AyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMjAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MjArKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfV1MiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfQU5ZX09USEVSIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0FOWV9PVEhFUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0FOWV9PVEhFUjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxNDoxNjogKCAuICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODYxNDoxODogLgorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfQU5ZX09USEVSIgorCisgICAgcHVibGljIHZvaWQgbVRva2VucygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4OiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFRfXzExNSB8IFRfXzExNiB8IFRfXzExNyB8IFRfXzExOCB8IFRfXzExOSB8IFRfXzEyMCB8IFRfXzEyMSB8IFRfXzEyMiB8IFRfXzEyMyB8IFRfXzEyNCB8IFRfXzEyNSB8IFRfXzEyNiB8IFRfXzEyNyB8IFRfXzEyOCB8IFRfXzEyOSB8IFRfXzEzMCB8IFRfXzEzMSB8IFRfXzEzMiB8IFRfXzEzMyB8IFRfXzEzNCB8IFRfXzEzNSB8IFRfXzEzNiB8IFRfXzEzNyB8IFRfXzEzOCB8IFRfXzEzOSB8IFRfXzE0MCB8IFRfXzE0MSB8IFRfXzE0MiB8IFRfXzE0MyB8IFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKQorICAgICAgICBpbnQgYWx0MjE9MTQ5OworICAgICAgICBhbHQyMSA9IGRmYTIxLnByZWRpY3QoaW5wdXQpOworICAgICAgICBzd2l0Y2ggKGFsdDIxKSB7CisgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToxMDogVF9fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTY6IFRfXzE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjIyOiBUX18xNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MToyODogVF9fMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzQ6IFRfXzE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjQwOiBUX18xOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo0NjogVF9fMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTI6IFRfXzIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU4OiBUX18yMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NjQ6IFRfXzIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo3MDogVF9fMjMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc2OiBUX18yNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6ODI6IFRfXzI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo4ODogVF9fMjYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjk0OiBUX18yNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTAwOiBUX18yOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTA2OiBUX18yOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTEyOiBUX18zMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTE4OiBUX18zMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTI0OiBUX18zMgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTMwOiBUX18zMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTM2OiBUX18zNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTQyOiBUX18zNQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTQ4OiBUX18zNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTU0OiBUX18zNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTYwOiBUX18zOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTY2OiBUX18zOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTcyOiBUX180MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTc4OiBUX180MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTg0OiBUX180MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTkwOiBUX180MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MTk2OiBUX180NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjAyOiBUX180NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjA4OiBUX180NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjE0OiBUX180NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjIwOiBUX180OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjI2OiBUX180OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjMyOiBUX181MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjM4OiBUX181MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjQ0OiBUX181MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjUwOiBUX181MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjU2OiBUX181NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjYyOiBUX181NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjY4OiBUX181NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mjc0OiBUX181NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjgwOiBUX181OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mjg2OiBUX181OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MjkyOiBUX182MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mjk4OiBUX182MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzA0OiBUX182MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzEwOiBUX182MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzE2OiBUX182NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzIyOiBUX182NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzI4OiBUX182NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzM0OiBUX182NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzQwOiBUX182OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzQ2OiBUX182OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzUyOiBUX183MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzU4OiBUX183MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzY0OiBUX183MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzcwOiBUX183MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mzc2OiBUX183NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6MzgyOiBUX183NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mzg4OiBUX183NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6Mzk0OiBUX183NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDAwOiBUX183OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDA2OiBUX183OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDEyOiBUX184MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDE4OiBUX184MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDI0OiBUX184MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDMwOiBUX184MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDM2OiBUX184NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDczIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDQyOiBUX184NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDQ4OiBUX184NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDU0OiBUX184NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDYwOiBUX184OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDY2OiBUX184OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDcyOiBUX185MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDc4OiBUX185MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDg0OiBUX185MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDkwOiBUX185MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NDk2OiBUX185NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTAyOiBUX185NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTA4OiBUX185NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTE0OiBUX185NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTIwOiBUX185OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTI2OiBUX185OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTMyOiBUX18xMDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1Mzk6IFRfXzEwMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU0NjogVF9fMTAyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTUzOiBUX18xMDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1NjA6IFRfXzEwNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU2NzogVF9fMTA1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTc0OiBUX18xMDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo1ODE6IFRfXzEwNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjU4ODogVF9fMTA4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6NTk1OiBUX18xMDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo2MDI6IFRfXzExMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTEwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYwOTogVF9fMTExCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYxNjogVF9fMTEyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYyMzogVF9fMTEzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYzMDogVF9fMTE0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjYzNzogVF9fMTE1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY0NDogVF9fMTE2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY1MTogVF9fMTE3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY1ODogVF9fMTE4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY2NTogVF9fMTE5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY3MjogVF9fMTIwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY3OTogVF9fMTIxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY4NjogVF9fMTIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjY5MzogVF9fMTIzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcwMDogVF9fMTI0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcwNzogVF9fMTI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcxNDogVF9fMTI2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcyMTogVF9fMTI3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjcyODogVF9fMTI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjczNTogVF9fMTI5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMjkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc0MjogVF9fMTMwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc0OTogVF9fMTMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc1NjogVF9fMTMyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc2MzogVF9fMTMzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc3MDogVF9fMTM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc3NzogVF9fMTM1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc4NDogVF9fMTM2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc5MTogVF9fMTM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjc5ODogVF9fMTM4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgwNTogVF9fMTM5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgxMjogVF9fMTQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgxOTogVF9fMTQxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgyNjogVF9fMTQyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjgzMzogVF9fMTQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg0MDogVF9fMTQ0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg0NzogVF9fMTQ1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg1NDogVF9fMTQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg2MTogVF9fMTQ3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg2ODogVF9fMTQ4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg3NTogVF9fMTQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg4MjogVF9fMTUwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEzOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg4OTogVF9fMTUxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjg5NjogVF9fMTUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE0MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOjkwMzogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo5MTI6IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTIxOiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfREVDSU1BTCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTM0OiBSVUxFX0lECisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0lEKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo5NDI6IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1NUUklORygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTU0OiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfTUxfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTcwOiBSVUxFX1NMX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU0xfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE6OTg2OiBSVUxFX1dTCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1dTKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTo5OTQ6IFJVTEVfQU5ZX09USEVSCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0FOWV9PVEhFUigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBERkEyMSBkZmEyMSA9IG5ldyBERkEyMSh0aGlzKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw3MlwyXHVmZmZmXDIwXDcyXDFcMTYyXDFcMTY0XDFcMTY3XDRcdWZmZmZcMVwxNzZcM1x1ZmZmZiIrCisgICAgICAgICJcMVx1MDA4NFwxXHUwMDg4XDFcdTAwOGFcMVx1MDA4Y1wxXHUwMDhlXDFcdTAwOTBcMVx1MDA5MlwxXHUwMDk0IisKKyAgICAgICAgIlwxXHUwMDk3XDFcdTAwOTlcMVx1ZmZmZlw0XDcyXDJcdTAwYTRcMVw2NVw1XHVmZmZmXDRcNzJcM1x1ZmZmZiIrCisgICAgICAgICJcNVw3MlwxXHUwMGI0XDFcNzJcMVx1MDBiNlw1MFw3MlwxXHUwMGU5XDFcNzJcNFx1ZmZmZlwxXHUwMGVlXDEwIisKKyAgICAgICAgIlx1ZmZmZlwxXHUwMGYwXDI2XHVmZmZmXDFcdTAwZjJcN1x1ZmZmZlw3XDcyXDFcdWZmZmZcMVx1MDBhNFw0XHVmZmZmIisKKyAgICAgICAgIlwyXDcyXDFcdTAwZmRcMTFcNzJcMVx1ZmZmZlwxXDcyXDFcdWZmZmZcNFw3MlwxXHVmZmZmXDFcdTAxMGVcMjIiKworICAgICAgICAiXDcyXDFcdTAxMjRcMTBcNzJcMVx1MDEyZFwxMVw3MlwxXHUwMTM3XDZcNzJcMVx1ZmZmZlwzXDcyXDZcdWZmZmYiKworICAgICAgICAiXDJcNzJcMVx1MDE0NFwxXHUwMTQ1XDFcdTAxNDZcNVw3MlwxXHVmZmZmXDRcNzJcMVx1MDE1MVw2XDcyXDFcdTAxNTgiKworICAgICAgICAiXDJcNzJcMVx1MDE1YlwxXDcyXDFcdWZmZmZcMTNcNzJcMVx1MDE2OFwxXDcyXDFcdTAxNmJcNFw3MlwxXHUwMTcwIisKKyAgICAgICAgIlwxXDcyXDFcdTAxNzJcMVx1ZmZmZlw1XDcyXDFcdTAxNzhcMlw3MlwxXHVmZmZmXDFcNzJcMVx1MDE3ZFwxXDcyIisKKyAgICAgICAgIlwxXHUwMTdmXDFcNzJcMVx1MDE4MVwzXDcyXDFcdWZmZmZcMTNcNzJcMVx1MDE5MFwzXHVmZmZmXDFcdTAxOTEiKworICAgICAgICAiXDZcNzJcMVx1MDE5OFwyXDcyXDFcdWZmZmZcMVx1MDE5YlwzXDcyXDFcdTAxOWZcMVw3MlwxXHVmZmZmXDJcNzIiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDFhM1wxMVw3MlwxXHUwMWFkXDFcNzJcMVx1ZmZmZlwxXHUwMWIwXDFcNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVx1MDFiMlwzXDcyXDFcdWZmZmZcMVw3MlwxXHVmZmZmXDRcNzJcMVx1MDFiYlwxXHVmZmZmXDNcNzJcMVx1MDFiZiIrCisgICAgICAgICJcMVx1ZmZmZlwxXHUwMWMwXDFcdWZmZmZcMVw3MlwxXHVmZmZmXDRcNzJcMVx1MDFjN1wxMFw3MlwxXHUwMWQwIisKKyAgICAgICAgIlwyXHVmZmZmXDFcNzJcMVx1MDFkM1w0XDcyXDFcdWZmZmZcMVx1MDFkOFwxXDcyXDFcdWZmZmZcM1w3MlwxXHVmZmZmIisKKyAgICAgICAgIlwyXDcyXDFcdTAxZGZcMVx1ZmZmZlwxXHUwMWUwXDFcdTAxZTFcM1w3MlwxXHUwMWU1XDFcNzJcMVx1MDFlNyIrCisgICAgICAgICJcMVw3MlwxXHVmZmZmXDFcNzJcMlx1ZmZmZlwxXHUwMWVjXDFcdWZmZmZcMVx1MDFlZFw0XDcyXDFcdTAxZjIiKworICAgICAgICAiXDFcNzJcMVx1MDFmNFwxXHVmZmZmXDFcNzJcMVx1MDFmNlwxXDcyXDJcdWZmZmZcNlw3MlwxXHVmZmZmXDJcNzIiKworICAgICAgICAiXDFcdTAyMDFcMVw3MlwxXHUwMjAzXDFcdTAyMDRcMVw3MlwxXHUwMjA2XDFcdWZmZmZcMVx1MDIwN1wyXHVmZmZmIisKKyAgICAgICAgIlwxXDcyXDFcdTAyMGJcMVx1MDIwY1wxXHUwMjBkXDFcdWZmZmZcM1w3MlwxXHUwMjExXDJcNzJcM1x1ZmZmZiIrCisgICAgICAgICJcMlw3MlwxXHUwMjE2XDFcdWZmZmZcMVx1MDIxN1wxXHVmZmZmXDJcNzJcNFx1ZmZmZlwzXDcyXDFcdTAyMWQiKworICAgICAgICAiXDFcdWZmZmZcMVw3MlwxXHVmZmZmXDFcNzJcMVx1ZmZmZlwxXHUwMjIwXDFcdTAyMjFcMlw3MlwxXHUwMjI0IisKKyAgICAgICAgIlwxXHUwMjI1XDNcNzJcMlx1ZmZmZlwxXDcyXDJcdWZmZmZcMVx1MDIyYVw0XHVmZmZmXDFcdTAyMmNcM1x1ZmZmZiIrCisgICAgICAgICJcMVw3MlwxXHUwMjJlXDFcNzJcMVx1ZmZmZlwxXHUwMjMwXDFcdTAyMzFcMlw3MlwyXHVmZmZmXDVcNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVw3MlwxXHUwMjNhXDJcdWZmZmZcMlw3MlwyXHVmZmZmXDFcdTAyM2RcMVx1MDIzZVwyXDcyXDNcdWZmZmYiKworICAgICAgICAiXDFcNzJcMVx1ZmZmZlwxXDcyXDJcdWZmZmZcNVw3MlwxXHUwMjQ4XDFcNzJcMVx1MDI0YVwxXHVmZmZmXDFcdTAyNGIiKworICAgICAgICAiXDFcNzJcMlx1ZmZmZlwxXHUwMjRkXDJcNzJcMVx1ZmZmZlwxXHUwMjUwXDFcdTAyNTFcM1w3MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDcyXDJcdWZmZmZcMVx1MDI1NlwxXHVmZmZmXDFcdTAyNTdcMVx1MDI1OFwyXHVmZmZmXDJcNzJcMVx1MDI1YiIrCisgICAgICAgICJcMVx1MDI1Y1wzXHVmZmZmXDFcdTAyNWRcMVx1MDI1ZVw0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvZlMgPQorICAgICAgICAiXHUwMjVmXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21pblMgPQorICAgICAgICAiXDFcMFwxXDE0MVwyXHVmZmZmXDJcMTQxXDFcMTU0XDFcMTYwXDFcMTQxXDFcMTQ1XDFcMTQxXDFcMTUwXDEiKworICAgICAgICAiXDE1N1w1XDE0MVwxXDE0NlwxXDE0NVwxXDU1XDFcNTZcMVw1Mlw0XHVmZmZmXDFcNzVcM1x1ZmZmZlwxXDUzIisKKyAgICAgICAgIlwxXDUyXDFcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwxXDU2XDFcNzJcMVx1ZmZmZlwxXDE0NVwxXDE0MSIrCisgICAgICAgICJcMVwxNDVcMVwxNjVcMlw2MFwxXDQ0XDVcdWZmZmZcMVwxNDNcMVwxNTRcMVwxNDVcMVwxNjJcM1x1ZmZmZlwxIisKKyAgICAgICAgIlwxNDFcMVwxNjJcMVwxNTRcMVwxNjNcMVwxNDZcMVw0NFwxXDE2NFwxXDQ0XDFcMTUxXDFcMTY3XDJcMTUxXDEiKworICAgICAgICAiXDQwXDFcMTYyXDFcMTQyXDNcMTQxXDFcMTQ3XDFcMTYwXDFcMTU2XDFcMTU3XDFcMTY1XDFcMTU2XDFcMTQyIisKKyAgICAgICAgIlwyXDE0N1wxXDE0MVwxXDE0N1wxXDE0M1wxXDE2MFwxXDE2MlwxXDE1N1wxXDE1NFwxXDE2MlwxXDE1NFwxXDE2MCIrCisgICAgICAgICJcMVwxNjNcMVwxNjRcMVwxNjNcMVwxNTRcMVwxNTZcMVwxNjBcMVwxNDFcMVwxNjVcMlwxNjNcMVwxNjBcMVw0NCIrCisgICAgICAgICJcMVwxNTZcNFx1ZmZmZlwxXDc0XDEwXHVmZmZmXDFcNzVcMjZcdWZmZmZcMVw3NVw3XHVmZmZmXDFcMTUxXDEiKworICAgICAgICAiXDE2M1wxXDE1NFwxXDE2N1wxXDE1NFwxXDE2MlwxXDE2NFwxXHVmZmZmXDFcNjBcNFx1ZmZmZlwxXDE1M1wxIisKKyAgICAgICAgIlwxNTRcMVw0NFwxXDE0MVwxXDE2MlwxXDE2M1wxXDE1NFwxXDE0NVwyXDE0M1wxXDE0MVwxXDE2NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0MVwxXHVmZmZmXDFcMTU1XDFcMTQxXDFcMTYzXDFcMTU2XDFcdWZmZmZcMVw0NFwxXDE0MlwxXDE0NCIrCisgICAgICAgICJcMVwxNjJcMVwxNjBcMVwxNjRcMVwxNDNcMVwxNTVcMVwxNDVcMVwxNDNcMVwxNjdcMVwxNjRcM1wxNDVcMVwxNDEiKworICAgICAgICAiXDFcMTQ1XDFcMTU2XDFcMTQ1XDFcNDRcMVwxNTRcMVwxNDdcMVwxNTNcMVwxNDVcMVwxNTdcMVwxNTVcMVwxNTQiKworICAgICAgICAiXDFcMTQxXDFcNDRcMVwxNjNcMlwxNjRcMlwxNDVcMlwxNjRcMlwxNTFcMVw0NFwxXDE0NFwxXDE0N1wxXDEyNCIrCisgICAgICAgICJcMVwxNDVcMVwxNTFcMVwxNTdcMVx1ZmZmZlwxXDE1NFwxXDE0NFwxXDE2NVw2XHVmZmZmXDFcMTU0XDFcMTY0IisKKyAgICAgICAgIlwzXDQ0XDFcMTU0XDFcMTU1XDFcMTYzXDFcMTQxXDFcMTUxXDFcdWZmZmZcMVwxNTVcMVwxNjRcMVwxNTdcMSIrCisgICAgICAgICJcMTQxXDFcNDRcMVwxNTBcMVwxNDdcMVwxNjJcMVwxNjVcMVwxNjRcMVwxNTVcMVw0NFwxXDE0MVwxXDE3MVwxIisKKyAgICAgICAgIlw0NFwxXDE0N1wxXHVmZmZmXDFcMTU0XDFcMTQ1XDFcMTE1XDFcMTY0XDFcMTYwXDFcMTQzXDFcMTUzXDFcMTUxIisKKyAgICAgICAgIlwxXDE0NVwxXDE2MlwxXDE1MFwxXDQ0XDFcMTUwXDFcNDRcMVwxNTRcMVwxNTZcMVwxNjJcMVwxNDRcMVw0NCIrCisgICAgICAgICJcMVwxNjNcMVw0NFwxXHVmZmZmXDFcMTY0XDFcMTU0XDFcMTQxXDFcMTU3XDFcMTY3XDFcNDRcMVwxMzJcMVwxNTQiKworICAgICAgICAiXDFcdWZmZmZcMVwxNDVcMVw0NFwxXDE3MVwxXDQ0XDFcMTU2XDFcNDRcMVwxNTFcMlwxNTVcMVx1ZmZmZlwxIisKKyAgICAgICAgIlwxNTFcMVwxNDVcMVwxNTFcMVwxNjJcMVwxNDRcMVwxNDFcMVwxNjJcMVwxNTdcMVwxNDVcMVwxNjJcMVwxNDUiKworICAgICAgICAiXDFcNDRcM1x1ZmZmZlwxXDQ0XDFcMTQxXDFcMTUwXDFcMTUxXDFcMTQ3XDFcMTU2XDFcMTUxXDFcNDRcMVwxNjIiKworICAgICAgICAiXDFcMTYwXDFcdWZmZmZcMVw0NFwxXDE1N1wxXDE1MVwxXDE1NFwxXDQ0XDFcMTQxXDFcdWZmZmZcMVwxNjRcMSIrCisgICAgICAgICJcMTYzXDFcdWZmZmZcMVw0NFwxXDE0NVwxXDE0NFwxXDE0MVwxXDExNFwxXDE0NVwxXDE1MFwxXDE0NVwxXDE0MyIrCisgICAgICAgICJcMVwxNTZcMVw0NFwxXDE2MlwxXHVmZmZmXDFcNDRcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTQ0XDFcMTUxXDEiKworICAgICAgICAiXDExNFwxXHVmZmZmXDFcMTYwXDFcdWZmZmZcMVwxNTFcMVwxNDVcMVwxNTZcMVwxNDZcMVw0NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwxXDE0NFwxXDE1NFwxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTQ0XDFcdWZmZmZcMVwxNjAiKworICAgICAgICAiXDJcMTY1XDFcMTQ1XDFcNDRcMVwxNDNcMVwxNjZcMVwxNDVcMVwxNTZcMlwxNjRcMVwxNjJcMVwxNTZcMVw0NCIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE1NFwxXDQ0XDFcMTQ0XDFcMTQ1XDFcMTQ3XDFcMTQ0XDFcdWZmZmZcMVw0NFwxXDE2M1wxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE2MlwxXDE0MlwxXDE2NFwxXHVmZmZmXDFcMTYyXDFcMTQ1XDFcNDRcMVx1ZmZmZlwyXDQ0XDEiKworICAgICAgICAiXDE2MlwxXDE0MVwxXDE0NFwxXDQ0XDFcMTQ0XDFcNDRcMVwxNjRcMVx1ZmZmZlwxXDE1N1wxXDE0NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDQ0XDFcdWZmZmZcMVw0NFwxXDE2NFwxXDE1MVwxXDE0MVwxXDE2MFwxXDQ0XDFcMTQ3XDFcNDRcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNjJcMVw0NFwxXDE3MVwyXHVmZmZmXDFcMTYzXDFcMTUxXDFcMTU0XDJcMTU1XDFcMTU2XDFcdWZmZmYiKworICAgICAgICAiXDFcMTUzXDFcMTQxXDFcNDRcMVwxNDNcMlw0NFwxXDE2M1wxXDQ0XDFcdWZmZmZcMVw0NFwxXDE0NVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE0NVwzXDQ0XDFcdWZmZmZcMVwxNTFcMVwxNzFcMVwxNDVcMVw0NFwxXDE2NFwxXDE0NFwzXHVmZmZmXDEiKworICAgICAgICAiXDE1M1wxXDE0MlwxXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmXDFcMTQzXDFcMTU2XDRcdWZmZmZcMVwxNTBcMSIrCisgICAgICAgICJcMTU2XDFcMTYyXDFcNDRcMVx1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcMTU3XDFcdWZmZmZcMlw0NFwxXDE1N1wxIisKKyAgICAgICAgIlwxNTFcMlw0NFwxXDE2NFwxXDE2M1wxXDE1NFwyXHVmZmZmXDFcMTQ1XDJcdWZmZmZcMVw0NFw0XHVmZmZmXDEiKworICAgICAgICAiXDQ0XDNcdWZmZmZcMVwxNDJcMVw0NFwxXDE0NFwxXHVmZmZmXDJcNDRcMlwxNDVcMlx1ZmZmZlwxXDE1N1wxIisKKyAgICAgICAgIlwxNTFcMVwxNTVcMlwxNDVcMVx1ZmZmZlwxXDE0NVwxXDQ0XDJcdWZmZmZcMVwxNTZcMVwxNDVcMlx1ZmZmZiIrCisgICAgICAgICJcMlw0NFwxXDE2M1wxXDE1N1wzXHVmZmZmXDFcMTU0XDFcdWZmZmZcMVw0MFwyXHVmZmZmXDFcMTYyXDJcMTU0IisKKyAgICAgICAgIlwxXDE3MlwxXDE1MVwxXDQ0XDFcMTU2XDFcNDRcMVx1ZmZmZlwxXDQ0XDFcMTYyXDJcdWZmZmZcMVw0NFwxXDE0NiIrCisgICAgICAgICJcMVwxNDVcMVx1ZmZmZlwyXDQ0XDFcMTU3XDFcMTQ1XDFcMTQzXDFcdWZmZmZcMVwxNjRcMlx1ZmZmZlwxXDQ0IisKKyAgICAgICAgIlwxXHVmZmZmXDJcNDRcMlx1ZmZmZlwxXDE2MlwxXDE0NFwyXDQ0XDNcdWZmZmZcMlw0NFw0XHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21heFMgPQorICAgICAgICAiXDFcdWZmZmZcMVwxNzFcMlx1ZmZmZlwxXDE2NVwxXDE1N1wxXDE3MFwxXDE2M1wxXDE2NVwxXDE3MVwxXDE1NyIrCisgICAgICAgICJcMVwxNzFcMlwxNTdcMVwxNzBcMVwxNjVcMVwxNjJcMVwxNDFcMVwxNTZcMVwxNDVcMVw3NlwxXDU2XDFcNzUiKworICAgICAgICAiXDRcdWZmZmZcMVw3NlwzXHVmZmZmXDNcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMVw3NVwyXDcyXDFcdWZmZmYiKworICAgICAgICAiXDFcMTUwXDFcMTQxXDJcMTY1XDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmZcMVwxNDNcMVwxNTRcMVwxNDVcMSIrCisgICAgICAgICJcMTYyXDNcdWZmZmZcMVwxNDFcMVwxNjJcMVwxNTRcMVwxNjRcMVwxNjNcMVwxNzJcMVwxNjRcMVwxNzJcMVwxNTEiKworICAgICAgICAiXDFcMTY3XDJcMTUxXDFcNDBcMVwxNjJcMVwxNDJcMVwxNTdcMVwxNTFcMVwxNDFcMVwxNDdcMVwxNjBcMVwxNTYiKworICAgICAgICAiXDFcMTU3XDFcMTY1XDFcMTU2XDFcMTQyXDJcMTQ3XDFcMTcxXDFcMTU3XDFcMTQzXDFcMTYwXDFcMTYyXDFcMTU3IisKKyAgICAgICAgIlwxXDE1NlwxXDE2MlwxXDE2M1wxXDE2MFwxXDE2M1wxXDE2NFwxXDE2M1wxXDE1NFwxXDE1NlwxXDE3MFwxXDE0MSIrCisgICAgICAgICJcMVwxNjVcMVwxNjNcMVwxNjRcMVwxNjBcMVwxNzJcMVwxNjRcNFx1ZmZmZlwxXDc0XDEwXHVmZmZmXDFcNzUiKworICAgICAgICAiXDI2XHVmZmZmXDFcNzVcN1x1ZmZmZlwxXDE1MVwxXDE2M1wxXDE2MlwxXDE2N1wxXDE1NFwxXDE2MlwxXDE2NCIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE1NFw0XHVmZmZmXDFcMTUzXDFcMTU0XDFcMTcyXDFcMTQxXDFcMTYyXDFcMTYzXDFcMTU0IisKKyAgICAgICAgIlwyXDE0NVwxXDE0M1wxXDE0MVwxXDE2NVwxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNTVcMVwxNDFcMVwxNjMiKworICAgICAgICAiXDFcMTU2XDFcdWZmZmZcMVwxNzJcMVwxNDJcMVwxNDRcMVwxNjdcMVwxNjBcMlwxNjRcMVwxNTVcMVwxNDVcMSIrCisgICAgICAgICJcMTQzXDFcMTY3XDFcMTY0XDNcMTQ1XDFcMTQxXDJcMTU2XDFcMTQ1XDFcMTcyXDFcMTU0XDFcMTQ3XDFcMTUzIisKKyAgICAgICAgIlwxXDE0NVwxXDE1N1wxXDE1NVwxXDE1NFwxXDE0MVwxXDE3MlwxXDE2M1wyXDE2NFwyXDE0NVwyXDE2NFwyXDE1MSIrCisgICAgICAgICJcMVwxNzJcMVwxNDRcMVwxNDdcMVwxMjRcMVwxNDVcMVwxNjRcMVwxNTdcMVx1ZmZmZlwxXDE1NFwxXDE0NFwxIisKKyAgICAgICAgIlwxNjVcNlx1ZmZmZlwxXDE1NFwxXDE2NFwzXDE3MlwxXDE1NFwxXDE2NFwxXDE2M1wxXDE0MVwxXDE1MVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE1NVwxXDE2NFwxXDE1N1wxXDE0MVwxXDE3MlwxXDE1MFwxXDE0N1wxXDE2MlwxXDE2NVwxXDE2NFwxXDE1NSIrCisgICAgICAgICJcMVwxNzJcMVwxNDFcMVwxNzFcMVwxNzJcMVwxNDdcMVx1ZmZmZlwxXDE1NFwxXDE0NVwxXDExNVwxXDE2NFwxIisKKyAgICAgICAgIlwxNjBcMVwxNDNcMVwxNTNcMVwxNTFcMVwxNDVcMVwxNjJcMVwxNTBcMVwxNzJcMVwxNTBcMVwxNzJcMVwxNTQiKworICAgICAgICAiXDFcMTU2XDFcMTYyXDFcMTQ0XDFcMTcyXDFcMTYzXDFcMTcyXDFcdWZmZmZcMVwxNjRcMVwxNTRcMVwxNDFcMSIrCisgICAgICAgICJcMTU3XDFcMTY3XDFcMTcyXDFcMTQ1XDFcMTU0XDFcdWZmZmZcMVwxNDVcMVwxNzJcMVwxNzFcMVwxNzJcMVwxNTYiKworICAgICAgICAiXDFcMTcyXDFcMTUxXDJcMTU1XDFcdWZmZmZcMVwxNTFcMVwxNDVcMVwxNTFcMVwxNjJcMVwxNDRcMVwxNDFcMSIrCisgICAgICAgICJcMTYyXDFcMTU3XDFcMTQ1XDFcMTYyXDFcMTQ1XDFcMTcyXDNcdWZmZmZcMVwxNzJcMVwxNDFcMVwxNTBcMVwxNTEiKworICAgICAgICAiXDFcMTQ3XDFcMTU2XDFcMTUxXDFcMTcyXDFcMTYyXDFcMTYwXDFcdWZmZmZcMVwxNzJcMVwxNTdcMVwxNTFcMSIrCisgICAgICAgICJcMTU0XDFcMTcyXDFcMTQxXDFcdWZmZmZcMVwxNjRcMVwxNjNcMVx1ZmZmZlwxXDE3MlwxXDE0NVwxXDE0NFwxIisKKyAgICAgICAgIlwxNDFcMVwxMTRcMVwxNDVcMVwxNTBcMVwxNDVcMVwxNDNcMVwxNTZcMVwxNzJcMVwxNjJcMVx1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVwxNjJcMVx1ZmZmZlwxXDE3MlwxXDE0NFwxXDE1MVwxXDExNFwxXHVmZmZmXDFcMTYwXDFcdWZmZmZcMVwxNTEiKworICAgICAgICAiXDFcMTQ1XDFcMTU2XDFcMTQ2XDFcMTcyXDFcdWZmZmZcMVwxNDVcMVwxNDRcMVwxNTRcMVwxNzJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNzJcMVx1ZmZmZlwxXDE2M1wxXHVmZmZmXDFcMTYwXDJcMTY1XDFcMTQ1XDFcMTcyXDFcMTQzXDFcMTY2IisKKyAgICAgICAgIlwxXDE0NVwxXDE1NlwyXDE2NFwxXDE2MlwxXDE1NlwxXDE3MlwyXHVmZmZmXDFcMTU0XDFcMTcyXDFcMTQ0XDEiKworICAgICAgICAiXDE0NVwxXDE0N1wxXDE0NFwxXHVmZmZmXDFcMTcyXDFcMTYzXDFcdWZmZmZcMVwxNjJcMVwxNDJcMVwxNjRcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNjJcMVwxNDVcMVwxNzJcMVx1ZmZmZlwyXDE3MlwxXDE2MlwxXDE0MVwxXDE0NFwxXDE3MlwxIisKKyAgICAgICAgIlwxNDRcMVwxNzJcMVwxNjRcMVx1ZmZmZlwxXDE1N1wxXDE2N1wxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNzIiKworICAgICAgICAiXDFcMTY0XDFcMTUxXDFcMTQxXDFcMTYwXDFcMTcyXDFcMTQ3XDFcMTcyXDFcdWZmZmZcMVwxNjJcMVwxNzJcMSIrCisgICAgICAgICJcMTcxXDJcdWZmZmZcMVwxNjNcMVwxNTFcMVwxNTRcMlwxNTVcMVwxNTZcMVx1ZmZmZlwxXDE1M1wxXDE0MVwxIisKKyAgICAgICAgIlwxNzJcMVwxNDNcMlwxNzJcMVwxNjNcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE2N1wxXHVmZmZmXDFcMTQ1XDMiKworICAgICAgICAiXDE3MlwxXHVmZmZmXDFcMTUxXDFcMTcxXDFcMTQ1XDFcMTcyXDFcMTY0XDFcMTQ0XDNcdWZmZmZcMVwxNTNcMSIrCisgICAgICAgICJcMTQyXDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlwxXDE0M1wxXDE1Nlw0XHVmZmZmXDFcMTUwXDFcMTU2IisKKyAgICAgICAgIlwxXDE2MlwxXDE3MlwxXHVmZmZmXDFcMTU0XDFcdWZmZmZcMVwxNTdcMVx1ZmZmZlwyXDE3MlwxXDE1N1wxXDE1MSIrCisgICAgICAgICJcMlwxNzJcMVwxNjRcMVwxNjNcMVwxNTRcMlx1ZmZmZlwxXDE0NVwyXHVmZmZmXDFcMTcyXDRcdWZmZmZcMVwxNzIiKworICAgICAgICAiXDNcdWZmZmZcMVwxNDJcMVwxNzJcMVwxNDRcMVx1ZmZmZlwyXDE3MlwyXDE0NVwyXHVmZmZmXDFcMTU3XDFcMTUxIisKKyAgICAgICAgIlwxXDE1NVwyXDE0NVwxXHVmZmZmXDFcMTQ1XDFcMTcyXDJcdWZmZmZcMVwxNTZcMVwxNDVcMlx1ZmZmZlwyXDE3MiIrCisgICAgICAgICJcMVwxNjNcMVwxNTdcM1x1ZmZmZlwxXDE1NFwxXHVmZmZmXDFcNDBcMlx1ZmZmZlwxXDE2MlwyXDE1NFwxXDE3MiIrCisgICAgICAgICJcMVwxNTFcMVwxNzJcMVwxNTZcMVwxNzJcMVx1ZmZmZlwxXDE3MlwxXDE2MlwyXHVmZmZmXDFcMTcyXDFcMTQ2IisKKyAgICAgICAgIlwxXDE0NVwxXHVmZmZmXDJcMTcyXDFcMTU3XDFcMTQ1XDFcMTQzXDFcdWZmZmZcMVwxNjRcMlx1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVx1ZmZmZlwyXDE3MlwyXHVmZmZmXDFcMTYyXDFcMTQ0XDJcMTcyXDNcdWZmZmZcMlwxNzJcNFx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxXDNcMjNcdWZmZmZcMVw2NlwxXDY3XDFcNzBcMVw3MVwxXHVmZmZmXDFcNzNcMVw3NCIrCisgICAgICAgICJcMVw3NVwxMlx1ZmZmZlwxXDEzNVw3XHVmZmZmXDFcdTAwOTBcMlx1MDA5MVwxXHUwMDk0XDFcdTAwOTVcNFx1ZmZmZiIrCisgICAgICAgICJcMVx1MDA5MFwxXDJcMVwzXDYyXHVmZmZmXDFcNzdcMVwxMTVcMVwxMzFcMVw2M1wxXHVmZmZmXDFcNjRcMVwxMDAiKworICAgICAgICAiXDFcMTI0XDFcNjVcMVw2NlwxXDY3XDFcNzBcMVw3MVwxXHVmZmZmXDFcMTIwXDFcNzJcMVw3M1wxXDc0XDFcNzUiKworICAgICAgICAiXDFcNzZcMVwxMzBcMVwxMjNcMVwxMDFcMVx1MDA5MlwxXHUwMDkzXDFcMTI1XDFcMTAyXDFcMTI2XDFcMTIxIisKKyAgICAgICAgIlwxXDEwM1wxXDEwNVwxXDEwNFwxXDEwNlwxXDEzNFwxXDEwN1wxXDE3MVwxXHVmZmZmXDFcMTI3XDFcMTIyXDEiKworICAgICAgICAiXDEzM1wxXDE3MFwxXDEzMlwxXDE0MVwxXDEzNVw3XHVmZmZmXDFcdTAwOGRcMVx1ZmZmZlwxXHUwMDhlXDFcdTAwOGYiKworICAgICAgICAiXDFcdTAwOTFcMVx1MDA5NFwxNFx1ZmZmZlwxXDE0NlwxXHVmZmZmXDFcNlw0XHVmZmZmXDFcNDZcNTVcdWZmZmYiKworICAgICAgICAiXDFcMTM2XDNcdWZmZmZcMVwxMTZcMVwxMTdcMVwxMTJcMVwxMTBcMVwxMTNcMVwxMTFcMTJcdWZmZmZcMVwyNiIrCisgICAgICAgICJcMjBcdWZmZmZcMVwxMVwyNVx1ZmZmZlwxXDE2NFwxMFx1ZmZmZlwxXDE0NFwxMVx1ZmZmZlwxXDQ0XDE0XHVmZmZmIisKKyAgICAgICAgIlwxXDE0N1wxXDE1MFwxXDE1NVwxMlx1ZmZmZlwxXDE0M1w2XHVmZmZmXDFcdTAwOGFcMlx1ZmZmZlwxXDU1XDE0IisKKyAgICAgICAgIlx1ZmZmZlwxXDE3NlwyXHVmZmZmXDFcMTZcNFx1ZmZmZlwxXDQzXDFcdWZmZmZcMVwxNTdcNVx1ZmZmZlwxXDIyIisKKyAgICAgICAgIlw0XHVmZmZmXDFcMTc3XDFcdWZmZmZcMVwxMzdcMVx1ZmZmZlwxXHUwMDgyXDE2XHVmZmZmXDFcdTAwODZcMSIrCisgICAgICAgICJcMTYwXDZcdWZmZmZcMVw0XDJcdWZmZmZcMVwxNjdcM1x1ZmZmZlwxXDMwXDNcdWZmZmZcMVwxMFwxMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNTRcMlx1ZmZmZlwxXHUwMDg0XDFcdWZmZmZcMVwzNlwxMFx1ZmZmZlwxXDE2MlwzXHVmZmZmXDFcMTU2IisKKyAgICAgICAgIlwxXDI3XDZcdWZmZmZcMVwzNVwxMFx1ZmZmZlwxXDE0NVwyXHVmZmZmXDFcdTAwODBcNFx1ZmZmZlwxXDIxXDYiKworICAgICAgICAiXHVmZmZmXDFcNTNcMVwzMVwxXDEyXDNcdWZmZmZcMVwxNDBcMVx1ZmZmZlwxXDE1MlwyXHVmZmZmXDFcdTAwODMiKworICAgICAgICAiXDFcdTAwODVcMVx1MDA4OVwxXDUwXDRcdWZmZmZcMVw1MVwxXHVmZmZmXDFcMTYxXDFcdWZmZmZcMVwyNVwxMSIrCisgICAgICAgICJcdWZmZmZcMVwxNzJcMVw1NFwxXHVmZmZmXDFcNjJcMVw1MlwxXHVmZmZmXDFcMTYzXDFcMTc1XDFcdTAwODEiKworICAgICAgICAiXDFcdTAwODdcMVx1ZmZmZlwxXDFcMVw3XDFcdTAwOGNcM1x1ZmZmZlwxXDE0Mlw0XHVmZmZmXDFcMTRcMVwxNSIrCisgICAgICAgICJcNVx1ZmZmZlwxXDIzXDJcdWZmZmZcMVwxNjVcMVwxNTFcMlx1ZmZmZlwxXDQwXDFcNDFcNFx1ZmZmZlwxXDU2IisKKyAgICAgICAgIlwxXDE3NFwxXDE3M1wxXHVmZmZmXDFcdTAwODhcMVx1ZmZmZlwxXDQ3XDFcMTNcMTBcdWZmZmZcMVwyNFwyXHVmZmZmIisKKyAgICAgICAgIlwxXDMzXDFcMzdcM1x1ZmZmZlwxXDVcNVx1ZmZmZlwxXDIwXDFcdWZmZmZcMVw2MFwxXDE1M1wxXHVmZmZmXDEiKworICAgICAgICAiXDQyXDJcdWZmZmZcMVwxN1wxXDU3XDRcdWZmZmZcMVwzMlwxXDExNFwxXDQ1XDJcdWZmZmZcMVx1MDA4YlwxIisKKyAgICAgICAgIlwzNFwxXDYxXDFcMTY2IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcdTAyNWVcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxMVw2NVwyXDY0XDJcNjVcMVw2NFwyMlw2NVwxXDY0XDFcNDZcMVw2MlwxXDM0XDFcNjFcMVw0MVwxIisKKyAgICAgICAgICAgICJcNDVcMVw2M1wxXDMwXDFcMzJcMVwyNlwxXDM3XDFcMzFcMVwyNFwxXDI1XDFcNDBcMVw1NlwxMVw1NyIrCisgICAgICAgICAgICAiXDFcNTBcMVw1MVwxXDQyXDFcMzNcMVw0M1wxXDQ3XDFcMjdcMzJcNjFcMVwzNVwxXDY1XDFcMzZcMVw2MCIrCisgICAgICAgICAgICAiXDFcNjFcMVw2NVwxXDZcMVwxMFwxXDRcMVw1XDFcMTZcMVwxNVwxXDIwXDFcMjFcMVwyMlwyXDYxXDEiKworICAgICAgICAgICAgIlwxMlwxXDE3XDFcNTRcMVw1NVwxXDFcMVw2MVwxXDIzXDFcMTFcMVwxM1wxXDdcMVw1M1wxXDUyXDJcNjEiKworICAgICAgICAgICAgIlwxXDE0XDFcMlwxXDQ0XDFcM1x1ZmY4Mlw2NSIsCisgICAgICAgICAgICAiXDFcNjZcN1x1ZmZmZlwxXDcwXDVcdWZmZmZcMVw2N1wxMVx1ZmZmZlwxXDcxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTAwXDZcdWZmZmZcMVw3NVw2XHVmZmZmXDFcNzdcNVx1ZmZmZlwxXDc2IiwKKyAgICAgICAgICAgICJcMVwxMDNcM1x1ZmZmZlwxXDEwMVwxMVx1ZmZmZlwxXDEwMiIsCisgICAgICAgICAgICAiXDFcMTA2XDFcdWZmZmZcMVwxMDVcNFx1ZmZmZlwxXDEwNFw0XHVmZmZmXDFcMTA3IiwKKyAgICAgICAgICAgICJcMVwxMTFcMlx1ZmZmZlwxXDExMCIsCisgICAgICAgICAgICAiXDFcMTEyXDIzXHVmZmZmXDFcMTEzIiwKKyAgICAgICAgICAgICJcMVwxMTdcMlx1ZmZmZlwxXDExNFwzXHVmZmZmXDFcMTIyXDJcdWZmZmZcMVwxMjNcNFx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcMTE2XDFcMTIwXDFcdWZmZmZcMVwxMTVcMVx1ZmZmZlwxXDEyMSIsCisgICAgICAgICAgICAiXDFcMTI1XDNcdWZmZmZcMVwxMjZcM1x1ZmZmZlwxXDEyNFw1XHVmZmZmXDFcMTI3IiwKKyAgICAgICAgICAgICJcMVwxMzRcMVwxMzJcNVx1ZmZmZlwxXDEzMVwyXHVmZmZmXDFcMTMwXDZcdWZmZmZcMVwxMzMiLAorICAgICAgICAgICAgIlwxXDEzNSIsCisgICAgICAgICAgICAiXDFcMTQwXDdcdWZmZmZcMVwxMzZcNVx1ZmZmZlwxXDEzNyIsCisgICAgICAgICAgICAiXDFcMTQ0XDEyXHVmZmZmXDFcMTQyXDFcMTQxXDEyXHVmZmZmXDFcMTQzIiwKKyAgICAgICAgICAgICJcMVwxNDdcN1x1ZmZmZlwxXDE0NlwxM1x1ZmZmZlwxXDE0NSIsCisgICAgICAgICAgICAiXDFcMTUxXDIwXHVmZmZmXDFcMTUwIiwKKyAgICAgICAgICAgICJcMVwxNTIiLAorICAgICAgICAgICAgIlwxXDE1NVw2XHVmZmZmXDFcMTU0XDFcMTUzIiwKKyAgICAgICAgICAgICJcMVwxNTYiLAorICAgICAgICAgICAgIlwxXDE2MVwxN1x1ZmZmZlwxXDE1N1wxXDE2MCIsCisgICAgICAgICAgICAiXDFcMTYzIiwKKyAgICAgICAgICAgICJcMVwxNjZcMjJcdWZmZmZcMVwxNjUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTc0XDFcMTc1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA4M1wyMVx1ZmZmZlwxXHUwMDgyIiwKKyAgICAgICAgICAgICJcMVx1MDA4Nlw0XHVmZmZmXDFcdTAwODdcMTVcdWZmZmZcMVx1MDA4NSIsCisgICAgICAgICAgICAiXDFcdTAwODkiLAorICAgICAgICAgICAgIlwxXHUwMDhiIiwKKyAgICAgICAgICAgICJcMVx1MDA4ZCIsCisgICAgICAgICAgICAiXDFcdTAwOGYiLAorICAgICAgICAgICAgIlwxXHUwMDkxIiwKKyAgICAgICAgICAgICJcMVx1MDA5MyIsCisgICAgICAgICAgICAiXDFcdTAwOTZcMTNcdWZmZmZcMVx1MDA5NSIsCisgICAgICAgICAgICAiXDFcdTAwOTgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwOWNcMlx1ZmZmZlwxXHUwMDliIiwKKyAgICAgICAgICAgICJcMVx1MDA5ZCIsCisgICAgICAgICAgICAiXDFcdTAwOWVcMTFcdWZmZmZcMVx1MDBhMFw1XHVmZmZmXDFcdTAwOWYiLAorICAgICAgICAgICAgIlwxXHUwMGExIiwKKyAgICAgICAgICAgICJcMTJcdTAwYTNcMTBcdWZmZmZcMVx1MDBhNVwxXHVmZmZmXDNcdTAwYTVcNVx1ZmZmZlwxXHUwMGE1IisKKyAgICAgICAgICAgICJcMTNcdWZmZmZcMVx1MDBhMlw2XHVmZmZmXDFcdTAwYTNcMlx1ZmZmZlwxXHUwMGE1XDFcdWZmZmZcMyIrCisgICAgICAgICAgICAiXHUwMGE1XDVcdWZmZmZcMVx1MDBhNVwxM1x1ZmZmZlwxXHUwMGEyIiwKKyAgICAgICAgICAgICJcMTJcdTAwYTNcMTBcdWZmZmZcMVx1MDBhNVwxXHVmZmZmXDNcdTAwYTVcNVx1ZmZmZlwxXHUwMGE1IisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDBhM1wyXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwzXHUwMGE1XDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMGE1IiwKKyAgICAgICAgICAgICJcMVw3MlwzNFx1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGE4IiwKKyAgICAgICAgICAgICJcMVx1MDBhOSIsCisgICAgICAgICAgICAiXDFcdTAwYWEiLAorICAgICAgICAgICAgIlwxXHUwMGFiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhYyIsCisgICAgICAgICAgICAiXDFcdTAwYWQiLAorICAgICAgICAgICAgIlwxXHUwMGFlIiwKKyAgICAgICAgICAgICJcMVx1MDBhZlwxXHUwMGIwIiwKKyAgICAgICAgICAgICJcMVx1MDBiMlwxNFx1ZmZmZlwxXHUwMGIxIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDE1IisKKyAgICAgICAgICAgICJcNzJcMVx1MDBiM1wxNFw3MiIsCisgICAgICAgICAgICAiXDFcdTAwYjUiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAwYjciLAorICAgICAgICAgICAgIlwxXHUwMGI4IiwKKyAgICAgICAgICAgICJcMVx1MDBiOSIsCisgICAgICAgICAgICAiXDFcdTAwYmEiLAorICAgICAgICAgICAgIlwxXHUwMGJiIiwKKyAgICAgICAgICAgICJcMVx1MDBiYyIsCisgICAgICAgICAgICAiXDFcdTAwYmQiLAorICAgICAgICAgICAgIlwxXHUwMGJlXDE1XHVmZmZmXDFcdTAwYmYiLAorICAgICAgICAgICAgIlwxXHUwMGMwXDdcdWZmZmZcMVx1MDBjMSIsCisgICAgICAgICAgICAiXDFcdTAwYzIiLAorICAgICAgICAgICAgIlwxXHUwMGMzIiwKKyAgICAgICAgICAgICJcMVx1MDBjNCIsCisgICAgICAgICAgICAiXDFcdTAwYzUiLAorICAgICAgICAgICAgIlwxXHUwMGM2IiwKKyAgICAgICAgICAgICJcMVx1MDBjNyIsCisgICAgICAgICAgICAiXDFcdTAwYzgiLAorICAgICAgICAgICAgIlwxXHUwMGM5IiwKKyAgICAgICAgICAgICJcMVx1MDBjYSIsCisgICAgICAgICAgICAiXDFcdTAwY2IiLAorICAgICAgICAgICAgIlwxXHUwMGNkXDNcdWZmZmZcMVx1MDBjY1wxN1x1ZmZmZlwxXHUwMGNlXDNcdWZmZmZcMVx1MDBjZiIsCisgICAgICAgICAgICAiXDFcdTAwZDFcN1x1ZmZmZlwxXHUwMGQwIiwKKyAgICAgICAgICAgICJcMVx1MDBkMiIsCisgICAgICAgICAgICAiXDFcdTAwZDMiLAorICAgICAgICAgICAgIlwxXHUwMGQ0IiwKKyAgICAgICAgICAgICJcMVx1MDBkNSIsCisgICAgICAgICAgICAiXDFcdTAwZDZcMVx1ZmZmZlwxXHUwMGQ3IiwKKyAgICAgICAgICAgICJcMVx1MDBkOCIsCisgICAgICAgICAgICAiXDFcdTAwZDlcNlx1ZmZmZlwxXHUwMGRhIiwKKyAgICAgICAgICAgICJcMVx1MDBkYiIsCisgICAgICAgICAgICAiXDFcdTAwZGMiLAorICAgICAgICAgICAgIlwxXHUwMGRkIiwKKyAgICAgICAgICAgICJcMVx1MDBkZSIsCisgICAgICAgICAgICAiXDFcdTAwZGYiLAorICAgICAgICAgICAgIlwxXHUwMGUwIiwKKyAgICAgICAgICAgICJcMVx1MDBlMlw3XHVmZmZmXDFcdTAwZTEiLAorICAgICAgICAgICAgIlwxXHUwMGUzIiwKKyAgICAgICAgICAgICJcMVx1MDBlNCIsCisgICAgICAgICAgICAiXDFcdTAwZTUiLAorICAgICAgICAgICAgIlwxXHUwMGU3XDFcdTAwZTYiLAorICAgICAgICAgICAgIlwxXHUwMGU4IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMGViXDFcdWZmZmZcMVx1MDBlYVwzXHVmZmZmXDFcdTAwZWMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZWQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBlZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmMyIsCisgICAgICAgICAgICAiXDFcdTAwZjQiLAorICAgICAgICAgICAgIlwxXHUwMGY2XDVcdWZmZmZcMVx1MDBmNSIsCisgICAgICAgICAgICAiXDFcdTAwZjciLAorICAgICAgICAgICAgIlwxXHUwMGY4IiwKKyAgICAgICAgICAgICJcMVx1MDBmOSIsCisgICAgICAgICAgICAiXDFcdTAwZmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXHUwMGEzXDEwXHVmZmZmXDFcdTAwYTVcMVx1ZmZmZlwzXHUwMGE1XDVcdWZmZmZcMVx1MDBhNSIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwYTNcMlx1ZmZmZlwxXHUwMGE1XDFcdWZmZmZcM1x1MDBhNVw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDBhNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmYiIsCisgICAgICAgICAgICAiXDFcdTAwZmMiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAwZmUiLAorICAgICAgICAgICAgIlwxXHUwMGZmIiwKKyAgICAgICAgICAgICJcMVx1MDEwMCIsCisgICAgICAgICAgICAiXDFcdTAxMDEiLAorICAgICAgICAgICAgIlwxXHUwMTAyIiwKKyAgICAgICAgICAgICJcMVx1MDEwM1wxXHVmZmZmXDFcdTAxMDQiLAorICAgICAgICAgICAgIlwxXHUwMTA1IiwKKyAgICAgICAgICAgICJcMVx1MDEwNiIsCisgICAgICAgICAgICAiXDFcdTAxMDciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMDhcM1x1ZmZmZlwxXHUwMTA5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTBhIiwKKyAgICAgICAgICAgICJcMVx1MDEwYiIsCisgICAgICAgICAgICAiXDFcdTAxMGMiLAorICAgICAgICAgICAgIlwxXHUwMTBkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxMGYiLAorICAgICAgICAgICAgIlwxXHUwMTEwIiwKKyAgICAgICAgICAgICJcMVx1MDExMlw0XHVmZmZmXDFcdTAxMTEiLAorICAgICAgICAgICAgIlwxXHUwMTEzIiwKKyAgICAgICAgICAgICJcMVx1MDExNCIsCisgICAgICAgICAgICAiXDFcdTAxMTVcMjBcdWZmZmZcMVx1MDExNiIsCisgICAgICAgICAgICAiXDFcdTAxMTciLAorICAgICAgICAgICAgIlwxXHUwMTE4IiwKKyAgICAgICAgICAgICJcMVx1MDExOSIsCisgICAgICAgICAgICAiXDFcdTAxMWEiLAorICAgICAgICAgICAgIlwxXHUwMTFiIiwKKyAgICAgICAgICAgICJcMVx1MDExYyIsCisgICAgICAgICAgICAiXDFcdTAxMWQiLAorICAgICAgICAgICAgIlwxXHUwMTFlIiwKKyAgICAgICAgICAgICJcMVx1MDExZiIsCisgICAgICAgICAgICAiXDFcdTAxMjFcMTBcdWZmZmZcMVx1MDEyMCIsCisgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTI1IiwKKyAgICAgICAgICAgICJcMVx1MDEyNiIsCisgICAgICAgICAgICAiXDFcdTAxMjciLAorICAgICAgICAgICAgIlwxXHUwMTI4IiwKKyAgICAgICAgICAgICJcMVx1MDEyOSIsCisgICAgICAgICAgICAiXDFcdTAxMmEiLAorICAgICAgICAgICAgIlwxXHUwMTJiIiwKKyAgICAgICAgICAgICJcMVx1MDEyYyIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDEyZSIsCisgICAgICAgICAgICAiXDFcdTAxMmYiLAorICAgICAgICAgICAgIlwxXHUwMTMwIiwKKyAgICAgICAgICAgICJcMVx1MDEzMSIsCisgICAgICAgICAgICAiXDFcdTAxMzIiLAorICAgICAgICAgICAgIlwxXHUwMTMzIiwKKyAgICAgICAgICAgICJcMVx1MDEzNCIsCisgICAgICAgICAgICAiXDFcdTAxMzUiLAorICAgICAgICAgICAgIlwxXHUwMTM2IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTM4IiwKKyAgICAgICAgICAgICJcMVx1MDEzOSIsCisgICAgICAgICAgICAiXDFcdTAxM2EiLAorICAgICAgICAgICAgIlwxXHUwMTNiIiwKKyAgICAgICAgICAgICJcMVx1MDEzY1wxMlx1ZmZmZlwxXHUwMTNkIiwKKyAgICAgICAgICAgICJcMVx1MDEzZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEzZiIsCisgICAgICAgICAgICAiXDFcdTAxNDAiLAorICAgICAgICAgICAgIlwxXHUwMTQxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0MiIsCisgICAgICAgICAgICAiXDFcdTAxNDMiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTQ3IiwKKyAgICAgICAgICAgICJcMVx1MDE0OFw2XHVmZmZmXDFcdTAxNDkiLAorICAgICAgICAgICAgIlwxXHUwMTRhIiwKKyAgICAgICAgICAgICJcMVx1MDE0YiIsCisgICAgICAgICAgICAiXDFcdTAxNGMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNGQiLAorICAgICAgICAgICAgIlwxXHUwMTRlIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZiIsCisgICAgICAgICAgICAiXDFcdTAxNTAiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxNTIiLAorICAgICAgICAgICAgIlwxXHUwMTUzIiwKKyAgICAgICAgICAgICJcMVx1MDE1NCIsCisgICAgICAgICAgICAiXDFcdTAxNTUiLAorICAgICAgICAgICAgIlwxXHUwMTU2IiwKKyAgICAgICAgICAgICJcMVx1MDE1NyIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDE1OSIsCisgICAgICAgICAgICAiXDFcdTAxNWEiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxNWMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNWQiLAorICAgICAgICAgICAgIlwxXHUwMTVlIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZiIsCisgICAgICAgICAgICAiXDFcdTAxNjAiLAorICAgICAgICAgICAgIlwxXHUwMTYxIiwKKyAgICAgICAgICAgICJcMVx1MDE2MiIsCisgICAgICAgICAgICAiXDFcdTAxNjMiLAorICAgICAgICAgICAgIlwxXHUwMTY0IiwKKyAgICAgICAgICAgICJcMVx1MDE2NSIsCisgICAgICAgICAgICAiXDFcdTAxNjYiLAorICAgICAgICAgICAgIlwxXHUwMTY3IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTY5IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDE2YVwzMVw3MiIsCisgICAgICAgICAgICAiXDFcdTAxNmMiLAorICAgICAgICAgICAgIlwxXHUwMTZkIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZSIsCisgICAgICAgICAgICAiXDFcdTAxNmYiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxNzEiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3MyIsCisgICAgICAgICAgICAiXDFcdTAxNzQiLAorICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICJcMVx1MDE3NiIsCisgICAgICAgICAgICAiXDFcdTAxNzciLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxNzlcMTJcdWZmZmZcMVx1MDE3YSIsCisgICAgICAgICAgICAiXDFcdTAxN2IiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxN2MiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxN2UiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxODAiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxODIiLAorICAgICAgICAgICAgIlwxXHUwMTgzIiwKKyAgICAgICAgICAgICJcMVx1MDE4NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE4NSIsCisgICAgICAgICAgICAiXDFcdTAxODYiLAorICAgICAgICAgICAgIlwxXHUwMTg3IiwKKyAgICAgICAgICAgICJcMVx1MDE4OCIsCisgICAgICAgICAgICAiXDFcdTAxODkiLAorICAgICAgICAgICAgIlwxXHUwMThhIiwKKyAgICAgICAgICAgICJcMVx1MDE4YiIsCisgICAgICAgICAgICAiXDFcdTAxOGMiLAorICAgICAgICAgICAgIlwxXHUwMThkIiwKKyAgICAgICAgICAgICJcMVx1MDE4ZSIsCisgICAgICAgICAgICAiXDFcdTAxOGYiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDE5MiIsCisgICAgICAgICAgICAiXDFcdTAxOTMiLAorICAgICAgICAgICAgIlwxXHUwMTk0IiwKKyAgICAgICAgICAgICJcMVx1MDE5NSIsCisgICAgICAgICAgICAiXDFcdTAxOTYiLAorICAgICAgICAgICAgIlwxXHUwMTk3IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTk5IiwKKyAgICAgICAgICAgICJcMVx1MDE5YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMTljIiwKKyAgICAgICAgICAgICJcMVx1MDE5ZCIsCisgICAgICAgICAgICAiXDFcdTAxOWUiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxYTAiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYTEiLAorICAgICAgICAgICAgIlwxXHUwMWEyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxYTQiLAorICAgICAgICAgICAgIlwxXHUwMWE1IiwKKyAgICAgICAgICAgICJcMVx1MDFhNiIsCisgICAgICAgICAgICAiXDFcdTAxYTciLAorICAgICAgICAgICAgIlwxXHUwMWE4IiwKKyAgICAgICAgICAgICJcMVx1MDFhOSIsCisgICAgICAgICAgICAiXDFcdTAxYWEiLAorICAgICAgICAgICAgIlwxXHUwMWFiIiwKKyAgICAgICAgICAgICJcMVx1MDFhYyIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDFhZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxMFx1ZmZmZlwxXHUwMWFmXDJcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVw3MlwxXHVmZmZmXDMyXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDFiMSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMWIzIiwKKyAgICAgICAgICAgICJcMVx1MDFiNCIsCisgICAgICAgICAgICAiXDFcdTAxYjUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYjciLAorICAgICAgICAgICAgIlwxXHUwMWI4IiwKKyAgICAgICAgICAgICJcMVx1MDFiOSIsCisgICAgICAgICAgICAiXDFcdTAxYmEiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFiYyIsCisgICAgICAgICAgICAiXDFcdTAxYmQiLAorICAgICAgICAgICAgIlwxXHUwMWJlIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWMxXDE2XHVmZmZmXDFcdTAxYzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxYzMiLAorICAgICAgICAgICAgIlwxXHUwMWM0IiwKKyAgICAgICAgICAgICJcMVx1MDFjNSIsCisgICAgICAgICAgICAiXDFcdTAxYzYiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxYzgiLAorICAgICAgICAgICAgIlwxXHUwMWM5IiwKKyAgICAgICAgICAgICJcMVx1MDFjYSIsCisgICAgICAgICAgICAiXDFcdTAxY2IiLAorICAgICAgICAgICAgIlwxXHUwMWNjIiwKKyAgICAgICAgICAgICJcMVx1MDFjZCIsCisgICAgICAgICAgICAiXDFcdTAxY2UiLAorICAgICAgICAgICAgIlwxXHUwMWNmIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFkMSIsCisgICAgICAgICAgICAiXDFcNzJcMTBcdWZmZmZcMVx1MDFkMlwyXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNzJcMVx1ZmZmZlwzMlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxZDQiLAorICAgICAgICAgICAgIlwxXHUwMWQ1IiwKKyAgICAgICAgICAgICJcMVx1MDFkNiIsCisgICAgICAgICAgICAiXDFcdTAxZDciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDFkOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFkYSIsCisgICAgICAgICAgICAiXDFcdTAxZGIiLAorICAgICAgICAgICAgIlwxXHUwMWRjIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWRkIiwKKyAgICAgICAgICAgICJcMVx1MDFkZSIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDFlMiIsCisgICAgICAgICAgICAiXDFcdTAxZTMiLAorICAgICAgICAgICAgIlwxXHUwMWU0IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMWU2IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMWU4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWU5IiwKKyAgICAgICAgICAgICJcMVx1MDFlYVwyMVx1ZmZmZlwxXHUwMWViIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMWVlIiwKKyAgICAgICAgICAgICJcMVx1MDFlZiIsCisgICAgICAgICAgICAiXDFcdTAxZjAiLAorICAgICAgICAgICAgIlwxXHUwMWYxIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMWYzIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxZjUiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAxZjciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDFmOCIsCisgICAgICAgICAgICAiXDFcdTAxZjkiLAorICAgICAgICAgICAgIlwxXHUwMWZhIiwKKyAgICAgICAgICAgICJcMVx1MDFmYiIsCisgICAgICAgICAgICAiXDFcdTAxZmMiLAorICAgICAgICAgICAgIlwxXHUwMWZkIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMWZlIiwKKyAgICAgICAgICAgICJcMVx1MDFmZiIsCisgICAgICAgICAgICAiXDFcNzJcMTBcdWZmZmZcMVx1MDIwMFwyXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZiIrCisgICAgICAgICAgICAiXDFcNzJcMVx1ZmZmZlwzMlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyMDIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDIwNSIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyMDhcMjFcdWZmZmZcMVx1MDIwOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIwYSIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIwZSIsCisgICAgICAgICAgICAiXDFcdTAyMGYiLAorICAgICAgICAgICAgIlwxXHUwMjEwIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMjEyIiwKKyAgICAgICAgICAgICJcMVx1MDIxMyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMTQiLAorICAgICAgICAgICAgIlwxXHUwMjE1IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjE4IiwKKyAgICAgICAgICAgICJcMVx1MDIxOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIxYSIsCisgICAgICAgICAgICAiXDFcdTAyMWIiLAorICAgICAgICAgICAgIlwxXHUwMjFjIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMWUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMWYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMjIyIiwKKyAgICAgICAgICAgICJcMVx1MDIyMyIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMjI2IiwKKyAgICAgICAgICAgICJcMVx1MDIyNyIsCisgICAgICAgICAgICAiXDFcdTAyMjgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIyOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxMFx1ZmZmZlwxXHUwMjJiXDJcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmIisKKyAgICAgICAgICAgICJcMVw3MlwxXHVmZmZmXDMyXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIyZCIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDIyZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyMzIiLAorICAgICAgICAgICAgIlwxXHUwMjMzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAyMzQiLAorICAgICAgICAgICAgIlwxXHUwMjM1IiwKKyAgICAgICAgICAgICJcMVx1MDIzNiIsCisgICAgICAgICAgICAiXDFcdTAyMzciLAorICAgICAgICAgICAgIlwxXHUwMjM4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjM5IiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDIzYiIsCisgICAgICAgICAgICAiXDFcdTAyM2MiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyM2YiLAorICAgICAgICAgICAgIlwxXHUwMjQwIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI0MSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI0MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjQzIiwKKyAgICAgICAgICAgICJcMVx1MDI0NCIsCisgICAgICAgICAgICAiXDFcdTAyNDUiLAorICAgICAgICAgICAgIlwxXHUwMjQ2IiwKKyAgICAgICAgICAgICJcMVx1MDI0NyIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVx1MDI0OSIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyNGMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXHUwMjRlIiwKKyAgICAgICAgICAgICJcMVx1MDI0ZiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcdTAyNTIiLAorICAgICAgICAgICAgIlwxXHUwMjUzIiwKKyAgICAgICAgICAgICJcMVx1MDI1NCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDI1NSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMjU5IiwKKyAgICAgICAgICAgICJcMVx1MDI1YSIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICJcMVw3MlwxM1x1ZmZmZlwxMlw3Mlw3XHVmZmZmXDMyXDcyXDRcdWZmZmZcMVw3MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDcyXDEzXHVmZmZmXDEyXDcyXDdcdWZmZmZcMzJcNzJcNFx1ZmZmZlwxXDcyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MiIsCisgICAgICAgICAgICAiXDFcNzJcMTNcdWZmZmZcMTJcNzJcN1x1ZmZmZlwzMlw3Mlw0XHVmZmZmXDFcNzJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDcyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMV9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjFfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMV90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIxX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIxX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEyMSBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIxKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjE7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTIxX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjFfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMV9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTIxX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjFfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjFfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIxX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFRfXzExMCB8IFRfXzExMSB8IFRfXzExMiB8IFRfXzExMyB8IFRfXzExNCB8IFRfXzExNSB8IFRfXzExNiB8IFRfXzExNyB8IFRfXzExOCB8IFRfXzExOSB8IFRfXzEyMCB8IFRfXzEyMSB8IFRfXzEyMiB8IFRfXzEyMyB8IFRfXzEyNCB8IFRfXzEyNSB8IFRfXzEyNiB8IFRfXzEyNyB8IFRfXzEyOCB8IFRfXzEyOSB8IFRfXzEzMCB8IFRfXzEzMSB8IFRfXzEzMiB8IFRfXzEzMyB8IFRfXzEzNCB8IFRfXzEzNSB8IFRfXzEzNiB8IFRfXzEzNyB8IFRfXzEzOCB8IFRfXzEzOSB8IFRfXzE0MCB8IFRfXzE0MSB8IFRfXzE0MiB8IFRfXzE0MyB8IFRfXzE0NCB8IFRfXzE0NSB8IFRfXzE0NiB8IFRfXzE0NyB8IFRfXzE0OCB8IFRfXzE0OSB8IFRfXzE1MCB8IFRfXzE1MSB8IFRfXzE1MiB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKTsiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEludFN0cmVhbSBpbnB1dCA9IF9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIxXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMV8wPT0ncCcpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd7JykgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J30nKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nYycpICkge3MgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdkJykgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndScpICkge3MgPSA3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdiJykgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3MnKSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbCcpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndCcpICkge3MgPSAxMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0neicpICkge3MgPSAxMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZicpICkge3MgPSAxMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZScpICkge3MgPSAxNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbScpICkge3MgPSAxNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZycpICkge3MgPSAxNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naCcpICkge3MgPSAxNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naScpICkge3MgPSAxODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ncicpICkge3MgPSAxOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLScpICkge3MgPSAyMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLicpICkge3MgPSAyMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKicpICkge3MgPSAyMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nQCcpICkge3MgPSAyMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKCcpICkge3MgPSAyNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLCcpICkge3MgPSAyNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKScpICkge3MgPSAyNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPScpICkge3MgPSAyNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIycpICkge3MgPSAyODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nWycpICkge3MgPSAyOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXScpICkge3MgPSAzMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKycpICkge3MgPSAzMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLycpICkge3MgPSAzMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJScpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPCcpICkge3MgPSAzNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPicpICkge3MgPSAzNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfCcpICkge3MgPSAzNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJicpICkge3MgPSAzNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIScpICkge3MgPSAzODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPycpICkge3MgPSAzOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOicpICkge3MgPSA0MDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOycpICkge3MgPSA0MTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndycpICkge3MgPSA0Mjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndicpICkge3MgPSA0Mzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbicpICkge3MgPSA0NDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbycpICkge3MgPSA0NTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nMCcpICkge3MgPSA0Njt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49JzEnICYmIExBMjFfMDw9JzknKSkgKSB7cyA9IDQ3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdeJykgKSB7cyA9IDQ4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSckJ3x8KExBMjFfMD49J0EnICYmIExBMjFfMDw9J1onKXx8TEEyMV8wPT0nXyd8fChMQTIxXzA+PSdqJyAmJiBMQTIxXzA8PSdrJyl8fExBMjFfMD09J3EnfHwoTEEyMV8wPj0neCcgJiYgTEEyMV8wPD0neScpKSApIHtzID0gNDk7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wiJykgKSB7cyA9IDUwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcJycpICkge3MgPSA1MTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x0JyAmJiBMQTIxXzA8PSdcbicpfHxMQTIxXzA9PSdccid8fExBMjFfMD09JyAnKSApIHtzID0gNTI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdTAwMDAnICYmIExBMjFfMDw9J1xiJyl8fChMQTIxXzA+PSdcdTAwMEInICYmIExBMjFfMDw9J1xmJyl8fChMQTIxXzA+PSdcdTAwMEUnICYmIExBMjFfMDw9J1x1MDAxRicpfHxMQTIxXzA9PSdcXCd8fExBMjFfMD09J2AnfHwoTEEyMV8wPj0nficgJiYgTEEyMV8wPD0nXHVGRkZGJykpICkge3MgPSA1Mzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMjEsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMUGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MTNiZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTAwMTQgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5wYXJzZXIuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJEYXRhdHlwZVJ1bGVUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcnZpY2VzLkNoYXJ0RFNMR3JhbW1hckFjY2VzczsKKworCisKK2ltcG9ydCBvcmcuYW50bHIucnVudGltZS4qOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBJbnRlcm5hbENoYXJ0RFNMUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfSU5UIiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInY2hhcnQnIiwgIidkZXNjcmliZWQgYnknIiwgIidhcyciLCAiJ3BvbGxpbmcnIiwgIid1c2luZyciLCAiJ2JhciciLCAiJ3NoYWRlZCciLCAiJ2FuaW1hdGVkJyIsICInc3dhcHBlZCciLCAiJ3N0YWNrZWQnIiwgIidsaW5lJyIsICInc2hvd01hcmtlciciLCAiJ3RyZW5kTGluZSciLCAiJ2N1cnNvciciLCAiJ3pvb20nIiwgIid0b29sdGlwJyIsICInZmlsbFplcm8nIiwgIidmaWxsZWQnIiwgIidwaWUnIiwgIidlbXB0eSciLCAiJ2RvbnV0JyIsICInYnViYmxlJyIsICInbXVsdGlwbGllciciLCAiJ2dyYWRpZW50JyIsICIndHJhbnNwYXJlbnQnIiwgIidnYXVnZSciLCAiJ2xhYmVsJyIsICInaGFzVGlja3MnIiwgIidtaW5pbXVtJyIsICInbWF4aW11bSciLCAiJ2ludGVydmFscyciLCAiJ3RyZWUnIiwgIidtYXAnIiwgIidjb2xsYXBzaWJsZSciLCAiJ3VwIHRvJyIsICInZGF0YW1hcnQnIiwgIidsZWdlbmQnIiwgIid0b2dnbGUnIiwgIidyZXBsb3QnIiwgIidhbHdheXMnIiwgIidpbnNpZGUnIiwgIidheGlzJyIsICIncmVuZGVycyciLCAiJ3Nob3J0TGFiZWwnIiwgIid0aWNrYW5nbGUnIiwgIidzZWdtZW50Y29sb3InIiwgIidpbXBvcnQnIiwgIictJyIsICInLiciLCAiJyonIiwgIidAJyIsICInKCciLCAiJywnIiwgIicpJyIsICInPSciLCAiJyMnIiwgIidbJyIsICInXSciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic8JyIsICInPiciLCAiJz49JyIsICInfHwnIiwgIicmJiciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIidpbnN0YW5jZW9mJyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIicqKiciLCAiJy8nIiwgIiclJyIsICInISciLCAiJysrJyIsICInLS0nIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJzsnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIidmb3InIiwgIid3aGlsZSciLCAiJ2RvJyIsICIndmFyJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N0YXRpYyciLCAiJ2V4dGVuc2lvbiciLCAiJ3N1cGVyJyIsICInbmV3JyIsICInZmFsc2UnIiwgIid0cnVlJyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidpbnNpZGUtZ3JpZCciLCAiJ291dHNpZGUnIiwgIidvdXRzaWRlLWdyaWQnIiwgIidub3JtYWwnIiwgIidzbG93JyIsICInZmFzdCciLCAiJ25vcnRoJyIsICInbm9ydGgtZWFzdCciLCAiJ2Vhc3QnIiwgIidzb3V0aC1lYXN0JyIsICInc291dGgnIiwgIidzb3V0aC13ZXN0JyIsICInd2VzdCciLCAiJ25vcnRoLXdlc3QnIiwgIidjYXRlZ29yeSciLCAiJ2xpbmVhciciLCAiJ2RhdGUnIiwgIidsb2dhcml0aG1pYyciLCAiJ3B5cmFtaWQnIgorICAgIH07CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ0PTE0NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDM9MTQzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0Nj0xNDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDU9MTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0MD0xNDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQyPTE0MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDE9MTQxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU5PTU5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU1PTU1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU2PTU2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU3PTU3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU4PTU4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzUxPTUxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNz0xMzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM2PTEzNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzk9MTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzU0PTU0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzOD0xMzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMzPTEzMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzI9MTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYwPTYwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzNT0xMzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM0PTEzNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTMxPTEzMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMzA9MTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI5PTEyOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjY9MTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzYzPTYzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyNT0xMjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTI4PTEyODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjc9MTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM3PTM3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM4PTM4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM5PTM5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMzPTMzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM0PTM0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM1PTM1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzM2PTM2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMwPTMwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMxPTMxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzMyPTMyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1MT0xNTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTUwPTE1MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNTI9MTUyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ4PTQ4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ5PTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ0PTQ0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ1PTQ1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ2PTQ2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQ3PTQ3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzQwPTQwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0OD0xNDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ3PTE0NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNDk9MTQ5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkxPTkxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMD0xMDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTI9OTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTM9OTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAyPTEwMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185ND05NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDE9MTAxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkwPTkwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE5PTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE1PTE1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE2PTE2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE3PTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE4PTE4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk5PTk5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEzPTEzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzE0PTE0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk1PTk1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk2PTk2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk3PTk3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk4PTk4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfREVDSU1BTD04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI2PTI2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI3PTI3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI4PTI4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI5PTI5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIyPTIyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIzPTIzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI0PTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzI1PTI1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIwPTIwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzIxPTIxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMj0xMjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIxPTEyMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMjQ9MTI0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzcyPTcyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEyMz0xMjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTIwPTEyMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz01OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTk9MTE5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc4PTc4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExOD0xMTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE1PTExNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTE0PTExNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183NT03NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTc9MTE3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExNj0xMTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODA9ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTExPTExMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184MT04MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMTA9MTEwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzExMz0xMTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODM9ODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTEyPTExMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1dTPTExOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfQU5ZX09USEVSPTEyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg4PTg4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOD0xMDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODk9ODk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA3PTEwNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDk9MTA5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg0PTg0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwND0xMDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODU9ODU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAzPTEwMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nj04NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDY9MTA2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg3PTg3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNT0xMDU7CisKKyAgICAvLyBkZWxlZ2F0ZXMKKyAgICAvLyBkZWxlZ2F0b3JzCisKKworICAgICAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCkgeworICAgICAgICAgICAgdGhpcyhpbnB1dCwgbmV3IFJlY29nbml6ZXJTaGFyZWRTdGF0ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbENoYXJ0RFNMUGFyc2VyLnRva2VuTmFtZXM7IH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nIjsgfQorCisKKworICAgICAJcHJpdmF0ZSBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAgICAgCQorICAgICAgICBwdWJsaWMgSW50ZXJuYWxDaGFydERTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgQ2hhcnREU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3MpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQpOworICAgICAgICAgICAgdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICAgICAgICAgIHJlZ2lzdGVyUnVsZXMoZ3JhbW1hckFjY2Vzcy5nZXRHcmFtbWFyKCkpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRGaXJzdFJ1bGVOYW1lKCkgeworICAgICAgICAJcmV0dXJuICJDaGFydE1vZGVsIjsJCisgICAgICAgCX0KKyAgICAgICAJCisgICAgICAgCUBPdmVycmlkZQorICAgICAgIAlwcm90ZWN0ZWQgQ2hhcnREU0xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisgICAgICAgCQlyZXR1cm4gZ3JhbW1hckFjY2VzczsKKyAgICAgICAJfQorCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRNb2RlbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY4OjE6IGVudHJ5UnVsZUNoYXJ0TW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0TW9kZWw9IHJ1bGVDaGFydE1vZGVsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRNb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRNb2RlbCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OToyOiAoaXZfcnVsZUNoYXJ0TW9kZWw9IHJ1bGVDaGFydE1vZGVsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcwOjI6IGl2X3J1bGVDaGFydE1vZGVsPSBydWxlQ2hhcnRNb2RlbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydE1vZGVsX2luX2VudHJ5UnVsZUNoYXJ0TW9kZWw3NSk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRNb2RlbD1ydWxlQ2hhcnRNb2RlbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0TW9kZWw7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRNb2RlbDg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0TW9kZWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0TW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NzoxOiBydWxlQ2hhcnRNb2RlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoIChsdl9wYWNrYWdlc18wXzA9IHJ1bGVDaGFydFBhY2thZ2UgKSApKiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0TW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcGFja2FnZXNfMF8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA6Mjg6ICggKCAobHZfcGFja2FnZXNfMF8wPSBydWxlQ2hhcnRQYWNrYWdlICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MToxOiAoIChsdl9wYWNrYWdlc18wXzA9IHJ1bGVDaGFydFBhY2thZ2UgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MToxOiAoIChsdl9wYWNrYWdlc18wXzA9IHJ1bGVDaGFydFBhY2thZ2UgKSApKgorICAgICAgICAgICAgbG9vcDE6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMV8wPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODI6MTogKGx2X3BhY2thZ2VzXzBfMD0gcnVsZUNoYXJ0UGFja2FnZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MjoxOiAobHZfcGFja2FnZXNfMF8wPSBydWxlQ2hhcnRQYWNrYWdlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MzozOiBsdl9wYWNrYWdlc18wXzA9IHJ1bGVDaGFydFBhY2thZ2UKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxBY2Nlc3MoKS5nZXRQYWNrYWdlc0NoYXJ0UGFja2FnZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0UGFja2FnZV9pbl9ydWxlQ2hhcnRNb2RlbDEzMCk7CisgICAgICAgICAgICAJICAgIGx2X3BhY2thZ2VzXzBfMD1ydWxlQ2hhcnRQYWNrYWdlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRNb2RlbFJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJwYWNrYWdlcyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3BhY2thZ2VzXzBfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJDaGFydFBhY2thZ2UiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRNb2RlbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFBhY2thZ2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDc6MTogZW50cnlSdWxlQ2hhcnRQYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVDaGFydFBhY2thZ2U9IHJ1bGVDaGFydFBhY2thZ2UgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVDaGFydFBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUNoYXJ0UGFja2FnZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDg6MjogKGl2X3J1bGVDaGFydFBhY2thZ2U9IHJ1bGVDaGFydFBhY2thZ2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA5OjI6IGl2X3J1bGVDaGFydFBhY2thZ2U9IHJ1bGVDaGFydFBhY2thZ2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFBhY2thZ2VfaW5fZW50cnlSdWxlQ2hhcnRQYWNrYWdlMTY2KTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydFBhY2thZ2U9cnVsZUNoYXJ0UGFja2FnZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0UGFja2FnZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydFBhY2thZ2UxNzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRQYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydFBhY2thZ2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTY6MTogcnVsZUNoYXJ0UGFja2FnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3BhY2thZ2UnICggKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlQ2hhcnRJbXBvcnQgKSApKiAoIChsdl9jaGFydHNfNV8wPSBydWxlQ2hhcnQgKSApKiBvdGhlcmx2XzY9ICd9JyApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ2hhcnRQYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X25hbWVfMl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2ltcG9ydHNfNF8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2NoYXJ0c181XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTk6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkgKSogKCAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkgKSogb3RoZXJsdl82PSAnfScgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDoxOiAoICgpIG90aGVybHZfMT0gJ3BhY2thZ2UnICggKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlQ2hhcnRJbXBvcnQgKSApKiAoIChsdl9jaGFydHNfNV8wPSBydWxlQ2hhcnQgKSApKiBvdGhlcmx2XzY9ICd9JyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDoxOiAoICgpIG90aGVybHZfMT0gJ3BhY2thZ2UnICggKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgKG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlQ2hhcnRJbXBvcnQgKSApKiAoIChsdl9jaGFydHNfNV8wPSBydWxlQ2hhcnQgKSApKiBvdGhlcmx2XzY9ICd9JyApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDoyOiAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkgKSogKCAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkgKSogb3RoZXJsdl82PSAnfScgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMTo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldENoYXJ0UGFja2FnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxMyxGT0xMT1dfMTNfaW5fcnVsZUNoYXJ0UGFja2FnZTIyMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzA6MTogKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzE6MTogKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzMToxOiAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMyOjM6IGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX3J1bGVDaGFydFBhY2thZ2UyNDMpOworICAgICAgICAgICAgbHZfbmFtZV8yXzA9cnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUXVhbGlmaWVkTmFtZSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ4OjI6IChvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkgKSogKCAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkgKSogb3RoZXJsdl82PSAnfScgKT8KKyAgICAgICAgICAgIGludCBhbHQ0PTI7CisgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE0XzA9PTE0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0ODo0OiBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkgKSogKCAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkgKSogb3RoZXJsdl82PSAnfScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzM9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlQ2hhcnRQYWNrYWdlMjU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1MjoxOiAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDI6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyXzA9PTYyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUzOjE6IChsdl9pbXBvcnRzXzRfMD0gcnVsZUNoYXJ0SW1wb3J0ICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTM6MTogKGx2X2ltcG9ydHNfNF8wPSBydWxlQ2hhcnRJbXBvcnQgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU0OjM6IGx2X2ltcG9ydHNfNF8wPSBydWxlQ2hhcnRJbXBvcnQKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0SW1wb3J0c0NoYXJ0SW1wb3J0UGFyc2VyUnVsZUNhbGxfM18xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SW1wb3J0X2luX3J1bGVDaGFydFBhY2thZ2UyNzcpOworICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2ltcG9ydHNfNF8wPXJ1bGVDaGFydEltcG9ydCgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJpbXBvcnRzIiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9pbXBvcnRzXzRfMCwgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkNoYXJ0SW1wb3J0Iik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzA6MzogKCAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDM6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTE2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcxOjE6IChsdl9jaGFydHNfNV8wPSBydWxlQ2hhcnQgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MToxOiAobHZfY2hhcnRzXzVfMD0gcnVsZUNoYXJ0ICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MjozOiBsdl9jaGFydHNfNV8wPSBydWxlQ2hhcnQKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0Q2hhcnRzQ2hhcnRQYXJzZXJSdWxlQ2FsbF8zXzJfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRfaW5fcnVsZUNoYXJ0UGFja2FnZTI5OSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfY2hhcnRzXzVfMD1ydWxlQ2hhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiY2hhcnRzIiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9jaGFydHNfNV8wLCAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQ2hhcnQiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlQ2hhcnRQYWNrYWdlMzEyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0UGFja2FnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMDoxOiBlbnRyeVJ1bGVDaGFydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnQ9IHJ1bGVDaGFydCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDE6MjogKGl2X3J1bGVDaGFydD0gcnVsZUNoYXJ0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMjoyOiBpdl9ydWxlQ2hhcnQ9IHJ1bGVDaGFydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRfaW5fZW50cnlSdWxlQ2hhcnQzNTApOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0PXJ1bGVDaGFydCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0MzYwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOToxOiBydWxlQ2hhcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdjaGFydCcgKCAobHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgKCAoIChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWQgYnknICkgKSAoIChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApICkgKT8gb3RoZXJsdl81PSAnYXMnICggKGx2X2NoYXJ0dHlwZV82XzA9IHJ1bGVDaGFydE9wdGlvbiApICkgKCAoIChsdl9wb2xsaW5nXzdfMD0gJ3BvbGxpbmcnICkgKSAoIChsdl9wb2xsaW5nVGltZV84XzA9IFJVTEVfSU5UICkgKSApPyAob3RoZXJsdl85PSAndXNpbmcnICggKGx2X3NvdXJjZV8xMF8wPSBydWxlQ2hhcnREYXRhbWFydCApICkgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZGVzY3JpcHRpb25fM18wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBsdl9wb2xsaW5nXzdfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9wb2xsaW5nVGltZV84XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl85PW51bGw7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbmFtZV8yXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfZGVzY3JpcHRpb25WYWx1ZV80XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfY2hhcnR0eXBlXzZfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9zb3VyY2VfMTBfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxMjoyODogKCAoICgpIG90aGVybHZfMT0gJ2NoYXJ0JyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyBvdGhlcmx2XzU9ICdhcycgKCAobHZfY2hhcnR0eXBlXzZfMD0gcnVsZUNoYXJ0T3B0aW9uICkgKSAoICggKGx2X3BvbGxpbmdfN18wPSAncG9sbGluZycgKSApICggKGx2X3BvbGxpbmdUaW1lXzhfMD0gUlVMRV9JTlQgKSApICk/IChvdGhlcmx2Xzk9ICd1c2luZycgKCAobHZfc291cmNlXzEwXzA9IHJ1bGVDaGFydERhdGFtYXJ0ICkgKSApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzOjE6ICggKCkgb3RoZXJsdl8xPSAnY2hhcnQnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/IG90aGVybHZfNT0gJ2FzJyAoIChsdl9jaGFydHR5cGVfNl8wPSBydWxlQ2hhcnRPcHRpb24gKSApICggKCAobHZfcG9sbGluZ183XzA9ICdwb2xsaW5nJyApICkgKCAobHZfcG9sbGluZ1RpbWVfOF8wPSBSVUxFX0lOVCApICkgKT8gKG90aGVybHZfOT0gJ3VzaW5nJyAoIChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKSApICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzOjE6ICggKCkgb3RoZXJsdl8xPSAnY2hhcnQnICggKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKSApICggKCAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApICkgKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApICk/IG90aGVybHZfNT0gJ2FzJyAoIChsdl9jaGFydHR5cGVfNl8wPSBydWxlQ2hhcnRPcHRpb24gKSApICggKCAobHZfcG9sbGluZ183XzA9ICdwb2xsaW5nJyApICkgKCAobHZfcG9sbGluZ1RpbWVfOF8wPSBSVUxFX0lOVCApICkgKT8gKG90aGVybHZfOT0gJ3VzaW5nJyAoIChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKSApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzOjI6ICgpIG90aGVybHZfMT0gJ2NoYXJ0JyAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPyBvdGhlcmx2XzU9ICdhcycgKCAobHZfY2hhcnR0eXBlXzZfMD0gcnVsZUNoYXJ0T3B0aW9uICkgKSAoICggKGx2X3BvbGxpbmdfN18wPSAncG9sbGluZycgKSApICggKGx2X3BvbGxpbmdUaW1lXzhfMD0gUlVMRV9JTlQgKSApICk/IChvdGhlcmx2Xzk9ICd1c2luZycgKCAobHZfc291cmNlXzEwXzA9IHJ1bGVDaGFydERhdGFtYXJ0ICkgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTM6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE0OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMTZfaW5fcnVsZUNoYXJ0NDA2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldENoYXJ0S2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMzoxOiAoIChsdl9uYW1lXzJfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjQ6MTogKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjQ6MTogKGx2X25hbWVfMl8wPSBydWxlVFJBTlNMQVRBQkxFSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjU6MzogbHZfbmFtZV8yXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0TmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVJRF9pbl9ydWxlQ2hhcnQ0MjcpOworICAgICAgICAgICAgbHZfbmFtZV8yXzA9cnVsZVRSQU5TTEFUQUJMRUlEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9uYW1lXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiVFJBTlNMQVRBQkxFSUQiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MToyOiAoICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKSApPworICAgICAgICAgICAgaW50IGFsdDU9MjsKKyAgICAgICAgICAgIGludCBMQTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTVfMD09MTcpICkgeworICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxOjM6ICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApICggKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxOjM6ICggKGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQyOjE6IChsdl9kZXNjcmlwdGlvbl8zXzA9ICdkZXNjcmliZWQgYnknICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MjoxOiAobHZfZGVzY3JpcHRpb25fM18wPSAnZGVzY3JpYmVkIGJ5JyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQzOjM6IGx2X2Rlc2NyaXB0aW9uXzNfMD0gJ2Rlc2NyaWJlZCBieScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9kZXNjcmlwdGlvbl8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDE3LEZPTExPV18xN19pbl9ydWxlQ2hhcnQ0NDYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2Rlc2NyaXB0aW9uXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldERlc2NyaXB0aW9uRGVzY3JpYmVkQnlLZXl3b3JkXzNfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgImRlc2NyaXB0aW9uIiwgdHJ1ZSwgImRlc2NyaWJlZCBieSIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTY6MjogKCAobHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU3OjE6IChsdl9kZXNjcmlwdGlvblZhbHVlXzRfMD0gcnVsZVRSQU5TTEFUQUJMRVNUUklORyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTc6MTogKGx2X2Rlc2NyaXB0aW9uVmFsdWVfNF8wPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTg6MzogbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0RGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVTVFJJTkdfaW5fcnVsZUNoYXJ0NDgwKTsKKyAgICAgICAgICAgICAgICAgICAgbHZfZGVzY3JpcHRpb25WYWx1ZV80XzA9cnVsZVRSQU5TTEFUQUJMRVNUUklORygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImRlc2NyaXB0aW9uVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9kZXNjcmlwdGlvblZhbHVlXzRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZUNoYXJ0NDk0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldEFzS2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3ODoxOiAoIChsdl9jaGFydHR5cGVfNl8wPSBydWxlQ2hhcnRPcHRpb24gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3OToxOiAobHZfY2hhcnR0eXBlXzZfMD0gcnVsZUNoYXJ0T3B0aW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc5OjE6IChsdl9jaGFydHR5cGVfNl8wPSBydWxlQ2hhcnRPcHRpb24gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODA6MzogbHZfY2hhcnR0eXBlXzZfMD0gcnVsZUNoYXJ0T3B0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRDaGFydHR5cGVDaGFydE9wdGlvblBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRPcHRpb25faW5fcnVsZUNoYXJ0NTE1KTsKKyAgICAgICAgICAgIGx2X2NoYXJ0dHlwZV82XzA9cnVsZUNoYXJ0T3B0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiY2hhcnR0eXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2NoYXJ0dHlwZV82XzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIkNoYXJ0T3B0aW9uIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTY6MjogKCAoIChsdl9wb2xsaW5nXzdfMD0gJ3BvbGxpbmcnICkgKSAoIChsdl9wb2xsaW5nVGltZV84XzA9IFJVTEVfSU5UICkgKSApPworICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTZfMD09MTkpICkgeworICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk2OjM6ICggKGx2X3BvbGxpbmdfN18wPSAncG9sbGluZycgKSApICggKGx2X3BvbGxpbmdUaW1lXzhfMD0gUlVMRV9JTlQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTY6MzogKCAobHZfcG9sbGluZ183XzA9ICdwb2xsaW5nJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTc6MTogKGx2X3BvbGxpbmdfN18wPSAncG9sbGluZycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk3OjE6IChsdl9wb2xsaW5nXzdfMD0gJ3BvbGxpbmcnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTg6MzogbHZfcG9sbGluZ183XzA9ICdwb2xsaW5nJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X3BvbGxpbmdfN18wPShUb2tlbiltYXRjaChpbnB1dCwxOSxGT0xMT1dfMTlfaW5fcnVsZUNoYXJ0NTM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9wb2xsaW5nXzdfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEFjY2VzcygpLmdldFBvbGxpbmdQb2xsaW5nS2V5d29yZF82XzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJwb2xsaW5nIiwgdHJ1ZSwgInBvbGxpbmciKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzExOjI6ICggKGx2X3BvbGxpbmdUaW1lXzhfMD0gUlVMRV9JTlQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEyOjE6IChsdl9wb2xsaW5nVGltZV84XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMjoxOiAobHZfcG9sbGluZ1RpbWVfOF8wPSBSVUxFX0lOVCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEzOjM6IGx2X3BvbGxpbmdUaW1lXzhfMD0gUlVMRV9JTlQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9wb2xsaW5nVGltZV84XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV19SVUxFX0lOVF9pbl9ydWxlQ2hhcnQ1NjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl9wb2xsaW5nVGltZV84XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRQb2xsaW5nVGltZUlOVFRlcm1pbmFsUnVsZUNhbGxfNl8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkJCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJInBvbGxpbmdUaW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcG9sbGluZ1RpbWVfOF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIklOVCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI5OjQ6IChvdGhlcmx2Xzk9ICd1c2luZycgKCAobHZfc291cmNlXzEwXzA9IHJ1bGVDaGFydERhdGFtYXJ0ICkgKSApPworICAgICAgICAgICAgaW50IGFsdDc9MjsKKyAgICAgICAgICAgIGludCBMQTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTdfMD09MjApICkgeworICAgICAgICAgICAgICAgIGFsdDc9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI5OjY6IG90aGVybHZfOT0gJ3VzaW5nJyAoIChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCwyMCxGT0xMT1dfMjBfaW5fcnVsZUNoYXJ0NTg0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBY2Nlc3MoKS5nZXRVc2luZ0tleXdvcmRfN18wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzMzoxOiAoIChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM0OjE6IChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM0OjE6IChsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNTozOiBsdl9zb3VyY2VfMTBfMD0gcnVsZUNoYXJ0RGF0YW1hcnQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QWNjZXNzKCkuZ2V0U291cmNlQ2hhcnREYXRhbWFydFBhcnNlclJ1bGVDYWxsXzdfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydERhdGFtYXJ0X2luX3J1bGVDaGFydDYwNSk7CisgICAgICAgICAgICAgICAgICAgIGx2X3NvdXJjZV8xMF8wPXJ1bGVDaGFydERhdGFtYXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkic291cmNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfc291cmNlXzEwXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiQ2hhcnREYXRhbWFydCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydE9wdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM1OToxOiBlbnRyeVJ1bGVDaGFydE9wdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnRPcHRpb249IHJ1bGVDaGFydE9wdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0T3B0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydE9wdGlvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNjA6MjogKGl2X3J1bGVDaGFydE9wdGlvbj0gcnVsZUNoYXJ0T3B0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM2MToyOiBpdl9ydWxlQ2hhcnRPcHRpb249IHJ1bGVDaGFydE9wdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRPcHRpb25faW5fZW50cnlSdWxlQ2hhcnRPcHRpb242NDMpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0T3B0aW9uPXJ1bGVDaGFydE9wdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0T3B0aW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0T3B0aW9uNjUzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0T3B0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydE9wdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM2ODoxOiBydWxlQ2hhcnRPcHRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfQ2hhcnRCYXJfMD0gcnVsZUNoYXJ0QmFyIHwgdGhpc19DaGFydExpbmVfMT0gcnVsZUNoYXJ0TGluZSB8IHRoaXNfQ2hhcnRQaWVfMj0gcnVsZUNoYXJ0UGllIHwgdGhpc19DaGFydERvbnV0XzM9IHJ1bGVDaGFydERvbnV0IHwgdGhpc19DaGFydEJ1YmJsZV80PSBydWxlQ2hhcnRCdWJibGUgfCB0aGlzX0NoYXJ0R2F1Z2VfNT0gcnVsZUNoYXJ0R2F1Z2UgfCB0aGlzX0NoYXJ0VHJlZV82PSBydWxlQ2hhcnRUcmVlICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydE9wdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX0NoYXJ0QmFyXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19DaGFydExpbmVfMSA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX0NoYXJ0UGllXzIgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19DaGFydERvbnV0XzMgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19DaGFydEJ1YmJsZV80ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfQ2hhcnRHYXVnZV81ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfQ2hhcnRUcmVlXzYgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNzE6Mjg6ICggKHRoaXNfQ2hhcnRCYXJfMD0gcnVsZUNoYXJ0QmFyIHwgdGhpc19DaGFydExpbmVfMT0gcnVsZUNoYXJ0TGluZSB8IHRoaXNfQ2hhcnRQaWVfMj0gcnVsZUNoYXJ0UGllIHwgdGhpc19DaGFydERvbnV0XzM9IHJ1bGVDaGFydERvbnV0IHwgdGhpc19DaGFydEJ1YmJsZV80PSBydWxlQ2hhcnRCdWJibGUgfCB0aGlzX0NoYXJ0R2F1Z2VfNT0gcnVsZUNoYXJ0R2F1Z2UgfCB0aGlzX0NoYXJ0VHJlZV82PSBydWxlQ2hhcnRUcmVlICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNzI6MTogKHRoaXNfQ2hhcnRCYXJfMD0gcnVsZUNoYXJ0QmFyIHwgdGhpc19DaGFydExpbmVfMT0gcnVsZUNoYXJ0TGluZSB8IHRoaXNfQ2hhcnRQaWVfMj0gcnVsZUNoYXJ0UGllIHwgdGhpc19DaGFydERvbnV0XzM9IHJ1bGVDaGFydERvbnV0IHwgdGhpc19DaGFydEJ1YmJsZV80PSBydWxlQ2hhcnRCdWJibGUgfCB0aGlzX0NoYXJ0R2F1Z2VfNT0gcnVsZUNoYXJ0R2F1Z2UgfCB0aGlzX0NoYXJ0VHJlZV82PSBydWxlQ2hhcnRUcmVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzcyOjE6ICh0aGlzX0NoYXJ0QmFyXzA9IHJ1bGVDaGFydEJhciB8IHRoaXNfQ2hhcnRMaW5lXzE9IHJ1bGVDaGFydExpbmUgfCB0aGlzX0NoYXJ0UGllXzI9IHJ1bGVDaGFydFBpZSB8IHRoaXNfQ2hhcnREb251dF8zPSBydWxlQ2hhcnREb251dCB8IHRoaXNfQ2hhcnRCdWJibGVfND0gcnVsZUNoYXJ0QnViYmxlIHwgdGhpc19DaGFydEdhdWdlXzU9IHJ1bGVDaGFydEdhdWdlIHwgdGhpc19DaGFydFRyZWVfNj0gcnVsZUNoYXJ0VHJlZSApCisgICAgICAgICAgICBpbnQgYWx0OD03OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDIxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDg9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM2OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0OD01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDg9NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ4PTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDgsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzczOjU6IHRoaXNfQ2hhcnRCYXJfMD0gcnVsZUNoYXJ0QmFyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRCYXJQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QmFyX2luX3J1bGVDaGFydE9wdGlvbjcwMCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnRCYXJfMD1ydWxlQ2hhcnRCYXIoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DaGFydEJhcl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzgzOjU6IHRoaXNfQ2hhcnRMaW5lXzE9IHJ1bGVDaGFydExpbmUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydExpbmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0TGluZV9pbl9ydWxlQ2hhcnRPcHRpb243MjcpOworICAgICAgICAgICAgICAgICAgICB0aGlzX0NoYXJ0TGluZV8xPXJ1bGVDaGFydExpbmUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DaGFydExpbmVfMTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM5Mzo1OiB0aGlzX0NoYXJ0UGllXzI9IHJ1bGVDaGFydFBpZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0UGllUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFBpZV9pbl9ydWxlQ2hhcnRPcHRpb243NTQpOworICAgICAgICAgICAgICAgICAgICB0aGlzX0NoYXJ0UGllXzI9cnVsZUNoYXJ0UGllKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfQ2hhcnRQaWVfMjsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQwMzo1OiB0aGlzX0NoYXJ0RG9udXRfMz0gcnVsZUNoYXJ0RG9udXQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKS5nZXRDaGFydERvbnV0UGFyc2VyUnVsZUNhbGxfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydERvbnV0X2luX3J1bGVDaGFydE9wdGlvbjc4MSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnREb251dF8zPXJ1bGVDaGFydERvbnV0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfQ2hhcnREb251dF8zOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDEzOjU6IHRoaXNfQ2hhcnRCdWJibGVfND0gcnVsZUNoYXJ0QnViYmxlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0Q2hhcnRCdWJibGVQYXJzZXJSdWxlQ2FsbF80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QnViYmxlX2luX3J1bGVDaGFydE9wdGlvbjgwOCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnRCdWJibGVfND1ydWxlQ2hhcnRCdWJibGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DaGFydEJ1YmJsZV80OyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDIzOjU6IHRoaXNfQ2hhcnRHYXVnZV81PSBydWxlQ2hhcnRHYXVnZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0R2F1Z2VfaW5fcnVsZUNoYXJ0T3B0aW9uODM1KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19DaGFydEdhdWdlXzU9cnVsZUNoYXJ0R2F1Z2UoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DaGFydEdhdWdlXzU7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA3IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0MzM6NTogdGhpc19DaGFydFRyZWVfNj0gcnVsZUNoYXJ0VHJlZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvbkFjY2VzcygpLmdldENoYXJ0VHJlZVBhcnNlclJ1bGVDYWxsXzYoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRUcmVlX2luX3J1bGVDaGFydE9wdGlvbjg2Mik7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnRUcmVlXzY9cnVsZUNoYXJ0VHJlZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX0NoYXJ0VHJlZV82OyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRPcHRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRCYXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NDk6MTogZW50cnlSdWxlQ2hhcnRCYXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0QmFyPSBydWxlQ2hhcnRCYXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVDaGFydEJhcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRCYXIgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDUwOjI6IChpdl9ydWxlQ2hhcnRCYXI9IHJ1bGVDaGFydEJhciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTE6MjogaXZfcnVsZUNoYXJ0QmFyPSBydWxlQ2hhcnRCYXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QmFyX2luX2VudHJ5UnVsZUNoYXJ0QmFyODk3KTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydEJhcj1ydWxlQ2hhcnRCYXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydEJhcjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydEJhcjkwNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydEJhciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRCYXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NTg6MTogcnVsZUNoYXJ0QmFyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnYmFyJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKSApICkgKSApICkqICkgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydEJhcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIGx2X3NoYWRvd18zXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfYW5pbWF0ZWRfNF8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3N3YXBwZWRfNV8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3N0YWNrZWRfNl8wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NjE6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdiYXInICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApICkgKSogKSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2MjoxOiAoICgpIG90aGVybHZfMT0gJ2JhcicgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF80XzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2MjoxOiAoICgpIG90aGVybHZfMT0gJ2JhcicgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF80XzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2MjoyOiAoKSBvdGhlcmx2XzE9ICdiYXInICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDYyOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ2Mzo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0Q2hhcnRCYXJBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3J1bGVDaGFydEJhcjk1Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRCYXJLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDcyOjE6ICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDc0OjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKSApICkgKSApICkqICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0NzQ6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ3NToyOiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDc4OjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF80XzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ3OTozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKSApICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ3OTozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKSApICkgKSApICkqCisgICAgICAgICAgICBsb29wOToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0OT01OworICAgICAgICAgICAgICAgIGludCBMQTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCBMQTlfMCA9PTIyICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTlfMCA9PTIzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTlfMCA9PTI0ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTlfMCA9PTI1ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ5PTQ7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDkpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4MTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0ODI6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCYXIiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4MjoxMDU6ICggKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDgzOjY6ICh7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0ODY6NjogKHsuLi59PyA9PiAoIChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4Njo3OiB7Li4ufT8gPT4gKCAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEJhciIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo0ODY6MTY6ICggKGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjQ4NzoxOiAobHZfc2hhZG93XzNfMD0gJ3NoYWRlZCcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDg3OjE6IChsdl9zaGFkb3dfM18wPSAnc2hhZGVkJyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NDg4OjM6IGx2X3NoYWRvd18zXzA9ICdzaGFkZWQnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfc2hhZG93XzNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjIsRk9MTE9XXzIyX2luX3J1bGVDaGFydEJhcjEwMTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X3NoYWRvd18zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTaGFkb3dTaGFkZWRLZXl3b3JkXzJfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgInNoYWRvdyIsIHRydWUsICJzaGFkZWQiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTA4OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUwODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF80XzA9ICdhbmltYXRlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTA5OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEJhciIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTA5OjEwNTogKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTEwOjY6ICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTEzOjY6ICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfNF8wPSAnYW5pbWF0ZWQnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTEzOjc6IHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF80XzA9ICdhbmltYXRlZCcgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEJhciIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MTM6MTY6ICggKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MTQ6MTogKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1MTQ6MTogKGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTE1OjM6IGx2X2FuaW1hdGVkXzRfMD0gJ2FuaW1hdGVkJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2FuaW1hdGVkXzRfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVDaGFydEJhcjExMDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2FuaW1hdGVkXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldEFuaW1hdGVkQW5pbWF0ZWRLZXl3b3JkXzJfMV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgImFuaW1hdGVkIiwgdHJ1ZSwgImFuaW1hdGVkIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUzNTo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTM1OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTM2OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCYXIiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjUzNjoxMDU6ICggKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Mzc6NjogKHsuLi59PyA9PiAoIChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMik7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQwOjY6ICh7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU0MDo3OiB7Li4ufT8gPT4gKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0QmFyIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU0MDoxNjogKCAobHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1NDE6MTogKGx2X3N3YXBwZWRfNV8wPSAnc3dhcHBlZCcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTQxOjE6IChsdl9zd2FwcGVkXzVfMD0gJ3N3YXBwZWQnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1NDI6MzogbHZfc3dhcHBlZF81XzA9ICdzd2FwcGVkJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X3N3YXBwZWRfNV8wPShUb2tlbiltYXRjaChpbnB1dCwyNCxGT0xMT1dfMjRfaW5fcnVsZUNoYXJ0QmFyMTE4Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfc3dhcHBlZF81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTd2FwcGVkU3dhcHBlZEtleXdvcmRfMl8yXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAic3dhcHBlZCIsIHRydWUsICJzd2FwcGVkIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDQgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2Mjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTYyOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTYzOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDMpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCYXIiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMykiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2MzoxMDU6ICggKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1NjQ6NjogKHsuLi59PyA9PiAoIChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMyk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTY3OjY6ICh7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2Nzo3OiB7Li4ufT8gPT4gKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0QmFyIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjU2NzoxNjogKCAobHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Njg6MTogKGx2X3N0YWNrZWRfNl8wPSAnc3RhY2tlZCcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NTY4OjE6IChsdl9zdGFja2VkXzZfMD0gJ3N0YWNrZWQnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo1Njk6MzogbHZfc3RhY2tlZF82XzA9ICdzdGFja2VkJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X3N0YWNrZWRfNl8wPShUb2tlbiltYXRjaChpbnB1dCwyNSxGT0xMT1dfMjVfaW5fcnVsZUNoYXJ0QmFyMTI3MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfc3RhY2tlZF82XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRTdGFja2VkU3RhY2tlZEtleXdvcmRfMl8zXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QmFyUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAic3RhY2tlZCIsIHRydWUsICJzdGFja2VkIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhckFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCYXJBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0QmFyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0TGluZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwNDoxOiBlbnRyeVJ1bGVDaGFydExpbmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0TGluZT0gcnVsZUNoYXJ0TGluZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0TGluZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRMaW5lID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYwNToyOiAoaXZfcnVsZUNoYXJ0TGluZT0gcnVsZUNoYXJ0TGluZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MDY6MjogaXZfcnVsZUNoYXJ0TGluZT0gcnVsZUNoYXJ0TGluZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0TGluZV9pbl9lbnRyeVJ1bGVDaGFydExpbmUxMzYwKTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydExpbmU9cnVsZUNoYXJ0TGluZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0TGluZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydExpbmUxMzcwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0TGluZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRMaW5lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjEzOjE6IHJ1bGVDaGFydExpbmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdsaW5lJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ2hhcnRMaW5lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfYW5pbWF0ZWRfM18wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3Nob3dNYXJrZXJfNF8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3RyZW5kTGluZV81XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfY3Vyc29yXzZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl96b29tXzdfMD1udWxsOworICAgICAgICBUb2tlbiBsdl90b29sdGlwXzhfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9maWxsVG9aZXJvXzlfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9maWxsQXJlYV8xMF8wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MTY6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdsaW5lJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjE3OjE6ICggKCkgb3RoZXJsdl8xPSAnbGluZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF8zXzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hvd01hcmtlcl80XzA9ICdzaG93TWFya2VyJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsQXJlYV8xMF8wPSAnZmlsbGVkJyApICkgKSApICkgKSogKSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MTc6MTogKCAoKSBvdGhlcmx2XzE9ICdsaW5lJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYxNzoyOiAoKSBvdGhlcmx2XzE9ICdsaW5lJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2MTc6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjE4OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Q2hhcnRMaW5lQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDI2LEZPTExPV18yNl9pbl9ydWxlQ2hhcnRMaW5lMTQxNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0TGluZUtleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Mjc6MTogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF8zXzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hvd01hcmtlcl80XzA9ICdzaG93TWFya2VyJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsQXJlYV8xMF8wPSAnZmlsbGVkJyApICkgKSApICkgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI5OjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjI5OjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjMwOjI6ICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF8zXzA9ICdhbmltYXRlZCcgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hvd01hcmtlcl80XzA9ICdzaG93TWFya2VyJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsQXJlYV8xMF8wPSAnZmlsbGVkJyApICkgKSApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzMzoyOiAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9jdXJzb3JfNl8wPSAnY3Vyc29yJyApICkgKCAobHZfem9vbV83XzA9ICd6b29tJyApICk/ICggKGx2X3Rvb2x0aXBfOF8wPSAndG9vbHRpcCcgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM0OjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9jdXJzb3JfNl8wPSAnY3Vyc29yJyApICkgKCAobHZfem9vbV83XzA9ICd6b29tJyApICk/ICggKGx2X3Rvb2x0aXBfOF8wPSAndG9vbHRpcCcgKSApPyApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzNDozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDEyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMj03OworICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggTEExMl8wID09MjMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MjcgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MjggJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MjkgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MzIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDQpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExMl8wID09MzMgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDUpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMj02OworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM2OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjYzNjo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9hbmltYXRlZF8zXzA9ICdhbmltYXRlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM3OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRMaW5lIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM3OjEwNjogKCAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjM4OjY6ICh7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0MTo2OiAoey4uLn0/ID0+ICggKGx2X2FuaW1hdGVkXzNfMD0gJ2FuaW1hdGVkJyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0MTo3OiB7Li4ufT8gPT4gKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRMaW5lIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0MToxNjogKCAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0MjoxOiAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY0MjoxOiAobHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NDM6MzogbHZfYW5pbWF0ZWRfM18wPSAnYW5pbWF0ZWQnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfYW5pbWF0ZWRfM18wPShUb2tlbiltYXRjaChpbnB1dCwyMyxGT0xMT1dfMjNfaW5fcnVsZUNoYXJ0TGluZTE0NzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2FuaW1hdGVkXzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRBbmltYXRlZEFuaW1hdGVkS2V5d29yZF8yXzBfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiYW5pbWF0ZWQiLCB0cnVlLCAiYW5pbWF0ZWQiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2Mzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjYzOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY0OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfc2hvd01hcmtlcl80XzA9ICdzaG93TWFya2VyJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0TGluZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2NDoxMDY6ICggKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2NjU6NjogKHsuLi59PyA9PiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDEpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2ODo2OiAoey4uLn0/ID0+ICggKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Njg6Nzogey4uLn0/ID0+ICggKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydExpbmUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjY4OjE2OiAoIChsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY2OToxOiAobHZfc2hvd01hcmtlcl80XzA9ICdzaG93TWFya2VyJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2Njk6MTogKGx2X3Nob3dNYXJrZXJfNF8wPSAnc2hvd01hcmtlcicgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY3MDozOiBsdl9zaG93TWFya2VyXzRfMD0gJ3Nob3dNYXJrZXInCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfc2hvd01hcmtlcl80XzA9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV18yN19pbl9ydWxlQ2hhcnRMaW5lMTU2NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfc2hvd01hcmtlcl80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0U2hvd01hcmtlclNob3dNYXJrZXJLZXl3b3JkXzJfMV8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJzaG93TWFya2VyIiwgdHJ1ZSwgInNob3dNYXJrZXIiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDMgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5MDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTE6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0TGluZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMikiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5MToxMDY6ICggKHsuLi59PyA9PiAoIChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NjkyOjY6ICh7Li4ufT8gPT4gKCAobHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMik7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njk1OjY6ICh7Li4ufT8gPT4gKCAobHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTU6Nzogey4uLn0/ID0+ICggKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRMaW5lIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjY5NToxNjogKCAobHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Njk2OjE6IChsdl90cmVuZExpbmVfNV8wPSAndHJlbmRMaW5lJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTY6MTogKGx2X3RyZW5kTGluZV81XzA9ICd0cmVuZExpbmUnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo2OTc6MzogbHZfdHJlbmRMaW5lXzVfMD0gJ3RyZW5kTGluZScKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl90cmVuZExpbmVfNV8wPShUb2tlbiltYXRjaChpbnB1dCwyOCxGT0xMT1dfMjhfaW5fcnVsZUNoYXJ0TGluZTE2NDkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X3RyZW5kTGluZV81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VHJlbmRMaW5lVHJlbmRMaW5lS2V5d29yZF8yXzJfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAidHJlbmRMaW5lIiwgdHJ1ZSwgInRyZW5kTGluZSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgNCA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcxODo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDMpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRMaW5lIiwgImdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAzKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzE4OjEwNjogKCAoey4uLn0/ID0+ICggKCAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKSApICggKGx2X3pvb21fN18wPSAnem9vbScgKSApPyAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MTk6NjogKHsuLi59PyA9PiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAzKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MjI6NjogKHsuLi59PyA9PiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcyMjo3OiB7Li4ufT8gPT4gKCAoIChsdl9jdXJzb3JfNl8wPSAnY3Vyc29yJyApICkgKCAobHZfem9vbV83XzA9ICd6b29tJyApICk/ICggKGx2X3Rvb2x0aXBfOF8wPSAndG9vbHRpcCcgKSApPyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydExpbmUiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzIyOjE2OiAoICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/ICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MjI6MTc6ICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKSAoIChsdl96b29tXzdfMD0gJ3pvb20nICkgKT8gKCAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApICk/CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3MjI6MTc6ICggKGx2X2N1cnNvcl82XzA9ICdjdXJzb3InICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjcyMzoxOiAobHZfY3Vyc29yXzZfMD0gJ2N1cnNvcicgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzIzOjE6IChsdl9jdXJzb3JfNl8wPSAnY3Vyc29yJyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzI0OjM6IGx2X2N1cnNvcl82XzA9ICdjdXJzb3InCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfY3Vyc29yXzZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjksRk9MTE9XXzI5X2luX3J1bGVDaGFydExpbmUxNzM1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9jdXJzb3JfNl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEN1cnNvckN1cnNvcktleXdvcmRfMl8zXzBfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiY3Vyc29yIiwgdHJ1ZSwgImN1cnNvciIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mzc6MjogKCAobHZfem9vbV83XzA9ICd6b29tJyApICk/CisgICAgICAgICAgICAJICAgIGludCBhbHQxMD0yOworICAgICAgICAgICAgCSAgICBpbnQgTEExMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIAkgICAgaWYgKCAoTEExMF8wPT0zMCkgKSB7CisgICAgICAgICAgICAJICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mzg6MTogKGx2X3pvb21fN18wPSAnem9vbScgKQorICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjczODoxOiAobHZfem9vbV83XzA9ICd6b29tJyApCisgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Mzk6MzogbHZfem9vbV83XzA9ICd6b29tJworICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBsdl96b29tXzdfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMzAsRk9MTE9XXzMwX2luX3J1bGVDaGFydExpbmUxNzY2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfem9vbV83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0Wm9vbVpvb21LZXl3b3JkXzJfM18xXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiem9vbSIsIHRydWUsICJ6b29tIik7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc1MjozOiAoIChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkgKT8KKyAgICAgICAgICAgIAkgICAgaW50IGFsdDExPTI7CisgICAgICAgICAgICAJICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgCSAgICBpZiAoIChMQTExXzA9PTMxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgc3dpdGNoIChhbHQxMSkgeworICAgICAgICAgICAgCSAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc1MzoxOiAobHZfdG9vbHRpcF84XzA9ICd0b29sdGlwJyApCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzUzOjE6IChsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnICkKKyAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc1NDozOiBsdl90b29sdGlwXzhfMD0gJ3Rvb2x0aXAnCisgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgCSAgICAgICAgICAgIGx2X3Rvb2x0aXBfOF8wPShUb2tlbiltYXRjaChpbnB1dCwzMSxGT0xMT1dfMzFfaW5fcnVsZUNoYXJ0TGluZTE3OTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl90b29sdGlwXzhfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRUb29sdGlwVG9vbHRpcEtleXdvcmRfMl8zXzJfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJ0b29sdGlwIiwgdHJ1ZSwgInRvb2x0aXAiKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDUgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3NzU6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCA0KSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0TGluZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgNCkiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3NToxMDY6ICggKHsuLi59PyA9PiAoIChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzc2OjY6ICh7Li4ufT8gPT4gKCAobHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgNCk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Nzc5OjY6ICh7Li4ufT8gPT4gKCAobHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3Nzk6Nzogey4uLn0/ID0+ICggKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRMaW5lIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjc3OToxNjogKCAobHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6NzgwOjE6IChsdl9maWxsVG9aZXJvXzlfMD0gJ2ZpbGxaZXJvJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3ODA6MTogKGx2X2ZpbGxUb1plcm9fOV8wPSAnZmlsbFplcm8nICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo3ODE6MzogbHZfZmlsbFRvWmVyb185XzA9ICdmaWxsWmVybycKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9maWxsVG9aZXJvXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMzIsRk9MTE9XXzMyX2luX3J1bGVDaGFydExpbmUxODg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9maWxsVG9aZXJvXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRGaWxsVG9aZXJvRmlsbFplcm9LZXl3b3JkXzJfNF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJmaWxsVG9aZXJvIiwgdHJ1ZSwgImZpbGxaZXJvIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSA2IDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDE6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODAyOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgNSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydExpbmUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDUpIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDI6MTA2OiAoICh7Li4ufT8gPT4gKCAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwMzo2OiAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDUpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwNjo2OiAoey4uLn0/ID0+ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA2Ojc6IHsuLi59PyA9PiAoIChsdl9maWxsQXJlYV8xMF8wPSAnZmlsbGVkJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0TGluZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4MDY6MTY6ICggKGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjgwNzoxOiAobHZfZmlsbEFyZWFfMTBfMD0gJ2ZpbGxlZCcgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA3OjE6IChsdl9maWxsQXJlYV8xMF8wPSAnZmlsbGVkJyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODA4OjM6IGx2X2ZpbGxBcmVhXzEwXzA9ICdmaWxsZWQnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfZmlsbEFyZWFfMTBfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMzMsRk9MTE9XXzMzX2luX3J1bGVDaGFydExpbmUxOTcwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9maWxsQXJlYV8xMF8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGluZUFjY2VzcygpLmdldEZpbGxBcmVhRmlsbGVkS2V5d29yZF8yXzVfMCgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiZmlsbEFyZWEiLCB0cnVlLCAiZmlsbGVkIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDEyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkubGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0TGluZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFBpZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg0MzoxOiBlbnRyeVJ1bGVDaGFydFBpZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnRQaWU9IHJ1bGVDaGFydFBpZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0UGllKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydFBpZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NDQ6MjogKGl2X3J1bGVDaGFydFBpZT0gcnVsZUNoYXJ0UGllIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg0NToyOiBpdl9ydWxlQ2hhcnRQaWU9IHJ1bGVDaGFydFBpZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRQaWVfaW5fZW50cnlSdWxlQ2hhcnRQaWUyMDU5KTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydFBpZT1ydWxlQ2hhcnRQaWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydFBpZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydFBpZTIwNjkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRQaWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0UGllIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODUyOjE6IHJ1bGVDaGFydFBpZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3BpZScgKCAobHZfZW1wdHlfMl8wPSAnZW1wdHknICkgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0UGllKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfZW1wdHlfMl8wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTU6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdwaWUnICggKGx2X2VtcHR5XzJfMD0gJ2VtcHR5JyApICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTY6MTogKCAoKSBvdGhlcmx2XzE9ICdwaWUnICggKGx2X2VtcHR5XzJfMD0gJ2VtcHR5JyApICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODU2OjE6ICggKCkgb3RoZXJsdl8xPSAncGllJyAoIChsdl9lbXB0eV8yXzA9ICdlbXB0eScgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1NjoyOiAoKSBvdGhlcmx2XzE9ICdwaWUnICggKGx2X2VtcHR5XzJfMD0gJ2VtcHR5JyApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg1NjoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NTc6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldENoYXJ0UGllQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM0LEZPTExPV18zNF9pbl9ydWxlQ2hhcnRQaWUyMTE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBpZUFjY2VzcygpLmdldFBpZUtleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4NjY6MTogKCAobHZfZW1wdHlfMl8wPSAnZW1wdHknICkgKT8KKyAgICAgICAgICAgIGludCBhbHQxMz0yOworICAgICAgICAgICAgaW50IExBMTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTEzXzA9PTM1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODY3OjE6IChsdl9lbXB0eV8yXzA9ICdlbXB0eScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODY3OjE6IChsdl9lbXB0eV8yXzA9ICdlbXB0eScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjg2ODozOiBsdl9lbXB0eV8yXzA9ICdlbXB0eScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9lbXB0eV8yXzA9KFRva2VuKW1hdGNoKGlucHV0LDM1LEZPTExPV18zNV9pbl9ydWxlQ2hhcnRQaWUyMTMzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9lbXB0eV8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRQaWVBY2Nlc3MoKS5nZXRFbXB0eUVtcHR5S2V5d29yZF8yXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiZW1wdHkiLCB0cnVlLCAiZW1wdHkiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydFBpZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydERvbnV0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6ODg5OjE6IGVudHJ5UnVsZUNoYXJ0RG9udXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0RG9udXQ9IHJ1bGVDaGFydERvbnV0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnREb251dCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnREb251dCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OTA6MjogKGl2X3J1bGVDaGFydERvbnV0PSBydWxlQ2hhcnREb251dCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OTE6MjogaXZfcnVsZUNoYXJ0RG9udXQ9IHJ1bGVDaGFydERvbnV0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0RG9udXRfaW5fZW50cnlSdWxlQ2hhcnREb251dDIxODMpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0RG9udXQ9cnVsZUNoYXJ0RG9udXQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydERvbnV0OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0RG9udXQyMTkzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0RG9udXQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0RG9udXQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo4OTg6MTogcnVsZUNoYXJ0RG9udXQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdkb251dCcgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0RG9udXQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTAxOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnZG9udXQnICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MDI6MTogKCAoKSBvdGhlcmx2XzE9ICdkb251dCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MDI6MTogKCAoKSBvdGhlcmx2XzE9ICdkb251dCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MDI6MjogKCkgb3RoZXJsdl8xPSAnZG9udXQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkwMjoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MDM6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0QWNjZXNzKCkuZ2V0Q2hhcnREb251dEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzNixGT0xMT1dfMzZfaW5fcnVsZUNoYXJ0RG9udXQyMjM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERvbnV0QWNjZXNzKCkuZ2V0RG9udXRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0RG9udXQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRCdWJibGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MjA6MTogZW50cnlSdWxlQ2hhcnRCdWJibGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0QnViYmxlPSBydWxlQ2hhcnRCdWJibGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVDaGFydEJ1YmJsZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRCdWJibGUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTIxOjI6IChpdl9ydWxlQ2hhcnRCdWJibGU9IHJ1bGVDaGFydEJ1YmJsZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MjI6MjogaXZfcnVsZUNoYXJ0QnViYmxlPSBydWxlQ2hhcnRCdWJibGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0QnViYmxlX2luX2VudHJ5UnVsZUNoYXJ0QnViYmxlMjI3NSk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRCdWJibGU9cnVsZUNoYXJ0QnViYmxlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQ2hhcnRCdWJibGU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRCdWJibGUyMjg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0QnViYmxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEJ1YmJsZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkyOToxOiBydWxlQ2hhcnRCdWJibGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdidWJibGUnICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApICkrIHsuLi59PykgKSApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ2hhcnRCdWJibGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBsdl9tdWx0aXBsaWVyXzNfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9ncmFkaWVudF81XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfdHJhbnNwYXJlbnRfNl8wPW51bGw7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbXVsdGlwbGllclZhbHVlXzRfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzMjoyODogKCAoICgpIG90aGVybHZfMT0gJ2J1YmJsZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JyApICkgfCAoIChsdl90cmFuc3BhcmVudF82XzA9ICd0cmFuc3BhcmVudCcgKSApICkgKSApICkgKSsgey4uLn0/KSApICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MzM6MTogKCAoKSBvdGhlcmx2XzE9ICdidWJibGUnICggKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApICkrIHsuLi59PykgKSApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzMzoxOiAoICgpIG90aGVybHZfMT0gJ2J1YmJsZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JyApICkgfCAoIChsdl90cmFuc3BhcmVudF82XzA9ICd0cmFuc3BhcmVudCcgKSApICkgKSApICkgKSsgey4uLn0/KSApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTMzOjI6ICgpIG90aGVybHZfMT0gJ2J1YmJsZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JyApICkgfCAoIChsdl90cmFuc3BhcmVudF82XzA9ICd0cmFuc3BhcmVudCcgKSApICkgKSApICkgKSsgey4uLn0/KSApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjkzMzoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5MzQ6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldENoYXJ0QnViYmxlQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM3LEZPTExPV18zN19pbl9ydWxlQ2hhcnRCdWJibGUyMzMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldEJ1YmJsZUtleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NDM6MTogKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JyApICkgfCAoIChsdl90cmFuc3BhcmVudF82XzA9ICd0cmFuc3BhcmVudCcgKSApICkgKSApICkgKSsgey4uLn0/KSApICk/CisgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgIGludCBMQTE2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoKExBMTZfMD49MzggJiYgTEExNl8wPD00MCkpICkgeworICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NDU6MTogKCAoICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApICkrIHsuLi59PykgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTQ1OjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbXVsdGlwbGllcl8zXzA9ICdtdWx0aXBsaWVyJyApICkgKCAobHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlciApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKSB8ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkgKSApICkgKSApKyB7Li4ufT8pICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NDY6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbXVsdGlwbGllcl8zXzA9ICdtdWx0aXBsaWVyJyApICkgKCAobHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlciApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKSB8ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkgKSApICkgKSApKyB7Li4ufT8pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5lbnRlcihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NDk6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbXVsdGlwbGllcl8zXzA9ICdtdWx0aXBsaWVyJyApICkgKCAobHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlciApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKSB8ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkgKSApICkgKSApKyB7Li4ufT8pCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTUwOjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApICkrIHsuLi59PworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTUwOjM6ICggKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApICkrCisgICAgICAgICAgICAgICAgICAgIGludCBjbnQxNT0wOworICAgICAgICAgICAgICAgICAgICBsb29wMTU6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxNT0zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIExBMTVfMCA9PTM4ICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggTEExNV8wID49MzkgJiYgTEExNV8wPD00MCAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNT0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTUpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTI6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTUyOjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbXVsdGlwbGllcl8zXzA9ICdtdWx0aXBsaWVyJyApICkgKCAobHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlciApICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTUzOjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCkgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCdWJibGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCkiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTM6MTA4OiAoICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU0OjY6ICh7Li4ufT8gPT4gKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTc6NjogKHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU3Ojc6IHsuLi59PyA9PiAoICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCdWJibGUiLCAidHJ1ZSIpOworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk1NzoxNjogKCAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKSAoIChsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPSBydWxlTnVtYmVyICkgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTc6MTc6ICggKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKSApICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU3OjE3OiAoIChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU4OjE6IChsdl9tdWx0aXBsaWVyXzNfMD0gJ211bHRpcGxpZXInICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NTg6MTogKGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTU5OjM6IGx2X211bHRpcGxpZXJfM18wPSAnbXVsdGlwbGllcicKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfbXVsdGlwbGllcl8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDM4LEZPTExPV18zOF9pbl9ydWxlQ2hhcnRCdWJibGUyMzk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfbXVsdGlwbGllcl8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRNdWx0aXBsaWVyTXVsdGlwbGllcktleXdvcmRfMl8wXzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgIm11bHRpcGxpZXIiLCB0cnVlLCAibXVsdGlwbGllciIpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTcyOjI6ICggKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NzM6MTogKGx2X211bHRpcGxpZXJWYWx1ZV80XzA9IHJ1bGVOdW1iZXIgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjk3MzoxOiAobHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlciApCisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5NzQ6MzogbHZfbXVsdGlwbGllclZhbHVlXzRfMD0gcnVsZU51bWJlcgorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldE11bHRpcGxpZXJWYWx1ZU51bWJlclBhcnNlclJ1bGVDYWxsXzJfMF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU51bWJlcl9pbl9ydWxlQ2hhcnRCdWJibGUyNDI5KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9tdWx0aXBsaWVyVmFsdWVfNF8wPXJ1bGVOdW1iZXIoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJtdWx0aXBsaWVyVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X211bHRpcGxpZXJWYWx1ZV80XzAsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJOdW1iZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5yZXR1cm5Gcm9tU2VsZWN0aW9uKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5OTc6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTk3OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKSB8ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTk4OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRCdWJibGUiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSkiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzo5OTg6MTA4OiAoICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6OTk5OjY6ICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDAyOjY6ICh7Li4ufT8gPT4gKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMDI6Nzogey4uLn0/ID0+ICggKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKSB8ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEJ1YmJsZSIsICJ0cnVlIik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMjoxNjogKCAoIChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKSApIHwgKCAobHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnICkgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaW50IExBMTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoTEExNF8wPT0zOSkgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgaWYgKCAoTEExNF8wPT00MCkgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTQsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMDI6MTc6ICggKGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAwMjoxNzogKCAobHZfZ3JhZGllbnRfNV8wPSAnZ3JhZGllbnQnICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDAzOjE6IChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDAzOjE6IChsdl9ncmFkaWVudF81XzA9ICdncmFkaWVudCcgKQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDA0OjM6IGx2X2dyYWRpZW50XzVfMD0gJ2dyYWRpZW50JworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgbHZfZ3JhZGllbnRfNV8wPShUb2tlbiltYXRjaChpbnB1dCwzOSxGT0xMT1dfMzlfaW5fcnVsZUNoYXJ0QnViYmxlMjUwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9ncmFkaWVudF81XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRHcmFkaWVudEdyYWRpZW50S2V5d29yZF8yXzFfMF8wKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJncmFkaWVudCIsIHRydWUsICJncmFkaWVudCIpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDE4OjY6ICggKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTAxODo2OiAoIChsdl90cmFuc3BhcmVudF82XzA9ICd0cmFuc3BhcmVudCcgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMTk6MTogKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMTk6MTogKGx2X3RyYW5zcGFyZW50XzZfMD0gJ3RyYW5zcGFyZW50JyApCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwMjA6MzogbHZfdHJhbnNwYXJlbnRfNl8wPSAndHJhbnNwYXJlbnQnCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBsdl90cmFuc3BhcmVudF82XzA9KFRva2VuKW1hdGNoKGlucHV0LDQwLEZPTExPV180MF9pbl9ydWxlQ2hhcnRCdWJibGUyNTQwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X3RyYW5zcGFyZW50XzZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFRyYW5zcGFyZW50VHJhbnNwYXJlbnRLZXl3b3JkXzJfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgInRyYW5zcGFyZW50IiwgdHJ1ZSwgInRyYW5zcGFyZW50Iik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkucmV0dXJuRnJvbVNlbGVjdGlvbihncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggY250MTUgPj0gMSApIGJyZWFrIGxvb3AxNTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTUsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY250MTUrKzsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAhIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuTGVhdmUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJ1YmJsZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEJ1YmJsZSIsICJnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhbkxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCkpIik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5sZWF2ZShncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0QnViYmxlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0R2F1Z2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDU2OjE6IGVudHJ5UnVsZUNoYXJ0R2F1Z2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0R2F1Z2U9IHJ1bGVDaGFydEdhdWdlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRHYXVnZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRHYXVnZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDU3OjI6IChpdl9ydWxlQ2hhcnRHYXVnZT0gcnVsZUNoYXJ0R2F1Z2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA1ODoyOiBpdl9ydWxlQ2hhcnRHYXVnZT0gcnVsZUNoYXJ0R2F1Z2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRHYXVnZV9pbl9lbnRyeVJ1bGVDaGFydEdhdWdlMjYzNyk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRHYXVnZT1ydWxlQ2hhcnRHYXVnZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0R2F1Z2U7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRHYXVnZTI2NDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRHYXVnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRHYXVnZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNjU6MTogcnVsZUNoYXJ0R2F1Z2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdnYXVnZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSogKSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0R2F1Z2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBsdl9sYWJlbGVkXzNfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9sYWJlbFZhbHVlXzRfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9oYXNUaWNrc181XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIFRva2VuIGx2X21pblZhbHVlXzdfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfbWF4VmFsdWVfOV8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X2hhc0ludGVydmFsc18xMF8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMTE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xMz1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2ludGVydmFsc18xMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA2ODoyODogKCAoICgpIG90aGVybHZfMT0gJ2dhdWdlJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA2OToxOiAoICgpIG90aGVybHZfMT0gJ2dhdWdlJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNjk6MTogKCAoKSBvdGhlcmx2XzE9ICdnYXVnZScgKCAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSogKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDY5OjI6ICgpIG90aGVybHZfMT0gJ2dhdWdlJyAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDY5OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwNzA6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0Q2hhcnRHYXVnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfNDFfaW5fcnVsZUNoYXJ0R2F1Z2UyNjkzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0R2F1Z2VLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA3OToxOiAoICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDgxOjE6ICggKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4MToxOiAoICggKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODI6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmVudGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODU6MjogKCAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODY6MzogKCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkgfCAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkgKSApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4NjozOiAoICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkgKSB8ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkgKSApIHwgKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkgKSApKgorICAgICAgICAgICAgbG9vcDE4OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxOD00OworICAgICAgICAgICAgICAgIGludCBMQTE4XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggTEExOF8wID09NDIgJiYgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTg9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIExBMThfMCA9PTQzICYmIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuY2FuU2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE4PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBMQTE4XzAgPT00NiAmJiBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmNhblNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxOD0zOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4ODo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwODg6NDogKHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9sYWJlbGVkXzNfMD0gJ2xhYmVsJyApICkgKCAobHZfbGFiZWxWYWx1ZV80XzA9IFJVTEVfU1RSSU5HICkgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4OTo1OiB7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0R2F1Z2UiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA4OToxMDc6ICggKHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA5MDo2OiAoey4uLn0/ID0+ICggKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5zZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAwKTsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDkzOjY6ICh7Li4ufT8gPT4gKCAoIChsdl9sYWJlbGVkXzNfMD0gJ2xhYmVsJyApICkgKCAobHZfbGFiZWxWYWx1ZV80XzA9IFJVTEVfU1RSSU5HICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDkzOjc6IHsuLi59PyA9PiAoICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKSAoIChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEoKHRydWUpKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0R2F1Z2UiLCAidHJ1ZSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA5MzoxNjogKCAoIChsdl9sYWJlbGVkXzNfMD0gJ2xhYmVsJyApICkgKCAobHZfbGFiZWxWYWx1ZV80XzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTA5MzoxNzogKCAobHZfbGFiZWxlZF8zXzA9ICdsYWJlbCcgKSApICggKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwOTM6MTc6ICggKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwOTQ6MTogKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEwOTQ6MTogKGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMDk1OjM6IGx2X2xhYmVsZWRfM18wPSAnbGFiZWwnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfbGFiZWxlZF8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDQyLEZPTExPV180Ml9pbl9ydWxlQ2hhcnRHYXVnZTI3NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2xhYmVsZWRfM18wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRMYWJlbGVkTGFiZWxLZXl3b3JkXzJfMF8wXzAoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJsYWJlbGVkIiwgdHJ1ZSwgImxhYmVsIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDg6MjogKCAobHZfbGFiZWxWYWx1ZV80XzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMDk6MTogKGx2X2xhYmVsVmFsdWVfNF8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTA5OjE6IChsdl9sYWJlbFZhbHVlXzRfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMTA6MzogbHZfbGFiZWxWYWx1ZV80XzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbHZfbGFiZWxWYWx1ZV80XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlQ2hhcnRHYXVnZTI3ODcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9sYWJlbFZhbHVlXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGFiZWxWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCQkKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJsYWJlbFZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbGFiZWxWYWx1ZV80XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiU1RSSU5HIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMiA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzMzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzMzo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzQ6NTogey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0R2F1Z2UiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAxKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzNDoxMDc6ICggKHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTM1OjY6ICh7Li4ufT8gPT4gKCAoIChsdl9oYXNUaWNrc181XzA9ICdoYXNUaWNrcycgKSApIG90aGVybHZfNj0gJ21pbmltdW0nICggKGx2X21pblZhbHVlXzdfMD0gUlVMRV9JTlQgKSApIG90aGVybHZfOD0gJ21heGltdW0nICggKGx2X21heFZhbHVlXzlfMD0gUlVMRV9JTlQgKSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGdldFVub3JkZXJlZEdyb3VwSGVscGVyKCkuc2VsZWN0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSwgMSk7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzODo2OiAoey4uLn0/ID0+ICggKCAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkgKSBvdGhlcmx2XzY9ICdtaW5pbXVtJyAoIChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkgKSBvdGhlcmx2Xzg9ICdtYXhpbXVtJyAoIChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTM4Ojc6IHsuLi59PyA9PiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggISgodHJ1ZSkpICkgeworICAgICAgICAgICAgCSAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG5ldyBGYWlsZWRQcmVkaWNhdGVFeGNlcHRpb24oaW5wdXQsICJydWxlQ2hhcnRHYXVnZSIsICJ0cnVlIik7CisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTM4OjE2OiAoICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzg6MTc6ICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkgb3RoZXJsdl82PSAnbWluaW11bScgKCAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApICkgb3RoZXJsdl84PSAnbWF4aW11bScgKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExMzg6MTc6ICggKGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTM5OjE6IChsdl9oYXNUaWNrc181XzA9ICdoYXNUaWNrcycgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTEzOToxOiAobHZfaGFzVGlja3NfNV8wPSAnaGFzVGlja3MnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTQwOjM6IGx2X2hhc1RpY2tzXzVfMD0gJ2hhc1RpY2tzJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2hhc1RpY2tzXzVfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzQzX2luX3J1bGVDaGFydEdhdWdlMjg2Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfaGFzVGlja3NfNV8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRIYXNUaWNrc0hhc1RpY2tzS2V5d29yZF8yXzFfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiaGFzVGlja3MiLCB0cnVlLCAiaGFzVGlja3MiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIG90aGVybHZfNj0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVDaGFydEdhdWdlMjg5MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRNaW5pbXVtS2V5d29yZF8yXzFfMSgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTU3OjE6ICggKGx2X21pblZhbHVlXzdfMD0gUlVMRV9JTlQgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTE1ODoxOiAobHZfbWluVmFsdWVfN18wPSBSVUxFX0lOVCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTU4OjE6IChsdl9taW5WYWx1ZV83XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTU5OjM6IGx2X21pblZhbHVlXzdfMD0gUlVMRV9JTlQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBsdl9taW5WYWx1ZV83XzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSU5ULEZPTExPV19SVUxFX0lOVF9pbl9ydWxlQ2hhcnRHYXVnZTI5MDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQluZXdMZWFmTm9kZShsdl9taW5WYWx1ZV83XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldE1pblZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfMl8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJCQorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJIm1pblZhbHVlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfbWluVmFsdWVfN18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIklOVCIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCw0NSxGT0xMT1dfNDVfaW5fcnVsZUNoYXJ0R2F1Z2UyOTI1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldE1heGltdW1LZXl3b3JkXzJfMV8zKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExNzk6MTogKCAobHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMTgwOjE6IChsdl9tYXhWYWx1ZV85XzA9IFJVTEVfSU5UICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExODA6MTogKGx2X21heFZhbHVlXzlfMD0gUlVMRV9JTlQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjExODE6MzogbHZfbWF4VmFsdWVfOV8wPSBSVUxFX0lOVAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X21heFZhbHVlXzlfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XX1JVTEVfSU5UX2luX3J1bGVDaGFydEdhdWdlMjk0Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCW5ld0xlYWZOb2RlKGx2X21heFZhbHVlXzlfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TWF4VmFsdWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzJfMV80XzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkJCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkibWF4VmFsdWUiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9tYXhWYWx1ZV85XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiSU5UIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgCWNhc2UgMyA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwNDo0OiAoey4uLn0/ID0+ICggKHsuLi59PyA9PiAoICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkgb3RoZXJsdl8xMT0gJ3snICggKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApICkqIG90aGVybHZfMTM9ICd9JyApICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjA0OjQ6ICh7Li4ufT8gPT4gKCAoey4uLn0/ID0+ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjA1OjU6IHsuLi59PyA9PiAoICh7Li4ufT8gPT4gKCAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoICEgZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAyKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBuZXcgRmFpbGVkUHJlZGljYXRlRXhjZXB0aW9uKGlucHV0LCAicnVsZUNoYXJ0R2F1Z2UiLCAiZ2V0VW5vcmRlcmVkR3JvdXBIZWxwZXIoKS5jYW5TZWxlY3QoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpLCAyKSIpOworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIwNToxMDc6ICggKHsuLi59PyA9PiAoICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkgb3RoZXJsdl8xMT0gJ3snICggKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApICkqIG90aGVybHZfMTM9ICd9JyApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDY6NjogKHsuLi59PyA9PiAoICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkgb3RoZXJsdl8xMT0gJ3snICggKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApICkqIG90aGVybHZfMTM9ICd9JyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnNlbGVjdChncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRVbm9yZGVyZWRHcm91cF8yKCksIDIpOworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDk6NjogKHsuLi59PyA9PiAoICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkgb3RoZXJsdl8xMT0gJ3snICggKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApICkqIG90aGVybHZfMTM9ICd9JyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjA5Ojc6IHsuLi59PyA9PiAoICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkgb3RoZXJsdl8xMT0gJ3snICggKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApICkqIG90aGVybHZfMTM9ICd9JyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAhKCh0cnVlKSkgKSB7CisgICAgICAgICAgICAJICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbmV3IEZhaWxlZFByZWRpY2F0ZUV4Y2VwdGlvbihpbnB1dCwgInJ1bGVDaGFydEdhdWdlIiwgInRydWUiKTsKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDk6MTY6ICggKCAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkgKSBvdGhlcmx2XzExPSAneycgKCAobHZfaW50ZXJ2YWxzXzEyXzA9IHJ1bGVDaGFydEludGVydmFsICkgKSogb3RoZXJsdl8xMz0gJ30nICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjA5OjE3OiAoIChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKSApIG90aGVybHZfMTE9ICd7JyAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKiBvdGhlcmx2XzEzPSAnfScKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMDk6MTc6ICggKGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjEwOjE6IChsdl9oYXNJbnRlcnZhbHNfMTBfMD0gJ2ludGVydmFscycgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIxMDoxOiAobHZfaGFzSW50ZXJ2YWxzXzEwXzA9ICdpbnRlcnZhbHMnICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjExOjM6IGx2X2hhc0ludGVydmFsc18xMF8wPSAnaW50ZXJ2YWxzJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGx2X2hhc0ludGVydmFsc18xMF8wPShUb2tlbiltYXRjaChpbnB1dCw0NixGT0xMT1dfNDZfaW5fcnVsZUNoYXJ0R2F1Z2UzMDIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9oYXNJbnRlcnZhbHNfMTBfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SGFzSW50ZXJ2YWxzSW50ZXJ2YWxzS2V5d29yZF8yXzJfMF8wKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiaGFzSW50ZXJ2YWxzIiwgdHJ1ZSwgImludGVydmFscyIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVDaGFydEdhdWdlMzA0Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMl8yXzEoKSk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTIyODoxOiAoIChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKSApKgorICAgICAgICAgICAgCSAgICBsb29wMTc6CisgICAgICAgICAgICAJICAgIGRvIHsKKyAgICAgICAgICAgIAkgICAgICAgIGludCBhbHQxNz0yOworICAgICAgICAgICAgCSAgICAgICAgaW50IExBMTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAJICAgICAgICBpZiAoIChMQTE3XzA9PTUwKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgICAgICBhbHQxNz0xOworICAgICAgICAgICAgCSAgICAgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKKyAgICAgICAgICAgIAkgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjI5OjE6IChsdl9pbnRlcnZhbHNfMTJfMD0gcnVsZUNoYXJ0SW50ZXJ2YWwgKQorICAgICAgICAgICAgCSAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyMjk6MTogKGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbCApCisgICAgICAgICAgICAJICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjMwOjM6IGx2X2ludGVydmFsc18xMl8wPSBydWxlQ2hhcnRJbnRlcnZhbAorICAgICAgICAgICAgCSAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0SW50ZXJ2YWxzQ2hhcnRJbnRlcnZhbFBhcnNlclJ1bGVDYWxsXzJfMl8yXzAoKSk7IAorICAgICAgICAgICAgCSAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SW50ZXJ2YWxfaW5fcnVsZUNoYXJ0R2F1Z2UzMDY3KTsKKyAgICAgICAgICAgIAkgICAgCSAgICBsdl9pbnRlcnZhbHNfMTJfMD1ydWxlQ2hhcnRJbnRlcnZhbCgpOworCisgICAgICAgICAgICAJICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgICAgICAJCQkiaW50ZXJ2YWxzIiwKKyAgICAgICAgICAgIAkgICAgCSAgICAgICAgICAgICAgCQlsdl9pbnRlcnZhbHNfMTJfMCwgCisgICAgICAgICAgICAJICAgIAkgICAgICAgICAgICAgIAkJIkNoYXJ0SW50ZXJ2YWwiKTsKKyAgICAgICAgICAgIAkgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAkgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICAJICAgIGJyZWFrIGxvb3AxNzsKKyAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIAkgICAgb3RoZXJsdl8xMz0oVG9rZW4pbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzE1X2luX3J1bGVDaGFydEdhdWdlMzA4MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8zKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLnJldHVybkZyb21TZWxlY3Rpb24oZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEdhdWdlQWNjZXNzKCkuZ2V0VW5vcmRlcmVkR3JvdXBfMigpKTsKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnZXRVbm9yZGVyZWRHcm91cEhlbHBlcigpLmxlYXZlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRHYXVnZUFjY2VzcygpLmdldFVub3JkZXJlZEdyb3VwXzIoKSk7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRHYXVnZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFRyZWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjcyOjE6IGVudHJ5UnVsZUNoYXJ0VHJlZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnRUcmVlPSBydWxlQ2hhcnRUcmVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRUcmVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydFRyZWUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI3MzoyOiAoaXZfcnVsZUNoYXJ0VHJlZT0gcnVsZUNoYXJ0VHJlZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjc0OjI6IGl2X3J1bGVDaGFydFRyZWU9IHJ1bGVDaGFydFRyZWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFRyZWVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFRyZWVfaW5fZW50cnlSdWxlQ2hhcnRUcmVlMzE1Nyk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRUcmVlPXJ1bGVDaGFydFRyZWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydFRyZWU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRUcmVlMzE2Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFRyZWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0VHJlZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyODE6MTogcnVsZUNoYXJ0VHJlZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3RyZWUnICggKCAobHZfbWFwXzJfMD0gJ21hcCcgKSApIHwgKCAobHZfY29sbGFwc2libGVfM18wPSAnY29sbGFwc2libGUnICkgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydFRyZWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBsdl9tYXBfMl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X2NvbGxhcHNpYmxlXzNfMD1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI4NDoyODogKCAoICgpIG90aGVybHZfMT0gJ3RyZWUnICggKCAobHZfbWFwXzJfMD0gJ21hcCcgKSApIHwgKCAobHZfY29sbGFwc2libGVfM18wPSAnY29sbGFwc2libGUnICkgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg1OjE6ICggKCkgb3RoZXJsdl8xPSAndHJlZScgKCAoIChsdl9tYXBfMl8wPSAnbWFwJyApICkgfCAoIChsdl9jb2xsYXBzaWJsZV8zXzA9ICdjb2xsYXBzaWJsZScgKSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg1OjE6ICggKCkgb3RoZXJsdl8xPSAndHJlZScgKCAoIChsdl9tYXBfMl8wPSAnbWFwJyApICkgfCAoIChsdl9jb2xsYXBzaWJsZV8zXzA9ICdjb2xsYXBzaWJsZScgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMjg1OjI6ICgpIG90aGVybHZfMT0gJ3RyZWUnICggKCAobHZfbWFwXzJfMD0gJ21hcCcgKSApIHwgKCAobHZfY29sbGFwc2libGVfM18wPSAnY29sbGFwc2libGUnICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyODU6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI4Njo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldENoYXJ0VHJlZUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw0NyxGT0xMT1dfNDdfaW5fcnVsZUNoYXJ0VHJlZTMyMTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZUFjY2VzcygpLmdldFRyZWVLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI5NToxOiAoICggKGx2X21hcF8yXzA9ICdtYXAnICkgKSB8ICggKGx2X2NvbGxhcHNpYmxlXzNfMD0gJ2NvbGxhcHNpYmxlJyApICkgKQorICAgICAgICAgICAgaW50IGFsdDE5PTI7CisgICAgICAgICAgICBpbnQgTEExOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTlfMD09NDgpICkgeworICAgICAgICAgICAgICAgIGFsdDE5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTlfMD09NDkpICkgeworICAgICAgICAgICAgICAgIGFsdDE5PTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE5LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxOSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI5NToyOiAoIChsdl9tYXBfMl8wPSAnbWFwJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOTU6MjogKCAobHZfbWFwXzJfMD0gJ21hcCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI5NjoxOiAobHZfbWFwXzJfMD0gJ21hcCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTI5NjoxOiAobHZfbWFwXzJfMD0gJ21hcCcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEyOTc6MzogbHZfbWFwXzJfMD0gJ21hcCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9tYXBfMl8wPShUb2tlbiltYXRjaChpbnB1dCw0OCxGT0xMT1dfNDhfaW5fcnVsZUNoYXJ0VHJlZTMyMzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X21hcF8yXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0TWFwTWFwS2V5d29yZF8yXzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAibWFwIiwgdHJ1ZSwgIm1hcCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxMTo2OiAoIChsdl9jb2xsYXBzaWJsZV8zXzA9ICdjb2xsYXBzaWJsZScgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzExOjY6ICggKGx2X2NvbGxhcHNpYmxlXzNfMD0gJ2NvbGxhcHNpYmxlJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzEyOjE6IChsdl9jb2xsYXBzaWJsZV8zXzA9ICdjb2xsYXBzaWJsZScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMxMjoxOiAobHZfY29sbGFwc2libGVfM18wPSAnY29sbGFwc2libGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzEzOjM6IGx2X2NvbGxhcHNpYmxlXzNfMD0gJ2NvbGxhcHNpYmxlJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X2NvbGxhcHNpYmxlXzNfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNDksRk9MTE9XXzQ5X2luX3J1bGVDaGFydFRyZWUzMjY5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl9jb2xsYXBzaWJsZV8zXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0Q29sbGFwc2libGVDb2xsYXBzaWJsZUtleXdvcmRfMl8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldFdpdGhMYXN0Q29uc3VtZWQoY3VycmVudCwgImNvbGxhcHNpYmxlIiwgdHJ1ZSwgImNvbGxhcHNpYmxlIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRUcmVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzM0OjE6IGVudHJ5UnVsZUNoYXJ0SW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0SW50ZXJ2YWw9IHJ1bGVDaGFydEludGVydmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRJbnRlcnZhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRJbnRlcnZhbCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzM1OjI6IChpdl9ydWxlQ2hhcnRJbnRlcnZhbD0gcnVsZUNoYXJ0SW50ZXJ2YWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTMzNjoyOiBpdl9ydWxlQ2hhcnRJbnRlcnZhbD0gcnVsZUNoYXJ0SW50ZXJ2YWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEludGVydmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRJbnRlcnZhbF9pbl9lbnRyeVJ1bGVDaGFydEludGVydmFsMzMxOSk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRJbnRlcnZhbD1ydWxlQ2hhcnRJbnRlcnZhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0SW50ZXJ2YWw7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRJbnRlcnZhbDMzMjkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRJbnRlcnZhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRJbnRlcnZhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNDM6MTogcnVsZUNoYXJ0SW50ZXJ2YWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogdGhpc19DaGFydE51bWJlckludGVydmFsXzA9IHJ1bGVDaGFydE51bWJlckludGVydmFsIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ2hhcnRJbnRlcnZhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX0NoYXJ0TnVtYmVySW50ZXJ2YWxfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNDY6Mjg6ICh0aGlzX0NoYXJ0TnVtYmVySW50ZXJ2YWxfMD0gcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzQ4OjU6IHRoaXNfQ2hhcnROdW1iZXJJbnRlcnZhbF8wPSBydWxlQ2hhcnROdW1iZXJJbnRlcnZhbAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbnRlcnZhbEFjY2VzcygpLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydE51bWJlckludGVydmFsX2luX3J1bGVDaGFydEludGVydmFsMzM3NSk7CisgICAgICAgICAgICB0aGlzX0NoYXJ0TnVtYmVySW50ZXJ2YWxfMD1ydWxlQ2hhcnROdW1iZXJJbnRlcnZhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfQ2hhcnROdW1iZXJJbnRlcnZhbF8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRJbnRlcnZhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2NDoxOiBlbnRyeVJ1bGVDaGFydE51bWJlckludGVydmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVDaGFydE51bWJlckludGVydmFsPSBydWxlQ2hhcnROdW1iZXJJbnRlcnZhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM2NToyOiAoaXZfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWw9IHJ1bGVDaGFydE51bWJlckludGVydmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNjY6MjogaXZfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWw9IHJ1bGVDaGFydE51bWJlckludGVydmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWxfaW5fZW50cnlSdWxlQ2hhcnROdW1iZXJJbnRlcnZhbDM0MDkpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWw9cnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydE51bWJlckludGVydmFsOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwzNDE5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzczOjE6IHJ1bGVDaGFydE51bWJlckludGVydmFsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAndXAgdG8nICggKGx2X251bWJlckludGVydmFsVmFsdWVfMl8wPSBydWxlU2lnbmVkTnVtYmVyICkgKSAoIChsdl9udW1iZXJSYW5nZV8zXzA9IHJ1bGVDaGFydFJhbmdlRWxlbWVudCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGx2X251bWJlckludGVydmFsVmFsdWVfMl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X251bWJlclJhbmdlXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNzY6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICd1cCB0bycgKCAobHZfbnVtYmVySW50ZXJ2YWxWYWx1ZV8yXzA9IHJ1bGVTaWduZWROdW1iZXIgKSApICggKGx2X251bWJlclJhbmdlXzNfMD0gcnVsZUNoYXJ0UmFuZ2VFbGVtZW50ICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM3NzoxOiAoICgpIG90aGVybHZfMT0gJ3VwIHRvJyAoIChsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKCAobHZfbnVtYmVyUmFuZ2VfM18wPSBydWxlQ2hhcnRSYW5nZUVsZW1lbnQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM3NzoxOiAoICgpIG90aGVybHZfMT0gJ3VwIHRvJyAoIChsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKCAobHZfbnVtYmVyUmFuZ2VfM18wPSBydWxlQ2hhcnRSYW5nZUVsZW1lbnQgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM3NzoyOiAoKSBvdGhlcmx2XzE9ICd1cCB0bycgKCAobHZfbnVtYmVySW50ZXJ2YWxWYWx1ZV8yXzA9IHJ1bGVTaWduZWROdW1iZXIgKSApICggKGx2X251bWJlclJhbmdlXzNfMD0gcnVsZUNoYXJ0UmFuZ2VFbGVtZW50ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzc3OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzNzg6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw1MCxGT0xMT1dfNTBfaW5fcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwzNDY1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0VXBUb0tleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzg3OjE6ICggKGx2X251bWJlckludGVydmFsVmFsdWVfMl8wPSBydWxlU2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxMzg4OjE6IChsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMD0gcnVsZVNpZ25lZE51bWJlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjEzODg6MTogKGx2X251bWJlckludGVydmFsVmFsdWVfMl8wPSBydWxlU2lnbmVkTnVtYmVyICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTM4OTozOiBsdl9udW1iZXJJbnRlcnZhbFZhbHVlXzJfMD0gcnVsZVNpZ25lZE51bWJlcgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXROdW1iZXJJbnRlcnZhbFZhbHVlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVTaWduZWROdW1iZXJfaW5fcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwzNDg2KTsKKyAgICAgICAgICAgIGx2X251bWJlckludGVydmFsVmFsdWVfMl8wPXJ1bGVTaWduZWROdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm51bWJlckludGVydmFsVmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbnVtYmVySW50ZXJ2YWxWYWx1ZV8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlNpZ25lZE51bWJlciIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQwNToyOiAoIChsdl9udW1iZXJSYW5nZV8zXzA9IHJ1bGVDaGFydFJhbmdlRWxlbWVudCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQwNjoxOiAobHZfbnVtYmVyUmFuZ2VfM18wPSBydWxlQ2hhcnRSYW5nZUVsZW1lbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDA2OjE6IChsdl9udW1iZXJSYW5nZV8zXzA9IHJ1bGVDaGFydFJhbmdlRWxlbWVudCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0MDc6MzogbHZfbnVtYmVyUmFuZ2VfM18wPSBydWxlQ2hhcnRSYW5nZUVsZW1lbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0TnVtYmVyUmFuZ2VDaGFydFJhbmdlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRSYW5nZUVsZW1lbnRfaW5fcnVsZUNoYXJ0TnVtYmVySW50ZXJ2YWwzNTA3KTsKKyAgICAgICAgICAgIGx2X251bWJlclJhbmdlXzNfMD1ydWxlQ2hhcnRSYW5nZUVsZW1lbnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TnVtYmVySW50ZXJ2YWxSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm51bWJlclJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X251bWJlclJhbmdlXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiQ2hhcnRSYW5nZUVsZW1lbnQiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydE51bWJlckludGVydmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0RGF0YW1hcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDMxOjE6IGVudHJ5UnVsZUNoYXJ0RGF0YW1hcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0RGF0YW1hcnQ9IHJ1bGVDaGFydERhdGFtYXJ0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnREYXRhbWFydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnREYXRhbWFydCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDMyOjI6IChpdl9ydWxlQ2hhcnREYXRhbWFydD0gcnVsZUNoYXJ0RGF0YW1hcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQzMzoyOiBpdl9ydWxlQ2hhcnREYXRhbWFydD0gcnVsZUNoYXJ0RGF0YW1hcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnREYXRhbWFydF9pbl9lbnRyeVJ1bGVDaGFydERhdGFtYXJ0MzU0Myk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnREYXRhbWFydD1ydWxlQ2hhcnREYXRhbWFydCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0RGF0YW1hcnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnREYXRhbWFydDM1NTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnREYXRhbWFydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnREYXRhbWFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDA6MTogcnVsZUNoYXJ0RGF0YW1hcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ2RhdGFtYXJ0JyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApIG90aGVybHZfMj0gJ3snICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZUNoYXJ0RWxlbWVudCApICkqIG90aGVybHZfND0gJ30nICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydERhdGFtYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c18zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDQzOjI4OiAoIChvdGhlcmx2XzA9ICdkYXRhbWFydCcgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVDaGFydEVsZW1lbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ0NDoxOiAob3RoZXJsdl8wPSAnZGF0YW1hcnQnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgKCAobHZfZWxlbWVudHNfM18wPSBydWxlQ2hhcnRFbGVtZW50ICkgKSogb3RoZXJsdl80PSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDQ0OjE6IChvdGhlcmx2XzA9ICdkYXRhbWFydCcgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICd7JyAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVDaGFydEVsZW1lbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDQ6Mzogb3RoZXJsdl8wPSAnZGF0YW1hcnQnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAneycgKCAobHZfZWxlbWVudHNfM18wPSBydWxlQ2hhcnRFbGVtZW50ICkgKSogb3RoZXJsdl80PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNTEsRk9MTE9XXzUxX2luX3J1bGVDaGFydERhdGFtYXJ0MzU5MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0S2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NDg6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDQ5OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDQ5OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDUwOjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVDaGFydERhdGFtYXJ0MzYxMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldERhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDE0LEZPTExPV18xNF9pbl9ydWxlQ2hhcnREYXRhbWFydDM2MjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NjU6MTogKCAobHZfZWxlbWVudHNfM18wPSBydWxlQ2hhcnRFbGVtZW50ICkgKSoKKyAgICAgICAgICAgIGxvb3AyMDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MjA9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyMF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTIwXzA9PTMxfHxMQTIwXzA9PTUyfHxMQTIwXzA9PTU3KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MjA9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjApIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0NjY6MTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZUNoYXJ0RWxlbWVudCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNDY2OjE6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVDaGFydEVsZW1lbnQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0Njc6MzogbHZfZWxlbWVudHNfM18wPSBydWxlQ2hhcnRFbGVtZW50CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0RWxlbWVudHNDaGFydEVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0RWxlbWVudF9pbl9ydWxlQ2hhcnREYXRhbWFydDM2NDMpOworICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18zXzA9cnVsZUNoYXJ0RWxlbWVudCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0RGF0YW1hcnRSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiQ2hhcnRFbGVtZW50Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZUNoYXJ0RGF0YW1hcnQzNjU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0RGF0YW1hcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ5NToxOiBlbnRyeVJ1bGVDaGFydEVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0RWxlbWVudD0gcnVsZUNoYXJ0RWxlbWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0RWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRFbGVtZW50ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE0OTY6MjogKGl2X3J1bGVDaGFydEVsZW1lbnQ9IHJ1bGVDaGFydEVsZW1lbnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTQ5NzoyOiBpdl9ydWxlQ2hhcnRFbGVtZW50PSBydWxlQ2hhcnRFbGVtZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRFbGVtZW50X2luX2VudHJ5UnVsZUNoYXJ0RWxlbWVudDM2OTIpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0RWxlbWVudD1ydWxlQ2hhcnRFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQ2hhcnRFbGVtZW50OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0RWxlbWVudDM3MDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRFbGVtZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTA0OjE6IHJ1bGVDaGFydEVsZW1lbnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfQ2hhcnRBeGlzXzA9IHJ1bGVDaGFydEF4aXMgfCB0aGlzX0NoYXJ0TGVnZW5kXzE9IHJ1bGVDaGFydExlZ2VuZCB8IHRoaXNfQ2hhcnRIaWdobGlnaHRlcl8yPSBydWxlQ2hhcnRIaWdobGlnaHRlciApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQ2hhcnRFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfQ2hhcnRBeGlzXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19DaGFydExlZ2VuZF8xID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfQ2hhcnRIaWdobGlnaHRlcl8yID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUwNzoyODogKCAodGhpc19DaGFydEF4aXNfMD0gcnVsZUNoYXJ0QXhpcyB8IHRoaXNfQ2hhcnRMZWdlbmRfMT0gcnVsZUNoYXJ0TGVnZW5kIHwgdGhpc19DaGFydEhpZ2hsaWdodGVyXzI9IHJ1bGVDaGFydEhpZ2hsaWdodGVyICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTA4OjE6ICh0aGlzX0NoYXJ0QXhpc18wPSBydWxlQ2hhcnRBeGlzIHwgdGhpc19DaGFydExlZ2VuZF8xPSBydWxlQ2hhcnRMZWdlbmQgfCB0aGlzX0NoYXJ0SGlnaGxpZ2h0ZXJfMj0gcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTA4OjE6ICh0aGlzX0NoYXJ0QXhpc18wPSBydWxlQ2hhcnRBeGlzIHwgdGhpc19DaGFydExlZ2VuZF8xPSBydWxlQ2hhcnRMZWdlbmQgfCB0aGlzX0NoYXJ0SGlnaGxpZ2h0ZXJfMj0gcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgKQorICAgICAgICAgICAgaW50IGFsdDIxPTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgNTc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDIxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MjE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyMT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAyMSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUwOTo1OiB0aGlzX0NoYXJ0QXhpc18wPSBydWxlQ2hhcnRBeGlzCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0QXhpc1BhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRBeGlzX2luX3J1bGVDaGFydEVsZW1lbnQzNzQ5KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19DaGFydEF4aXNfMD1ydWxlQ2hhcnRBeGlzKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfQ2hhcnRBeGlzXzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTE5OjU6IHRoaXNfQ2hhcnRMZWdlbmRfMT0gcnVsZUNoYXJ0TGVnZW5kCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0RWxlbWVudEFjY2VzcygpLmdldENoYXJ0TGVnZW5kUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydExlZ2VuZF9pbl9ydWxlQ2hhcnRFbGVtZW50Mzc3Nik7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnRMZWdlbmRfMT1ydWxlQ2hhcnRMZWdlbmQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19DaGFydExlZ2VuZF8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTUyOTo1OiB0aGlzX0NoYXJ0SGlnaGxpZ2h0ZXJfMj0gcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRIaWdobGlnaHRlclBhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRIaWdobGlnaHRlcl9pbl9ydWxlQ2hhcnRFbGVtZW50MzgwMyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfQ2hhcnRIaWdobGlnaHRlcl8yPXJ1bGVDaGFydEhpZ2hsaWdodGVyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfQ2hhcnRIaWdobGlnaHRlcl8yOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRFbGVtZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0TGVnZW5kIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU0NToxOiBlbnRyeVJ1bGVDaGFydExlZ2VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnRMZWdlbmQ9IHJ1bGVDaGFydExlZ2VuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0TGVnZW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydExlZ2VuZCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTQ2OjI6IChpdl9ydWxlQ2hhcnRMZWdlbmQ9IHJ1bGVDaGFydExlZ2VuZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTQ3OjI6IGl2X3J1bGVDaGFydExlZ2VuZD0gcnVsZUNoYXJ0TGVnZW5kIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydExlZ2VuZF9pbl9lbnRyeVJ1bGVDaGFydExlZ2VuZDM4MzgpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0TGVnZW5kPXJ1bGVDaGFydExlZ2VuZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0TGVnZW5kOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0TGVnZW5kMzg0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydExlZ2VuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRMZWdlbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTU0OjE6IHJ1bGVDaGFydExlZ2VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAnbGVnZW5kJyAoIChsdl9wbGFjZW1lbnRfMV8wPSBydWxlTGVnZW5kUGxhY2VtZW50RW51bSApICkgKCAoIChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApICkgKCAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKSApICggKGx2X3RvZ2dsZVR5cGVfNF8wPSBydWxlVG9nZ2xlVHlwZUVudW0gKSApICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydExlZ2VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3RvZ2dsZV8yXzA9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfcmVwbG90XzNfMD1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3BsYWNlbWVudF8xXzAgPSBudWxsOworCisgICAgICAgIEVudW1lcmF0b3IgbHZfdG9nZ2xlVHlwZV80XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTU3OjI4OiAoIChvdGhlcmx2XzA9ICdsZWdlbmQnICggKGx2X3BsYWNlbWVudF8xXzA9IHJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtICkgKSAoICggKGx2X3RvZ2dsZV8yXzA9ICd0b2dnbGUnICkgKSAoIChsdl9yZXBsb3RfM18wPSAncmVwbG90JyApICkgKCAobHZfdG9nZ2xlVHlwZV80XzA9IHJ1bGVUb2dnbGVUeXBlRW51bSApICkgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NTg6MTogKG90aGVybHZfMD0gJ2xlZ2VuZCcgKCAobHZfcGxhY2VtZW50XzFfMD0gcnVsZUxlZ2VuZFBsYWNlbWVudEVudW0gKSApICggKCAobHZfdG9nZ2xlXzJfMD0gJ3RvZ2dsZScgKSApICggKGx2X3JlcGxvdF8zXzA9ICdyZXBsb3QnICkgKSAoIChsdl90b2dnbGVUeXBlXzRfMD0gcnVsZVRvZ2dsZVR5cGVFbnVtICkgKSApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NTg6MTogKG90aGVybHZfMD0gJ2xlZ2VuZCcgKCAobHZfcGxhY2VtZW50XzFfMD0gcnVsZUxlZ2VuZFBsYWNlbWVudEVudW0gKSApICggKCAobHZfdG9nZ2xlXzJfMD0gJ3RvZ2dsZScgKSApICggKGx2X3JlcGxvdF8zXzA9ICdyZXBsb3QnICkgKSAoIChsdl90b2dnbGVUeXBlXzRfMD0gcnVsZVRvZ2dsZVR5cGVFbnVtICkgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NTg6Mzogb3RoZXJsdl8wPSAnbGVnZW5kJyAoIChsdl9wbGFjZW1lbnRfMV8wPSBydWxlTGVnZW5kUGxhY2VtZW50RW51bSApICkgKCAoIChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApICkgKCAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKSApICggKGx2X3RvZ2dsZVR5cGVfNF8wPSBydWxlVG9nZ2xlVHlwZUVudW0gKSApICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDUyLEZPTExPV181Ml9pbl9ydWxlQ2hhcnRMZWdlbmQzODg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldExlZ2VuZEtleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTYyOjE6ICggKGx2X3BsYWNlbWVudF8xXzA9IHJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTYzOjE6IChsdl9wbGFjZW1lbnRfMV8wPSBydWxlTGVnZW5kUGxhY2VtZW50RW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1NjM6MTogKGx2X3BsYWNlbWVudF8xXzA9IHJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU2NDozOiBsdl9wbGFjZW1lbnRfMV8wPSBydWxlTGVnZW5kUGxhY2VtZW50RW51bQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0UGxhY2VtZW50TGVnZW5kUGxhY2VtZW50RW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUxlZ2VuZFBsYWNlbWVudEVudW1faW5fcnVsZUNoYXJ0TGVnZW5kMzkwNik7CisgICAgICAgICAgICBsdl9wbGFjZW1lbnRfMV8wPXJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicGxhY2VtZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3BsYWNlbWVudF8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIkxlZ2VuZFBsYWNlbWVudEVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1ODA6MjogKCAoIChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApICkgKCAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKSApICggKGx2X3RvZ2dsZVR5cGVfNF8wPSBydWxlVG9nZ2xlVHlwZUVudW0gKSApICk/CisgICAgICAgICAgICBpbnQgYWx0MjI9MjsKKyAgICAgICAgICAgIGludCBMQTIyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEyMl8wPT01MykgKSB7CisgICAgICAgICAgICAgICAgYWx0MjI9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjIpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1ODA6MzogKCAobHZfdG9nZ2xlXzJfMD0gJ3RvZ2dsZScgKSApICggKGx2X3JlcGxvdF8zXzA9ICdyZXBsb3QnICkgKSAoIChsdl90b2dnbGVUeXBlXzRfMD0gcnVsZVRvZ2dsZVR5cGVFbnVtICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU4MDozOiAoIChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTgxOjE6IChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNTgxOjE6IChsdl90b2dnbGVfMl8wPSAndG9nZ2xlJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU4MjozOiBsdl90b2dnbGVfMl8wPSAndG9nZ2xlJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X3RvZ2dsZV8yXzA9KFRva2VuKW1hdGNoKGlucHV0LDUzLEZPTExPV181M19pbl9ydWxlQ2hhcnRMZWdlbmQzOTI1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl90b2dnbGVfMl8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0VG9nZ2xlVG9nZ2xlS2V5d29yZF8yXzBfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJ0b2dnbGUiLCB0cnVlLCAidG9nZ2xlIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1OTU6MjogKCAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU5NjoxOiAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTU5NjoxOiAobHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE1OTc6MzogbHZfcmVwbG90XzNfMD0gJ3JlcGxvdCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9yZXBsb3RfM18wPShUb2tlbiltYXRjaChpbnB1dCw1NCxGT0xMT1dfNTRfaW5fcnVsZUNoYXJ0TGVnZW5kMzk1Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfcmVwbG90XzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydExlZ2VuZEFjY2VzcygpLmdldFJlcGxvdFJlcGxvdEtleXdvcmRfMl8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAicmVwbG90IiwgdHJ1ZSwgInJlcGxvdCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjEwOjI6ICggKGx2X3RvZ2dsZVR5cGVfNF8wPSBydWxlVG9nZ2xlVHlwZUVudW0gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYxMToxOiAobHZfdG9nZ2xlVHlwZV80XzA9IHJ1bGVUb2dnbGVUeXBlRW51bSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjExOjE6IChsdl90b2dnbGVUeXBlXzRfMD0gcnVsZVRvZ2dsZVR5cGVFbnVtICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjEyOjM6IGx2X3RvZ2dsZVR5cGVfNF8wPSBydWxlVG9nZ2xlVHlwZUVudW0KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0TGVnZW5kQWNjZXNzKCkuZ2V0VG9nZ2xlVHlwZVRvZ2dsZVR5cGVFbnVtRW51bVJ1bGVDYWxsXzJfMl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUb2dnbGVUeXBlRW51bV9pbl9ydWxlQ2hhcnRMZWdlbmQzOTkwKTsKKyAgICAgICAgICAgICAgICAgICAgbHZfdG9nZ2xlVHlwZV80XzA9cnVsZVRvZ2dsZVR5cGVFbnVtKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkidG9nZ2xlVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3RvZ2dsZVR5cGVfNF8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlRvZ2dsZVR5cGVFbnVtIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0TGVnZW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0SGlnaGxpZ2h0ZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjM2OjE6IGVudHJ5UnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0SGlnaGxpZ2h0ZXI9IHJ1bGVDaGFydEhpZ2hsaWdodGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRIaWdobGlnaHRlciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjM3OjI6IChpdl9ydWxlQ2hhcnRIaWdobGlnaHRlcj0gcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTYzODoyOiBpdl9ydWxlQ2hhcnRIaWdobGlnaHRlcj0gcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRIaWdobGlnaHRlcl9pbl9lbnRyeVJ1bGVDaGFydEhpZ2hsaWdodGVyNDAyOCk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRIaWdobGlnaHRlcj1ydWxlQ2hhcnRIaWdobGlnaHRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0SGlnaGxpZ2h0ZXI7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlcjQwMzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRIaWdobGlnaHRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRIaWdobGlnaHRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NDU6MTogcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ3Rvb2x0aXAnICggKGx2X2xvY2F0aW9uXzFfMD0gcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gKSApICggKCAobHZfdG9vbHRpcEFsd2F5c18yXzA9ICdhbHdheXMnICkgKT8gKCAobHZfaW5zaWRlQ2hhcnRfM18wPSAnaW5zaWRlJyApICk/ICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0SGlnaGxpZ2h0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBsdl90b29sdGlwQWx3YXlzXzJfMD1udWxsOworICAgICAgICBUb2tlbiBsdl9pbnNpZGVDaGFydF8zXzA9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9sb2NhdGlvbl8xXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjQ4OjI4OiAoIChvdGhlcmx2XzA9ICd0b29sdGlwJyAoIChsdl9sb2NhdGlvbl8xXzA9IHJ1bGVUb29sdGlwTG9jYXRpb25FbnVtICkgKSAoICggKGx2X3Rvb2x0aXBBbHdheXNfMl8wPSAnYWx3YXlzJyApICk/ICggKGx2X2luc2lkZUNoYXJ0XzNfMD0gJ2luc2lkZScgKSApPyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjQ5OjE6IChvdGhlcmx2XzA9ICd0b29sdGlwJyAoIChsdl9sb2NhdGlvbl8xXzA9IHJ1bGVUb29sdGlwTG9jYXRpb25FbnVtICkgKSAoICggKGx2X3Rvb2x0aXBBbHdheXNfMl8wPSAnYWx3YXlzJyApICk/ICggKGx2X2luc2lkZUNoYXJ0XzNfMD0gJ2luc2lkZScgKSApPyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY0OToxOiAob3RoZXJsdl8wPSAndG9vbHRpcCcgKCAobHZfbG9jYXRpb25fMV8wPSBydWxlVG9vbHRpcExvY2F0aW9uRW51bSApICkgKCAoIChsdl90b29sdGlwQWx3YXlzXzJfMD0gJ2Fsd2F5cycgKSApPyAoIChsdl9pbnNpZGVDaGFydF8zXzA9ICdpbnNpZGUnICkgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NDk6Mzogb3RoZXJsdl8wPSAndG9vbHRpcCcgKCAobHZfbG9jYXRpb25fMV8wPSBydWxlVG9vbHRpcExvY2F0aW9uRW51bSApICkgKCAoIChsdl90b29sdGlwQWx3YXlzXzJfMD0gJ2Fsd2F5cycgKSApPyAoIChsdl9pbnNpZGVDaGFydF8zXzA9ICdpbnNpZGUnICkgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCwzMSxGT0xMT1dfMzFfaW5fcnVsZUNoYXJ0SGlnaGxpZ2h0ZXI0MDc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0VG9vbHRpcEtleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjUzOjE6ICggKGx2X2xvY2F0aW9uXzFfMD0gcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE2NTQ6MTogKGx2X2xvY2F0aW9uXzFfMD0gcnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjU0OjE6IChsdl9sb2NhdGlvbl8xXzA9IHJ1bGVUb29sdGlwTG9jYXRpb25FbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY1NTozOiBsdl9sb2NhdGlvbl8xXzA9IHJ1bGVUb29sdGlwTG9jYXRpb25FbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldExvY2F0aW9uVG9vbHRpcExvY2F0aW9uRW51bUVudW1SdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRvb2x0aXBMb2NhdGlvbkVudW1faW5fcnVsZUNoYXJ0SGlnaGxpZ2h0ZXI0MDk2KTsKKyAgICAgICAgICAgIGx2X2xvY2F0aW9uXzFfMD1ydWxlVG9vbHRpcExvY2F0aW9uRW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlclJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkibG9jYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbG9jYXRpb25fMV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJUb29sdGlwTG9jYXRpb25FbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjcxOjI6ICggKCAobHZfdG9vbHRpcEFsd2F5c18yXzA9ICdhbHdheXMnICkgKT8gKCAobHZfaW5zaWRlQ2hhcnRfM18wPSAnaW5zaWRlJyApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY3MTozOiAoIChsdl90b29sdGlwQWx3YXlzXzJfMD0gJ2Fsd2F5cycgKSApPyAoIChsdl9pbnNpZGVDaGFydF8zXzA9ICdpbnNpZGUnICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY3MTozOiAoIChsdl90b29sdGlwQWx3YXlzXzJfMD0gJ2Fsd2F5cycgKSApPworICAgICAgICAgICAgaW50IGFsdDIzPTI7CisgICAgICAgICAgICBpbnQgTEEyM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMjNfMD09NTUpICkgeworICAgICAgICAgICAgICAgIGFsdDIzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDIzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjcyOjE6IChsdl90b29sdGlwQWx3YXlzXzJfMD0gJ2Fsd2F5cycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY3MjoxOiAobHZfdG9vbHRpcEFsd2F5c18yXzA9ICdhbHdheXMnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjczOjM6IGx2X3Rvb2x0aXBBbHdheXNfMl8wPSAnYWx3YXlzJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGx2X3Rvb2x0aXBBbHdheXNfMl8wPShUb2tlbiltYXRjaChpbnB1dCw1NSxGT0xMT1dfNTVfaW5fcnVsZUNoYXJ0SGlnaGxpZ2h0ZXI0MTE1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShsdl90b29sdGlwQWx3YXlzXzJfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0VG9vbHRpcEFsd2F5c0Fsd2F5c0tleXdvcmRfMl8wXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0SGlnaGxpZ2h0ZXJSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKGN1cnJlbnQsICJ0b29sdGlwQWx3YXlzIiwgdHJ1ZSwgImFsd2F5cyIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY4NjozOiAoIChsdl9pbnNpZGVDaGFydF8zXzA9ICdpbnNpZGUnICkgKT8KKyAgICAgICAgICAgIGludCBhbHQyND0yOworICAgICAgICAgICAgaW50IExBMjRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTI0XzA9PTU2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQyND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyNCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTY4NzoxOiAobHZfaW5zaWRlQ2hhcnRfM18wPSAnaW5zaWRlJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjg3OjE6IChsdl9pbnNpZGVDaGFydF8zXzA9ICdpbnNpZGUnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNjg4OjM6IGx2X2luc2lkZUNoYXJ0XzNfMD0gJ2luc2lkZScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsdl9pbnNpZGVDaGFydF8zXzA9KFRva2VuKW1hdGNoKGlucHV0LDU2LEZPTExPV181Nl9pbl9ydWxlQ2hhcnRIaWdobGlnaHRlcjQxNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGx2X2luc2lkZUNoYXJ0XzNfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkuZ2V0SW5zaWRlQ2hhcnRJbnNpZGVLZXl3b3JkXzJfMV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEhpZ2hsaWdodGVyUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAiaW5zaWRlQ2hhcnQiLCB0cnVlLCAiaW5zaWRlIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUNoYXJ0SGlnaGxpZ2h0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRBeGlzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcwOToxOiBlbnRyeVJ1bGVDaGFydEF4aXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0QXhpcz0gcnVsZUNoYXJ0QXhpcyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0QXhpcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRBeGlzID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MTA6MjogKGl2X3J1bGVDaGFydEF4aXM9IHJ1bGVDaGFydEF4aXMgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcxMToyOiBpdl9ydWxlQ2hhcnRBeGlzPSBydWxlQ2hhcnRBeGlzIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRBeGlzX2luX2VudHJ5UnVsZUNoYXJ0QXhpczQxOTgpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0QXhpcz1ydWxlQ2hhcnRBeGlzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQ2hhcnRBeGlzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0QXhpczQyMDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRBeGlzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEF4aXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzE4OjE6IHJ1bGVDaGFydEF4aXMgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ2F4aXMnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAncmVuZGVycycgKCAobHZfcmVuZGVyVHlwZV8zXzA9IHJ1bGVSZW5kZXJUeXBlRW51bSApICkgKCAobHZfc2hvcnRMYWJlbF80XzA9ICdzaG9ydExhYmVsJyApICk/IChvdGhlcmx2XzU9ICd0aWNrYW5nbGUnICggKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0QXhpcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gbHZfc2hvcnRMYWJlbF80XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfcmVuZGVyVHlwZV8zXzAgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfYW5nbGVfNl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcyMToyODogKCAob3RoZXJsdl8wPSAnYXhpcycgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICdyZW5kZXJzJyAoIChsdl9yZW5kZXJUeXBlXzNfMD0gcnVsZVJlbmRlclR5cGVFbnVtICkgKSAoIChsdl9zaG9ydExhYmVsXzRfMD0gJ3Nob3J0TGFiZWwnICkgKT8gKG90aGVybHZfNT0gJ3RpY2thbmdsZScgKCAobHZfYW5nbGVfNl8wPSBydWxlU2lnbmVkTnVtYmVyICkgKSApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTcyMjoxOiAob3RoZXJsdl8wPSAnYXhpcycgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSBvdGhlcmx2XzI9ICdyZW5kZXJzJyAoIChsdl9yZW5kZXJUeXBlXzNfMD0gcnVsZVJlbmRlclR5cGVFbnVtICkgKSAoIChsdl9zaG9ydExhYmVsXzRfMD0gJ3Nob3J0TGFiZWwnICkgKT8gKG90aGVybHZfNT0gJ3RpY2thbmdsZScgKCAobHZfYW5nbGVfNl8wPSBydWxlU2lnbmVkTnVtYmVyICkgKSApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MjI6MTogKG90aGVybHZfMD0gJ2F4aXMnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAncmVuZGVycycgKCAobHZfcmVuZGVyVHlwZV8zXzA9IHJ1bGVSZW5kZXJUeXBlRW51bSApICkgKCAobHZfc2hvcnRMYWJlbF80XzA9ICdzaG9ydExhYmVsJyApICk/IChvdGhlcmx2XzU9ICd0aWNrYW5nbGUnICggKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzIyOjM6IG90aGVybHZfMD0gJ2F4aXMnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgb3RoZXJsdl8yPSAncmVuZGVycycgKCAobHZfcmVuZGVyVHlwZV8zXzA9IHJ1bGVSZW5kZXJUeXBlRW51bSApICkgKCAobHZfc2hvcnRMYWJlbF80XzA9ICdzaG9ydExhYmVsJyApICk/IChvdGhlcmx2XzU9ICd0aWNrYW5nbGUnICggKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsNTcsRk9MTE9XXzU3X2luX3J1bGVDaGFydEF4aXM0MjQ1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBeGlzS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3MjY6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzI3OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzI3OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzI4OjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZUNoYXJ0QXhpczQyNjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldEF4aXNEYXRhbWFydEF4aXNDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzU4X2luX3J1bGVDaGFydEF4aXM0Mjc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRSZW5kZXJzS2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NDM6MTogKCAobHZfcmVuZGVyVHlwZV8zXzA9IHJ1bGVSZW5kZXJUeXBlRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc0NDoxOiAobHZfcmVuZGVyVHlwZV8zXzA9IHJ1bGVSZW5kZXJUeXBlRW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NDQ6MTogKGx2X3JlbmRlclR5cGVfM18wPSBydWxlUmVuZGVyVHlwZUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzQ1OjM6IGx2X3JlbmRlclR5cGVfM18wPSBydWxlUmVuZGVyVHlwZUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRSZW5kZXJUeXBlUmVuZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSZW5kZXJUeXBlRW51bV9pbl9ydWxlQ2hhcnRBeGlzNDI5OCk7CisgICAgICAgICAgICBsdl9yZW5kZXJUeXBlXzNfMD1ydWxlUmVuZGVyVHlwZUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc1J1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicmVuZGVyVHlwZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZW5kZXJUeXBlXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUmVuZGVyVHlwZUVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjE6MjogKCAobHZfc2hvcnRMYWJlbF80XzA9ICdzaG9ydExhYmVsJyApICk/CisgICAgICAgICAgICBpbnQgYWx0MjU9MjsKKyAgICAgICAgICAgIGludCBMQTI1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEyNV8wPT01OSkgKSB7CisgICAgICAgICAgICAgICAgYWx0MjU9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MjUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3NjI6MTogKGx2X3Nob3J0TGFiZWxfNF8wPSAnc2hvcnRMYWJlbCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc2MjoxOiAobHZfc2hvcnRMYWJlbF80XzA9ICdzaG9ydExhYmVsJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc2MzozOiBsdl9zaG9ydExhYmVsXzRfMD0gJ3Nob3J0TGFiZWwnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbHZfc2hvcnRMYWJlbF80XzA9KFRva2VuKW1hdGNoKGlucHV0LDU5LEZPTExPV181OV9pbl9ydWxlQ2hhcnRBeGlzNDMxNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUobHZfc2hvcnRMYWJlbF80XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzQWNjZXNzKCkuZ2V0U2hvcnRMYWJlbFNob3J0TGFiZWxLZXl3b3JkXzRfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRBeGlzUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZChjdXJyZW50LCAic2hvcnRMYWJlbCIsIHRydWUsICJzaG9ydExhYmVsIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzc2OjM6IChvdGhlcmx2XzU9ICd0aWNrYW5nbGUnICggKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQyNj0yOworICAgICAgICAgICAgaW50IExBMjZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTI2XzA9PTYwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyNj0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyNikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTc3Njo1OiBvdGhlcmx2XzU9ICd0aWNrYW5nbGUnICggKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDYwLEZPTExPV182MF9pbl9ydWxlQ2hhcnRBeGlzNDM0Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc0FjY2VzcygpLmdldFRpY2thbmdsZUtleXdvcmRfNV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3ODA6MTogKCAobHZfYW5nbGVfNl8wPSBydWxlU2lnbmVkTnVtYmVyICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3ODE6MTogKGx2X2FuZ2xlXzZfMD0gcnVsZVNpZ25lZE51bWJlciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxNzgxOjE6IChsdl9hbmdsZV82XzA9IHJ1bGVTaWduZWROdW1iZXIgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE3ODI6MzogbHZfYW5nbGVfNl8wPSBydWxlU2lnbmVkTnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNBY2Nlc3MoKS5nZXRBbmdsZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVTaWduZWROdW1iZXJfaW5fcnVsZUNoYXJ0QXhpczQzNjQpOworICAgICAgICAgICAgICAgICAgICBsdl9hbmdsZV82XzA9cnVsZVNpZ25lZE51bWJlcigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldENoYXJ0QXhpc1J1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJhbmdsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2FuZ2xlXzZfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJTaWduZWROdW1iZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRBeGlzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTgwNjoxOiBlbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQ2hhcnRSYW5nZUVsZW1lbnQ9IHJ1bGVDaGFydFJhbmdlRWxlbWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVDaGFydFJhbmdlRWxlbWVudCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODA3OjI6IChpdl9ydWxlQ2hhcnRSYW5nZUVsZW1lbnQ9IHJ1bGVDaGFydFJhbmdlRWxlbWVudCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODA4OjI6IGl2X3J1bGVDaGFydFJhbmdlRWxlbWVudD0gcnVsZUNoYXJ0UmFuZ2VFbGVtZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRSYW5nZUVsZW1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFJhbmdlRWxlbWVudF9pbl9lbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudDQ0MDIpOworICAgICAgICAgICAgaXZfcnVsZUNoYXJ0UmFuZ2VFbGVtZW50PXJ1bGVDaGFydFJhbmdlRWxlbWVudCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0UmFuZ2VFbGVtZW50OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUNoYXJ0UmFuZ2VFbGVtZW50NDQxMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFJhbmdlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQ2hhcnRSYW5nZUVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODE1OjE6IHJ1bGVDaGFydFJhbmdlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiB0aGlzX0NoYXJ0U2VnbWVudENvbG9yXzA9IHJ1bGVDaGFydFNlZ21lbnRDb2xvciA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0UmFuZ2VFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfQ2hhcnRTZWdtZW50Q29sb3JfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MTg6Mjg6ICh0aGlzX0NoYXJ0U2VnbWVudENvbG9yXzA9IHJ1bGVDaGFydFNlZ21lbnRDb2xvciApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MjA6NTogdGhpc19DaGFydFNlZ21lbnRDb2xvcl8wPSBydWxlQ2hhcnRTZWdtZW50Q29sb3IKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50QWNjZXNzKCkuZ2V0Q2hhcnRTZWdtZW50Q29sb3JQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFNlZ21lbnRDb2xvcl9pbl9ydWxlQ2hhcnRSYW5nZUVsZW1lbnQ0NDU4KTsKKyAgICAgICAgICAgIHRoaXNfQ2hhcnRTZWdtZW50Q29sb3JfMD1ydWxlQ2hhcnRTZWdtZW50Q29sb3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX0NoYXJ0U2VnbWVudENvbG9yXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydFJhbmdlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4MzY6MTogZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0U2VnbWVudENvbG9yPSBydWxlQ2hhcnRTZWdtZW50Q29sb3IgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlQ2hhcnRTZWdtZW50Q29sb3IgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTgzNzoyOiAoaXZfcnVsZUNoYXJ0U2VnbWVudENvbG9yPSBydWxlQ2hhcnRTZWdtZW50Q29sb3IgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTgzODoyOiBpdl9ydWxlQ2hhcnRTZWdtZW50Q29sb3I9IHJ1bGVDaGFydFNlZ21lbnRDb2xvciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQ2hhcnRTZWdtZW50Q29sb3JfaW5fZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3I0NDkyKTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydFNlZ21lbnRDb2xvcj1ydWxlQ2hhcnRTZWdtZW50Q29sb3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVDaGFydFNlZ21lbnRDb2xvcjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVDaGFydFNlZ21lbnRDb2xvcjQ1MDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQ2hhcnRTZWdtZW50Q29sb3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0U2VnbWVudENvbG9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg0NToxOiBydWxlQ2hhcnRTZWdtZW50Q29sb3IgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ3NlZ21lbnRjb2xvcicgKCAobHZfcmdiXzFfMD0gUlVMRV9TVFJJTkcgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVDaGFydFNlZ21lbnRDb2xvcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIGx2X3JnYl8xXzA9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NDg6Mjg6ICggKG90aGVybHZfMD0gJ3NlZ21lbnRjb2xvcicgKCAobHZfcmdiXzFfMD0gUlVMRV9TVFJJTkcgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODQ5OjE6IChvdGhlcmx2XzA9ICdzZWdtZW50Y29sb3InICggKGx2X3JnYl8xXzA9IFJVTEVfU1RSSU5HICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NDk6MTogKG90aGVybHZfMD0gJ3NlZ21lbnRjb2xvcicgKCAobHZfcmdiXzFfMD0gUlVMRV9TVFJJTkcgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg0OTozOiBvdGhlcmx2XzA9ICdzZWdtZW50Y29sb3InICggKGx2X3JnYl8xXzA9IFJVTEVfU1RSSU5HICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCw2MSxGT0xMT1dfNjFfaW5fcnVsZUNoYXJ0U2VnbWVudENvbG9yNDUzOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKS5nZXRTZWdtZW50Y29sb3JLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg1MzoxOiAoIChsdl9yZ2JfMV8wPSBSVUxFX1NUUklORyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg1NDoxOiAobHZfcmdiXzFfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODU0OjE6IChsdl9yZ2JfMV8wPSBSVUxFX1NUUklORyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4NTU6MzogbHZfcmdiXzFfMD0gUlVMRV9TVFJJTkcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGx2X3JnYl8xXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfU1RSSU5HLEZPTExPV19SVUxFX1NUUklOR19pbl9ydWxlQ2hhcnRTZWdtZW50Q29sb3I0NTU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQluZXdMZWFmTm9kZShsdl9yZ2JfMV8wLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0UmdiU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAJCQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFNlZ21lbnRDb2xvclJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0V2l0aExhc3RDb25zdW1lZCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInJnYiIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9yZ2JfMV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJTVFJJTkciKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRTZWdtZW50Q29sb3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQ2hhcnRJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODc5OjE6IGVudHJ5UnVsZUNoYXJ0SW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVDaGFydEltcG9ydD0gcnVsZUNoYXJ0SW1wb3J0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlQ2hhcnRJbXBvcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUNoYXJ0SW1wb3J0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4ODA6MjogKGl2X3J1bGVDaGFydEltcG9ydD0gcnVsZUNoYXJ0SW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4ODE6MjogaXZfcnVsZUNoYXJ0SW1wb3J0PSBydWxlQ2hhcnRJbXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0SW1wb3J0X2luX2VudHJ5UnVsZUNoYXJ0SW1wb3J0NDU5Nyk7CisgICAgICAgICAgICBpdl9ydWxlQ2hhcnRJbXBvcnQ9cnVsZUNoYXJ0SW1wb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQ2hhcnRJbXBvcnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRJbXBvcnQ0NjA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUNoYXJ0SW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVDaGFydEltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4ODg6MTogcnVsZUNoYXJ0SW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZUNoYXJ0SW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODkxOjI4OiAoIChvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4OTI6MTogKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4OTI6MTogKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE4OTI6Mzogb3RoZXJsdl8wPSAnaW1wb3J0JyAoIChsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDYyLEZPTExPV182Ml9pbl9ydWxlQ2hhcnRJbXBvcnQ0NjQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydEFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxODk2OjE6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg5NzoxOiAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg5NzoxOiAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTg5ODozOiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfaW5fcnVsZUNoYXJ0SW1wb3J0NDY2NSk7CisgICAgICAgICAgICBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9cnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJImltcG9ydGVkTmFtZXNwYWNlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQ2hhcnRJbXBvcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlU2lnbmVkTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkyMjoxOiBlbnRyeVJ1bGVTaWduZWROdW1iZXIgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlU2lnbmVkTnVtYmVyPSBydWxlU2lnbmVkTnVtYmVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVTaWduZWROdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlU2lnbmVkTnVtYmVyID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MjM6MjogKGl2X3J1bGVTaWduZWROdW1iZXI9IHJ1bGVTaWduZWROdW1iZXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkyNDoyOiBpdl9ydWxlU2lnbmVkTnVtYmVyPSBydWxlU2lnbmVkTnVtYmVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlU2lnbmVkTnVtYmVyX2luX2VudHJ5UnVsZVNpZ25lZE51bWJlcjQ3MDIpOworICAgICAgICAgICAgaXZfcnVsZVNpZ25lZE51bWJlcj1ydWxlU2lnbmVkTnVtYmVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlU2lnbmVkTnVtYmVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVTaWduZWROdW1iZXI0NzEzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVNpZ25lZE51bWJlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlU2lnbmVkTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkzMToxOiBydWxlU2lnbmVkTnVtYmVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6ICggKGt3PSAnLScgKT8gdGhpc19JTlRfMT0gUlVMRV9JTlQgKT8gOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVTaWduZWROdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisgICAgICAgIFRva2VuIHRoaXNfSU5UXzE9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MzQ6Mjg6ICggKCAoa3c9ICctJyApPyB0aGlzX0lOVF8xPSBSVUxFX0lOVCApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5MzU6MTogKCAoa3c9ICctJyApPyB0aGlzX0lOVF8xPSBSVUxFX0lOVCApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTM1OjE6ICggKGt3PSAnLScgKT8gdGhpc19JTlRfMT0gUlVMRV9JTlQgKT8KKyAgICAgICAgICAgIGludCBhbHQyOD0yOworICAgICAgICAgICAgaW50IExBMjhfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTI4XzA9PVJVTEVfSU5UfHxMQTI4XzA9PTYzKSApIHsKKyAgICAgICAgICAgICAgICBhbHQyOD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyOCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkzNToyOiAoa3c9ICctJyApPyB0aGlzX0lOVF8xPSBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkzNToyOiAoa3c9ICctJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mjc9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMjdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMjdfMD09NjMpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mjc9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTkzNjoyOiBrdz0gJy0nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNjNfaW5fcnVsZVNpZ25lZE51bWJlcjQ3NTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNLZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhpc19JTlRfMT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JTlQsRk9MTE9XX1JVTEVfSU5UX2luX3J1bGVTaWduZWROdW1iZXI0NzY5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQljdXJyZW50Lm1lcmdlKHRoaXNfSU5UXzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKHRoaXNfSU5UXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0U2lnbmVkTnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlU2lnbmVkTnVtYmVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTY6MTogZW50cnlSdWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTU3OjI6IChpdl9ydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPSBydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NTg6MjogaXZfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9lbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ0ODE2KTsKKyAgICAgICAgICAgIGl2X3J1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9cnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkNDgyNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5NjU6MTogcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19RdWFsaWZpZWROYW1lXzA9IHJ1bGVRdWFsaWZpZWROYW1lIChrdz0gJy4nIGt3PSAnKicgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiB0aGlzX1F1YWxpZmllZE5hbWVfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5Njg6Mjg6ICggKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTY5OjE6ICh0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5Njk6MTogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MTk3MDo1OiB0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9ydWxlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkNDg3NCk7CisgICAgICAgICAgICB0aGlzX1F1YWxpZmllZE5hbWVfMD1ydWxlUXVhbGlmaWVkTmFtZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX1F1YWxpZmllZE5hbWVfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjE5ODA6MTogKGt3PSAnLicga3c9ICcqJyApPworICAgICAgICAgICAgaW50IGFsdDI5PTI7CisgICAgICAgICAgICBpbnQgTEEyOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMjlfMD09NjQpICkgeworICAgICAgICAgICAgICAgIGFsdDI5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoxOTgxOjI6IGt3PSAnLicga3c9ICcqJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2NCxGT0xMT1dfNjRfaW5fcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDQ4OTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2NSxGT0xMT1dfNjVfaW5fcnVsZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDQ5MDYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAwMDoxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwMDE6MjogKGl2X3J1bGVUUkFOU0xBVEFCTEVTVFJJTkc9IHJ1bGVUUkFOU0xBVEFCTEVTVFJJTkcgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAwMjoyOiBpdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HPSBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFU1RSSU5HX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORzQ5NDkpOworICAgICAgICAgICAgaXZfcnVsZVRSQU5TTEFUQUJMRVNUUklORz1ydWxlVFJBTlNMQVRBQkxFU1RSSU5HKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlVFJBTlNMQVRBQkxFU1RSSU5HLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVTVFJJTkc0OTYwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRVNUUklORyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAwOToxOiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IHRoaXNfU1RSSU5HXzA9IFJVTEVfU1RSSU5HIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlVFJBTlNMQVRBQkxFU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiB0aGlzX1NUUklOR18wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDEyOjI4OiAodGhpc19TVFJJTkdfMD0gUlVMRV9TVFJJTkcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDEzOjU6IHRoaXNfU1RSSU5HXzA9IFJVTEVfU1RSSU5HCisgICAgICAgICAgICB7CisgICAgICAgICAgICB0aGlzX1NUUklOR18wPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX1NUUklORyxGT0xMT1dfUlVMRV9TVFJJTkdfaW5fcnVsZVRSQU5TTEFUQUJMRVNUUklORzQ5OTkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX1NUUklOR18wKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKHRoaXNfU1RSSU5HXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkuZ2V0U1RSSU5HVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlVFJBTlNMQVRBQkxFU1RSSU5HIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAyODoxOiBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVUUkFOU0xBVEFCTEVJRD0gcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVUUkFOU0xBVEFCTEVJRCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDI5OjI6IChpdl9ydWxlVFJBTlNMQVRBQkxFSUQ9IHJ1bGVUUkFOU0xBVEFCTEVJRCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDMwOjI6IGl2X3J1bGVUUkFOU0xBVEFCTEVJRD0gcnVsZVRSQU5TTEFUQUJMRUlEIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVJRF9pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRDUwNDQpOworICAgICAgICAgICAgaXZfcnVsZVRSQU5TTEFUQUJMRUlEPXJ1bGVUUkFOU0xBVEFCTEVJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVRSQU5TTEFUQUJMRUlELmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRDUwNTUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVRSQU5TTEFUQUJMRUlEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjAzNzoxOiBydWxlVFJBTlNMQVRBQkxFSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19JRF8wPSBSVUxFX0lEIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlVFJBTlNMQVRBQkxFSUQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIHRoaXNfSURfMD1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA0MDoyODogKHRoaXNfSURfMD0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNDE6NTogdGhpc19JRF8wPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICB0aGlzX0lEXzA9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVRSQU5TTEFUQUJMRUlENTA5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQljdXJyZW50Lm1lcmdlKHRoaXNfSURfMCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA1NjoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb249IHJ1bGVYQW5ub3RhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQW5ub3RhdGlvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDU3OjI6IChpdl9ydWxlWEFubm90YXRpb249IHJ1bGVYQW5ub3RhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDU4OjI6IGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbjUxMzgpOworICAgICAgICAgICAgaXZfcnVsZVhBbm5vdGF0aW9uPXJ1bGVYQW5ub3RhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBbm5vdGF0aW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uNTE0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDY1OjE6IHJ1bGVYQW5ub3RhdGlvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8zPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2Xzg9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50VmFsdWVQYWlyc180XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3ZhbHVlXzdfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNjg6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDY5OjE6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNjk6MTogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA2OToyOiAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNjk6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA3MDo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsNjYsRk9MTE9XXzY2X2luX3J1bGVYQW5ub3RhdGlvbjUxOTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwNzk6MTogKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDgwOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDgwOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDgxOjM6IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QW5ub3RhdGlvblR5cGVKdm1Bbm5vdGF0aW9uVHlwZUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9ydWxlWEFubm90YXRpb241MjE3KTsKKyAgICAgICAgICAgIHJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOTQ6MjogKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8KKyAgICAgICAgICAgIGludCBhbHQzMj0yOworICAgICAgICAgICAgaW50IExBMzJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTMyXzA9PTY3KSAmJiAoc3lucHJlZDFfSW50ZXJuYWxDaGFydERTTCgpKSkgeworICAgICAgICAgICAgICAgIGFsdDMyPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk0OjM6ICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA5NDozOiAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk0OjQ6ICggJygnICk9Pm90aGVybHZfMz0gJygnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCw2NyxGT0xMT1dfNjdfaW5fcnVsZVhBbm5vdGF0aW9uNTIzOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA5OToyOiAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzE9MzsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzEgPSBkZmEzMS5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOTk6MzogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIwOTk6MzogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjA5OTo0OiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk5OjQ6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMDk5OjU6ICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTA1OjE6IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEwNjozOiBsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX2luX3J1bGVYQW5ub3RhdGlvbjUyODIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEyMjoyOiAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMzA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzA9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMzBfMD09NjgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzA9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTIyOjQ6IG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzU9KFRva2VuKW1hdGNoKGlucHV0LDY4LEZPTExPV182OF9pbl9ydWxlWEFubm90YXRpb241Mjk1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMF8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEyNjoxOiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTI2OjI6ICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzMjoxOiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjEzMzozOiBsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUGFyc2VyUnVsZUNhbGxfM18xXzBfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9pbl9ydWxlWEFubm90YXRpb241MzM2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudFZhbHVlUGFpcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNTA6NjogKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTUwOjY6ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTUxOjE6IChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTUxOjE6IChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxNTI6MzogbHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFBhcnNlclJ1bGVDYWxsXzNfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfaW5fcnVsZVhBbm5vdGF0aW9uNTM2Nik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfdmFsdWVfN18wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3ZhbHVlXzdfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCw2OSxGT0xMT1dfNjlfaW5fcnVsZVhBbm5vdGF0aW9uNTM4MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MDoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxODE6MjogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE4MjoyOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjU0MTgpOworICAgICAgICAgICAgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjU0MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTg5OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgRU9iamVjdCBsdl92YWx1ZV8yXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTkyOjI4OiAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTM6MTogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTM6MTogKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApICggKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTM6MjogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE5MzoyOiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTM6MzogKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTg6NTogKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjE5ODo2OiAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIxOTg6NjogKCAoIHJ1bGVWYWxpZElEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTk5OjE6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMTk5OjE6ICggcnVsZVZhbGlkSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjAwOjM6IHJ1bGVWYWxpZElECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50SnZtT3BlcmF0aW9uQ3Jvc3NSZWZlcmVuY2VfMF8wXzBfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVmFsaWRJRF9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyNTQ5OCk7CisgICAgICAgICAgICBydWxlVmFsaWRJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3MCxGT0xMT1dfNzBfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjU1MTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIxNzozOiAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjIxODoxOiAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjE4OjE6IChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyMTk6MzogbHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRWYWx1ZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyNTUzMyk7CisgICAgICAgICAgICBsdl92YWx1ZV8yXzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X3ZhbHVlXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWUiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNDM6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNDQ6MjogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjQ1OjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NTY5KTsKKyAgICAgICAgICAgIGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0PXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NTU3OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1MjoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl85PW51bGw7CisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzVfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzcgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfMTBfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTU6Mjg6ICggKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1NjoxOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1NjoxOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApICkKKyAgICAgICAgICAgIGludCBhbHQzNz0yOworICAgICAgICAgICAgYWx0MzcgPSBkZmEzNy5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MzcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTY6MjogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1NjoyOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI1NjozOiAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTY6MzogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTY6NDogKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjU5OjU6ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTk6NjogKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNTk6NjogKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjYwOjU6IAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3MSxGT0xMT1dfNzFfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NjQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNzIsRk9MTE9XXzcyX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NTY1Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjczOjM6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM0PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEEzNF8wPj1SVUxFX0lOVCAmJiBMQTM0XzA8PVJVTEVfREVDSU1BTCl8fExBMzRfMD09MTR8fChMQTM0XzA+PTYyICYmIExBMzRfMDw9NjMpfHwoTEEzNF8wPj02NiAmJiBMQTM0XzA8PTY3KXx8KExBMzRfMD49NzEgJiYgTEEzNF8wPD03Mil8fExBMzRfMD09Nzl8fExBMzRfMD09OTV8fExBMzRfMD09OTl8fExBMzRfMD09MTA2fHxMQTM0XzA9PTEwOHx8KExBMzRfMD49MTEyICYmIExBMzRfMDw9MTE0KXx8KExBMzRfMD49MTE3ICYmIExBMzRfMDw9MTI4KXx8TEEzNF8wPT0xMzApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI3Mzo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyNzM6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjc0OjE6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI3NDoxOiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI3NTozOiBsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NTY4MCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjkxOjI6IChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMzM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMzNfMD09NjgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjkxOjQ6IG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl80PShUb2tlbiltYXRjaChpbnB1dCw2OCxGT0xMT1dfNjhfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NjkzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI5NToxOiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjI5NjoxOiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMjk2OjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIyOTc6MzogbHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzBfMV8xXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NzE0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2VsZW1lbnRzXzVfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDMzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw3MyxGT0xMT1dfNzNfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NzMwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzE4OjY6ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMTg6NjogKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMTk6NTogdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q1NzYwKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMjc6MTogKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzY9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMzZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMzZfMD09NjgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjMyNzoyOiAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMjc6MjogKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMjg6NTogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZEFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMzM6MjogKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY250MzU9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wMzU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MzU9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMzVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMzVfMD09NjgpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzMzOjQ6IG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfOT0oVG9rZW4pbWF0Y2goaW5wdXQsNjgsRk9MTE9XXzY4X2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NTc4Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzMzc6MTogKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzM4OjE6IChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzM4OjE6IChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzM5OjM6IGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDU4MDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfMTBfMD1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzEwXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggY250MzUgPj0gMSApIGJyZWFrIGxvb3AzNTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMzUsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250MzUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM2MzoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzY0OjI6IChpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzY1OjI6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTU4NDQpOworICAgICAgICAgICAgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTg1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzcyOjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfNj1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzNfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c181XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83ID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3NToyODogKCAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3NjoxOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNzY6MTogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgaW50IGFsdDQwPTI7CisgICAgICAgICAgICBhbHQ0MCA9IGRmYTQwLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3NjoyOiAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc2OjI6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzc2OjM6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3NjozOiAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3Njo0OiAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzNzk6NTogKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3OTo2OiAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM3OTo2OiAoKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzODA6NTogCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCw3MSxGT0xMT1dfNzFfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTkxOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TnVtYmVyU2lnbktleXdvcmRfMF8wXzBfMSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCw3MixGT0xMT1dfNzJfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTkzMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM5MzozOiAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQzOT0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBMzlfMD49UlVMRV9JTlQgJiYgTEEzOV8wPD1SVUxFX0RFQ0lNQUwpfHxMQTM5XzA9PTE0fHwoTEEzOV8wPj02MiAmJiBMQTM5XzA8PTYzKXx8KExBMzlfMD49NjYgJiYgTEEzOV8wPD02Nyl8fChMQTM5XzA+PTcxICYmIExBMzlfMDw9NzIpfHxMQTM5XzA9PTc5fHxMQTM5XzA9PTk1fHxMQTM5XzA9PTk5fHxMQTM5XzA9PTEwNnx8TEEzOV8wPT0xMDh8fChMQTM5XzA+PTExMiAmJiBMQTM5XzA8PTExNCl8fChMQTM5XzA+PTExNyAmJiBMQTM5XzA8PTEyOCl8fExBMzlfMD09MTMwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM5PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzOSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOTM6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyMzkzOjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjM5NDoxOiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOTQ6MTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjIzOTU6MzogbHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNTk1NSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxMToyOiAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDM4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM4PTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTM4XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTM4XzA9PTY4KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM4PTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxMTo0OiBvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsNjgsRk9MTE9XXzY4X2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTU5NjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxNToxOiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQxNjoxOiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDE2OjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0MTc6MzogbHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTU5ODkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDM4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCw3MyxGT0xMT1dfNzNfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNjAwNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0Mzk6NTogdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNjAzNCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83OyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNDU1OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NTY6MjogKGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NTc6MjogaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uNjA2OSk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb242MDc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0NjQ6MTogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbm5vdGF0aW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YRXhwcmVzc2lvbl8xID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ2NzoyODogKCAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ2ODoxOiAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0Njg6MTogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgaW50IGFsdDQxPTI7CisgICAgICAgICAgICBpbnQgTEE0MV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNDFfMD09NjYpICkgeworICAgICAgICAgICAgICAgIGFsdDQxPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTQxXzA+PVJVTEVfSU5UICYmIExBNDFfMDw9UlVMRV9ERUNJTUFMKXx8TEE0MV8wPT0xNHx8KExBNDFfMD49NjIgJiYgTEE0MV8wPD02Myl8fExBNDFfMD09Njd8fChMQTQxXzA+PTcxICYmIExBNDFfMDw9NzIpfHxMQTQxXzA9PTc5fHxMQTQxXzA9PTk1fHxMQTQxXzA9PTk5fHxMQTQxXzA9PTEwNnx8TEE0MV8wPT0xMDh8fChMQTQxXzA+PTExMiAmJiBMQTQxXzA8PTExNCl8fChMQTQxXzA+PTExNyAmJiBMQTQxXzA8PTEyOCl8fExBNDFfMD09MTMwKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0MT0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0Njk6NTogdGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25faW5fcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uNjEyNik7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfWEFubm90YXRpb25fMD1ydWxlWEFubm90YXRpb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQW5ub3RhdGlvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ3OTo1OiB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb242MTUzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19YRXhwcmVzc2lvbl8xPXJ1bGVYRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hFeHByZXNzaW9uXzE7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI0OTU6MTogZW50cnlSdWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhFeHByZXNzaW9uPSBydWxlWEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ5NjoyOiAoaXZfcnVsZVhFeHByZXNzaW9uPSBydWxlWEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjQ5NzoyOiBpdl9ydWxlWEV4cHJlc3Npb249IHJ1bGVYRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEV4cHJlc3Npb242MTg4KTsKKyAgICAgICAgICAgIGl2X3J1bGVYRXhwcmVzc2lvbj1ydWxlWEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbjYxOTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUwNDoxOiBydWxlWEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogdGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBc3NpZ25tZW50XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTA3OjI4OiAodGhpc19YQXNzaWdubWVudF8wPSBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTA5OjU6IHRoaXNfWEFzc2lnbm1lbnRfMD0gcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFzc2lnbm1lbnRfaW5fcnVsZVhFeHByZXNzaW9uNjI0NCk7CisgICAgICAgICAgICB0aGlzX1hBc3NpZ25tZW50XzA9cnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQXNzaWdubWVudF8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTI1OjE6IGVudHJ5UnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBc3NpZ25tZW50ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MjY6MjogKGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Mjc6MjogaXZfcnVsZVhBc3NpZ25tZW50PSBydWxlWEFzc2lnbm1lbnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBc3NpZ25tZW50X2luX2VudHJ5UnVsZVhBc3NpZ25tZW50NjI3OCk7CisgICAgICAgICAgICBpdl9ydWxlWEFzc2lnbm1lbnQ9cnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFzc2lnbm1lbnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFzc2lnbm1lbnQ2Mjg4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBc3NpZ25tZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQXNzaWdubWVudCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1MzQ6MTogcnVsZVhBc3NpZ25tZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl92YWx1ZV8zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YT3JFeHByZXNzaW9uXzQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzdfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Mzc6Mjg6ICggKCAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Mzg6MTogKCAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApIHwgKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTM4OjE6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkKKyAgICAgICAgICAgIGludCBhbHQ0Mz0yOworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIFJVTEVfSUQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTQzXzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNDNfMT09RU9GfHwoTEE0M18xPj1SVUxFX0lOVCAmJiBMQTQzXzE8PVJVTEVfREVDSU1BTCl8fChMQTQzXzE+PTE0ICYmIExBNDNfMTw9MTUpfHxMQTQzXzE9PTE4fHwoTEE0M18xPj02MiAmJiBMQTQzXzE8PTY1KXx8KExBNDNfMT49NjcgJiYgTEE0M18xPD02OSl8fChMQTQzXzE+PTcxICYmIExBNDNfMTw9MTAzKXx8KExBNDNfMT49MTA1ICYmIExBNDNfMTw9MTMxKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0M18xPT03MCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDMsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDExNzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBNDNfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0M18yPT03MCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0M18yPT1FT0Z8fChMQTQzXzI+PVJVTEVfSU5UICYmIExBNDNfMjw9UlVMRV9ERUNJTUFMKXx8KExBNDNfMj49MTQgJiYgTEE0M18yPD0xNSl8fExBNDNfMj09MTh8fChMQTQzXzI+PTYyICYmIExBNDNfMjw9NjUpfHwoTEE0M18yPj02NyAmJiBMQTQzXzI8PTY5KXx8KExBNDNfMj49NzEgJiYgTEE0M18yPD0xMDMpfHwoTEE0M18yPj0xMDUgJiYgTEE0M18yPD0xMzEpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NDM9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MywgMiwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE0M18zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTQzXzM9PTcwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NDM9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQzXzM9PUVPRnx8KExBNDNfMz49UlVMRV9JTlQgJiYgTEE0M18zPD1SVUxFX0RFQ0lNQUwpfHwoTEE0M18zPj0xNCAmJiBMQTQzXzM8PTE1KXx8TEE0M18zPT0xOHx8KExBNDNfMz49NjIgJiYgTEE0M18zPD02NSl8fChMQTQzXzM+PTY3ICYmIExBNDNfMzw9NjkpfHwoTEE0M18zPj03MSAmJiBMQTQzXzM8PTEwMyl8fChMQTQzXzM+PTEwNSAmJiBMQTQzXzM8PTEzMSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0Mz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQzLCAzLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBNDNfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0M180PT03MCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0M180PT1FT0Z8fChMQTQzXzQ+PVJVTEVfSU5UICYmIExBNDNfNDw9UlVMRV9ERUNJTUFMKXx8KExBNDNfND49MTQgJiYgTEE0M180PD0xNSl8fExBNDNfND09MTh8fChMQTQzXzQ+PTYyICYmIExBNDNfNDw9NjUpfHwoTEE0M180Pj02NyAmJiBMQTQzXzQ8PTY5KXx8KExBNDNfND49NzEgJiYgTEE0M180PD0xMDMpfHwoTEE0M180Pj0xMDUgJiYgTEE0M180PD0xMzEpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NDM9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MywgNCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTE5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEE0M181ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTQzXzU9PUVPRnx8KExBNDNfNT49UlVMRV9JTlQgJiYgTEE0M181PD1SVUxFX0RFQ0lNQUwpfHwoTEE0M181Pj0xNCAmJiBMQTQzXzU8PTE1KXx8TEE0M181PT0xOHx8KExBNDNfNT49NjIgJiYgTEE0M181PD02NSl8fChMQTQzXzU+PTY3ICYmIExBNDNfNTw9NjkpfHwoTEE0M181Pj03MSAmJiBMQTQzXzU8PTEwMyl8fChMQTQzXzU+PTEwNSAmJiBMQTQzXzU8PTEzMSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0Mz0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNDNfNT09NzApICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ0Mz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQzLCA1LCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0lOVDoKKyAgICAgICAgICAgIGNhc2UgUlVMRV9TVFJJTkc6CisgICAgICAgICAgICBjYXNlIFJVTEVfSEVYOgorICAgICAgICAgICAgY2FzZSBSVUxFX0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIDE0OgorICAgICAgICAgICAgY2FzZSA2MzoKKyAgICAgICAgICAgIGNhc2UgNjc6CisgICAgICAgICAgICBjYXNlIDcxOgorICAgICAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgICAgIGNhc2UgNzk6CisgICAgICAgICAgICBjYXNlIDk1OgorICAgICAgICAgICAgY2FzZSA5OToKKyAgICAgICAgICAgIGNhc2UgMTA2OgorICAgICAgICAgICAgY2FzZSAxMDg6CisgICAgICAgICAgICBjYXNlIDExMjoKKyAgICAgICAgICAgIGNhc2UgMTEzOgorICAgICAgICAgICAgY2FzZSAxMTQ6CisgICAgICAgICAgICBjYXNlIDEyMDoKKyAgICAgICAgICAgIGNhc2UgMTIxOgorICAgICAgICAgICAgY2FzZSAxMjI6CisgICAgICAgICAgICBjYXNlIDEyMzoKKyAgICAgICAgICAgIGNhc2UgMTI0OgorICAgICAgICAgICAgY2FzZSAxMjU6CisgICAgICAgICAgICBjYXNlIDEyNjoKKyAgICAgICAgICAgIGNhc2UgMTI3OgorICAgICAgICAgICAgY2FzZSAxMjg6CisgICAgICAgICAgICBjYXNlIDEzMDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDM9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Mzg6MjogKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUzODoyOiAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjUzODozOiAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1Mzg6MzogKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTM5OjU6IAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhBc3NpZ25tZW50QWN0aW9uXzBfMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NDQ6MjogKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NDU6MTogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTQ1OjE6ICggcnVsZUZlYXR1cmVDYWxsSUQgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1NDY6MzogcnVsZUZlYXR1cmVDYWxsSUQKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUZlYXR1cmVDYWxsSURfaW5fcnVsZVhBc3NpZ25tZW50NjM0Nik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVGZWF0dXJlQ2FsbElEKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wU2luZ2xlQXNzaWduX2luX3J1bGVYQXNzaWdubWVudDYzNjIpOworICAgICAgICAgICAgICAgICAgICBydWxlT3BTaW5nbGVBc3NpZ24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU2NzoxOiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTY4OjE6IChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTY4OjE6IChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU2OTozOiBsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZVhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMF8zXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBc3NpZ25tZW50X2luX3J1bGVYQXNzaWdubWVudDYzODIpOworICAgICAgICAgICAgICAgICAgICBsdl92YWx1ZV8zXzA9cnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkidmFsdWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl92YWx1ZV8zXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWEFzc2lnbm1lbnQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTg2OjY6ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTg2OjY6ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU4Nzo1OiB0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhPckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE9yRXhwcmVzc2lvbl9pbl9ydWxlWEFzc2lnbm1lbnQ2NDEyKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19YT3JFeHByZXNzaW9uXzQ9cnVsZVhPckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YT3JFeHByZXNzaW9uXzQ7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1OTU6MTogKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NDI9MjsKKyAgICAgICAgICAgICAgICAgICAgYWx0NDIgPSBkZmE0Mi5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI1OTU6MjogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNTk1OjI6ICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjU5NTozOiAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDA6NjogKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDA6NzogKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDA6NzogKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDE6NTogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MDY6MjogKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYwNzoxOiAoIHJ1bGVPcE11bHRpQXNzaWduICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjA3OjE6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYwODozOiBydWxlT3BNdWx0aUFzc2lnbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE11bHRpQXNzaWduX2luX3J1bGVYQXNzaWdubWVudDY0NjUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVPcE11bHRpQXNzaWduKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjYyMTo0OiAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjIyOjE6IChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2MjI6MTogKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjIzOjM6IGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBc3NpZ25tZW50UGFyc2VyUnVsZUNhbGxfMV8xXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFzc2lnbm1lbnRfaW5fcnVsZVhBc3NpZ25tZW50NjQ4OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfcmlnaHRPcGVyYW5kXzdfMD1ydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF83XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQXNzaWdubWVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQXNzaWdubWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NDc6MTogZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BTaW5nbGVBc3NpZ249IHJ1bGVPcFNpbmdsZUFzc2lnbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BTaW5nbGVBc3NpZ24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY0ODoyOiAoaXZfcnVsZU9wU2luZ2xlQXNzaWduPSBydWxlT3BTaW5nbGVBc3NpZ24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY0OToyOiBpdl9ydWxlT3BTaW5nbGVBc3NpZ249IHJ1bGVPcFNpbmdsZUFzc2lnbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BTaW5nbGVBc3NpZ25faW5fZW50cnlSdWxlT3BTaW5nbGVBc3NpZ242NTI4KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcFNpbmdsZUFzc2lnbj1ydWxlT3BTaW5nbGVBc3NpZ24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcFNpbmdsZUFzc2lnbi5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BTaW5nbGVBc3NpZ242NTM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFNpbmdsZUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NTY6MTogcnVsZU9wU2luZ2xlQXNzaWduIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IGt3PSAnPScgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NTk6Mjg6IChrdz0gJz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY2MToyOiBrdz0gJz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzAsRk9MTE9XXzcwX2luX3J1bGVPcFNpbmdsZUFzc2lnbjY1NzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BTaW5nbGVBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzQ6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcE11bHRpQXNzaWduID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2NzU6MjogKGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjc2OjI6IGl2X3J1bGVPcE11bHRpQXNzaWduPSBydWxlT3BNdWx0aUFzc2lnbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE11bHRpQXNzaWduX2luX2VudHJ5UnVsZU9wTXVsdGlBc3NpZ242NjE2KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcE11bHRpQXNzaWduPXJ1bGVPcE11bHRpQXNzaWduKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BNdWx0aUFzc2lnbi5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BNdWx0aUFzc2lnbjY2MjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BNdWx0aUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BNdWx0aUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2ODM6MTogcnVsZU9wTXVsdGlBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wTXVsdGlBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjg2OjI4OiAoIChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNjg3OjE6IChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY4NzoxOiAoa3c9ICcrPScgfCBrdz0gJy09JyB8IGt3PSAnKj0nIHwga3c9ICcvPScgfCBrdz0gJyU9JyB8IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApIHwgKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKSApCisgICAgICAgICAgICBpbnQgYWx0NDU9NzsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA3NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0NT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ1PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDU9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0NT01OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ1PTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDU9NzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI2ODg6Mjoga3c9ICcrPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzQsRk9MTE9XXzc0X2luX3J1bGVPcE11bHRpQXNzaWduNjY2NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjY5NToyOiBrdz0gJy09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3NSxGT0xMT1dfNzVfaW5fcnVsZU9wTXVsdGlBc3NpZ242Njg0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzAyOjI6IGt3PSAnKj0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc2LEZPTExPV183Nl9pbl9ydWxlT3BNdWx0aUFzc2lnbjY3MDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFzdGVyaXNrRXF1YWxzU2lnbktleXdvcmRfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MDk6Mjoga3c9ICcvPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzcsRk9MTE9XXzc3X2luX3J1bGVPcE11bHRpQXNzaWduNjcyMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzE2OjI6IGt3PSAnJT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc4LEZPTExPV183OF9pbl9ydWxlT3BNdWx0aUFzc2lnbjY3NDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBlcmNlbnRTaWduRXF1YWxzU2lnbktleXdvcmRfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjI6NjogKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3MjI6NjogKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzIzOjI6IGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV183OV9pbl9ydWxlT3BNdWx0aUFzc2lnbjY3NjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV183OV9pbl9ydWxlT3BNdWx0aUFzc2lnbjY3NzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDcwLEZPTExPV183MF9pbl9ydWxlT3BNdWx0aUFzc2lnbjY3ODcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzVfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NDE6NjogKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc0MTo2OiAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc0MjoyOiBrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV184MF9pbl9ydWxlT3BNdWx0aUFzc2lnbjY4MDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzQ3OjE6IChrdz0gJz4nICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ0ND0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0NF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0NF8wPT04MCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0ND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzQ4OjI6IGt3PSAnPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV184MF9pbl9ydWxlT3BNdWx0aUFzc2lnbjY4MjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfODFfaW5fcnVsZU9wTXVsdGlBc3NpZ242ODM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF82XzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE11bHRpQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhPckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzY3OjE6IGVudHJ5UnVsZVhPckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhPckV4cHJlc3Npb249IHJ1bGVYT3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWE9yRXhwcmVzc2lvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzY4OjI6IChpdl9ydWxlWE9yRXhwcmVzc2lvbj0gcnVsZVhPckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc2OToyOiBpdl9ydWxlWE9yRXhwcmVzc2lvbj0gcnVsZVhPckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE9yRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYT3JFeHByZXNzaW9uNjg3OCk7CisgICAgICAgICAgICBpdl9ydWxlWE9yRXhwcmVzc2lvbj1ydWxlWE9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhPckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE9yRXhwcmVzc2lvbjY4ODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWE9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3NzY6MTogcnVsZVhPckV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhPckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YQW5kRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzc5OjI4OiAoICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzgwOjE6ICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjc4MDoxOiAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3ODE6NTogdGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5kRXhwcmVzc2lvbl9pbl9ydWxlWE9yRXhwcmVzc2lvbjY5MzUpOworICAgICAgICAgICAgdGhpc19YQW5kRXhwcmVzc2lvbl8wPXJ1bGVYQW5kRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFuZEV4cHJlc3Npb25fMDsgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3ODk6MTogKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDQ2OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ0Nj0yOworICAgICAgICAgICAgICAgIGludCBMQTQ2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNDZfMD09ODIpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Nl8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDhfSW50ZXJuYWxDaGFydERTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzg5OjI6ICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzg5OjI6ICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3ODk6MzogKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3OTQ6NjogKCAoKSAoICggcnVsZU9wT3IgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzk0Ojc6ICgpICggKCBydWxlT3BPciApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI3OTQ6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyNzk1OjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODAwOjI6ICggKCBydWxlT3BPciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODAxOjE6ICggcnVsZU9wT3IgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgwMToxOiAoIHJ1bGVPcE9yICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODAyOjM6IHJ1bGVPcE9yCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3JfaW5fcnVsZVhPckV4cHJlc3Npb242OTg4KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wT3IoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODE1OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODE2OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjgxNjoxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODE3OjM6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbmRFeHByZXNzaW9uX2luX3J1bGVYT3JFeHByZXNzaW9uNzAxMSk7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhBbmRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhBbmRFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg0MToxOiBlbnRyeVJ1bGVPcE9yIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wT3IgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg0MjoyOiAoaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4NDM6MjogaXZfcnVsZU9wT3I9IHJ1bGVPcE9yIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3JfaW5fZW50cnlSdWxlT3BPcjcwNTApOworICAgICAgICAgICAgaXZfcnVsZU9wT3I9cnVsZU9wT3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE9yLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE9yNzA2MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE9yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE9yIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg1MDoxOiBydWxlT3BPciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJ3x8JyA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3IoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODUzOjI4OiAoa3c9ICd8fCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODU1OjI6IGt3PSAnfHwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODIsRk9MTE9XXzgyX2luX3J1bGVPcE9yNzA5OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE9yQWNjZXNzKCkuZ2V0VmVydGljYWxMaW5lVmVydGljYWxMaW5lS2V5d29yZCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BPciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4Njg6MTogZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbmRFeHByZXNzaW9uPSBydWxlWEFuZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFuZEV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg2OToyOiAoaXZfcnVsZVhBbmRFeHByZXNzaW9uPSBydWxlWEFuZEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg3MDoyOiBpdl9ydWxlWEFuZEV4cHJlc3Npb249IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFuZEV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFuZEV4cHJlc3Npb243MTM3KTsKKyAgICAgICAgICAgIGl2X3J1bGVYQW5kRXhwcmVzc2lvbj1ydWxlWEFuZEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYQW5kRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbjcxNDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFuZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbmRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg3NzoxOiBydWxlWEFuZEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4ODA6Mjg6ICggKHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg4MToxOiAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg4MToxOiAodGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg4Mjo1OiB0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbl9pbl9ydWxlWEFuZEV4cHJlc3Npb243MTk0KTsKKyAgICAgICAgICAgIHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODkwOjE6ICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wNDc6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ3PTI7CisgICAgICAgICAgICAgICAgaW50IExBNDdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0N18wPT04MykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTQ3XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkOV9JbnRlcm5hbENoYXJ0RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDc9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDcpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4OTA6MjogKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODkwOjI6ICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjg5MDozOiAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODk1OjY6ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4OTU6NzogKCkgKCAoIHJ1bGVPcEFuZCApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI4OTU6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyODk2OjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkwMToyOiAoICggcnVsZU9wQW5kICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5MDI6MTogKCBydWxlT3BBbmQgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkwMjoxOiAoIHJ1bGVPcEFuZCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkwMzozOiBydWxlT3BBbmQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEFuZF9pbl9ydWxlWEFuZEV4cHJlc3Npb243MjQ3KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wQW5kKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkxNjo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTE3OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTE3OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MjkxODozOiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYRXF1YWxpdHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fcnVsZVhBbmRFeHByZXNzaW9uNzI3MCk7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF8zXzA9cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhFcXVhbGl0eUV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDQ3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5NDI6MTogZW50cnlSdWxlT3BBbmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBbmQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk0MzoyOiAoaXZfcnVsZU9wQW5kPSBydWxlT3BBbmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk0NDoyOiBpdl9ydWxlT3BBbmQ9IHJ1bGVPcEFuZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBbmRfaW5fZW50cnlSdWxlT3BBbmQ3MzA5KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFuZD1ydWxlT3BBbmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFuZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBbmQ3MzIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5NTE6MTogcnVsZU9wQW5kIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IGt3PSAnJiYnIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTU0OjI4OiAoa3c9ICcmJicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTU2OjI6IGt3PSAnJiYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODMsRk9MTE9XXzgzX2luX3J1bGVPcEFuZDczNTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRBbXBlcnNhbmRLZXl3b3JkKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk2OToxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk3MDoyOiAoaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5NzE6MjogaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbjczOTYpOworICAgICAgICAgICAgaXZfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb249cnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb243NDA2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTc4OjE6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5ODE6Mjg6ICggKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5ODI6MTogKHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTgyOjE6ICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk4Mzo1OiB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb25faW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb243NDUzKTsKKyAgICAgICAgICAgIHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA9cnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWFJlbGF0aW9uYWxFeHByZXNzaW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzoyOTkxOjE6ICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wNDg6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ4PTI7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0OF8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsQ2hhcnREU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0OD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgODU6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDhfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMF9JbnRlcm5hbENoYXJ0RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDg9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDg2OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTQ4XzQgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTBfSW50ZXJuYWxDaGFydERTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4NzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0OF81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsQ2hhcnREU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0OD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk5MToyOiAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5OTE6MjogKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk5MTozOiAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk5Njo2OiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5OTY6NzogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6Mjk5Njo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjI5OTc6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMDI6MjogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMDM6MTogKCBydWxlT3BFcXVhbGl0eSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDAzOjE6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMDQ6MzogcnVsZU9wRXF1YWxpdHkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BFcXVhbGl0eV9pbl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbjc1MDYpOworICAgICAgICAgICAgCSAgICBydWxlT3BFcXVhbGl0eSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMTc6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDE4OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMTg6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwMTk6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb25faW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb243NTI5KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNDM6MTogZW50cnlSdWxlT3BFcXVhbGl0eSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BFcXVhbGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcEVxdWFsaXR5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNDQ6MjogKGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDQ1OjI6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEVxdWFsaXR5X2luX2VudHJ5UnVsZU9wRXF1YWxpdHk3NTY4KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEVxdWFsaXR5PXJ1bGVPcEVxdWFsaXR5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BFcXVhbGl0eS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BFcXVhbGl0eTc1NzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNTI6MTogcnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPT0nIHwga3c9ICchPScgfCBrdz0gJz09PScgfCBrdz0gJyE9PScgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDU1OjI4OiAoIChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDU2OjE6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA1NjoxOiAoa3c9ICc9PScgfCBrdz0gJyE9JyB8IGt3PSAnPT09JyB8IGt3PSAnIT09JyApCisgICAgICAgICAgICBpbnQgYWx0NDk9NDsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA4NDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDk9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0OT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ5PTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDk9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDksIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwNTc6Mjoga3c9ICc9PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODQsRk9MTE9XXzg0X2luX3J1bGVPcEVxdWFsaXR5NzYxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDY0OjI6IGt3PSAnIT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg1LEZPTExPV184NV9pbl9ydWxlT3BFcXVhbGl0eTc2MzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDcxOjI6IGt3PSAnPT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NixGT0xMT1dfODZfaW5fcnVsZU9wRXF1YWxpdHk3NjU1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMDc4OjI6IGt3PSAnIT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4NyxGT0xMT1dfODdfaW5fcnVsZU9wRXF1YWxpdHk3Njc0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wRXF1YWxpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA5MToxOiBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMwOTI6MjogKGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzA5MzoyOiBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjc3MTQpOworICAgICAgICAgICAgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjc3MjQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTAwOjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgRU9iamVjdCB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3R5cGVfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF82XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTAzOjI4OiAoICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDQ6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDQ6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMDU6NTogdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzc3MSk7CisgICAgICAgICAgICB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzExMzoxOiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICBsb29wNTA6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDUwPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA3OToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1MF8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyX0ludGVybmFsQ2hhcnREU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0yOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgODA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMl9JbnRlcm5hbENoYXJ0RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NTA9MjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDg4OgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTUwXzQgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTFfSW50ZXJuYWxDaGFydERTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDUwPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1MF81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyX0ludGVybmFsQ2hhcnREU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0yOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzExMzoyOiAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMTM6MjogKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzExMzozOiAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzExMzozOiAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTEzOjQ6ICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTE1OjU6ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMTU6NjogKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxMTU6NjogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTE2OjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDg4LEZPTExPV184OF9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzgwNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTI1OjM6ICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTI2OjE6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzEyNjoxOiAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTI3OjM6IGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1UeXBlUmVmZXJlbmNlX2luX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb243ODMwKTsKKyAgICAgICAgICAgIAkgICAgbHZfdHlwZV8zXzA9cnVsZUp2bVR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkidHlwZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTQ0OjY6ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTQ0OjY6ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0NDo3OiAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTQ0Ojc6ICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTQ0Ojg6ICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0OTo2OiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE0OTo3OiAoKSAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMxNDk6NzogKCkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTUwOjU6IAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnRBbmRTZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE1NToyOiAoICggcnVsZU9wQ29tcGFyZSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTU2OjE6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTU2OjE6ICggcnVsZU9wQ29tcGFyZSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE1NzozOiBydWxlT3BDb21wYXJlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQ29tcGFyZV9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzg5MSk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTcwOjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE3MToxOiAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTcxOjE6IChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTcyOjM6IGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNzkxNCk7CisgICAgICAgICAgICAJICAgIGx2X3JpZ2h0T3BlcmFuZF82XzA9cnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfNl8wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTk2OjE6IGVudHJ5UnVsZU9wQ29tcGFyZSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcENvbXBhcmU9IHJ1bGVPcENvbXBhcmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcENvbXBhcmUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzE5NzoyOiAoaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMTk4OjI6IGl2X3J1bGVPcENvbXBhcmU9IHJ1bGVPcENvbXBhcmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcENvbXBhcmVfaW5fZW50cnlSdWxlT3BDb21wYXJlNzk1NCk7CisgICAgICAgICAgICBpdl9ydWxlT3BDb21wYXJlPXJ1bGVPcENvbXBhcmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcENvbXBhcmUuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQ29tcGFyZTc5NjUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BDb21wYXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjA1OjE6IHJ1bGVPcENvbXBhcmUgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMDg6Mjg6ICggKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMDk6MTogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjA5OjE6IChrdz0gJz49JyB8IChrdz0gJzwnIGt3PSAnPScgKSB8IGt3PSAnPicgfCBrdz0gJzwnICkKKyAgICAgICAgICAgIGludCBhbHQ1MT00OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDgxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1MT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTUxXzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNTFfMj09RU9GfHwoTEE1MV8yPj1SVUxFX0lOVCAmJiBMQTUxXzI8PVJVTEVfREVDSU1BTCl8fExBNTFfMj09MTR8fChMQTUxXzI+PTYyICYmIExBNTFfMjw9NjMpfHxMQTUxXzI9PTY3fHwoTEE1MV8yPj03MSAmJiBMQTUxXzI8PTcyKXx8TEE1MV8yPT03OXx8TEE1MV8yPT05NXx8TEE1MV8yPT05OXx8TEE1MV8yPT0xMDZ8fExBNTFfMj09MTA4fHwoTEE1MV8yPj0xMTIgJiYgTEE1MV8yPD0xMTQpfHwoTEE1MV8yPj0xMTcgJiYgTEE1MV8yPD0xMjgpfHxMQTUxXzI9PTEzMCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDUxPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE1MV8yPT03MCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDUxPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTEsIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgwOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1MT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1MSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIxMDoyOiBrdz0gJz49JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4MSxGT0xMT1dfODFfaW5fcnVsZU9wQ29tcGFyZTgwMDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMTY6NjogKGt3PSAnPCcga3c9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjE2OjY6IChrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyMTc6Mjoga3c9ICc8JyBrdz0gJz0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV183OV9pbl9ydWxlT3BDb21wYXJlODAyMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3MCxGT0xMT1dfNzBfaW5fcnVsZU9wQ29tcGFyZTgwMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzIzMDoyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV184MF9pbl9ydWxlT3BDb21wYXJlODA1Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjM3OjI6IGt3PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzc5X2luX3J1bGVPcENvbXBhcmU4MDc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjUwOjE6IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI1MToyOiAoaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjUyOjI6IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25faW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uODExNSk7CisgICAgICAgICAgICBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uODEyNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyNTk6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjYyOjI4OiAoICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjYzOjE6ICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI2MzoxOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyNjQ6NTogdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbl9pbl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uODE3Mik7CisgICAgICAgICAgICB0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI3MjoxOiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIGxvb3A1MjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NTI9MjsKKyAgICAgICAgICAgICAgICBhbHQ1MiA9IGRmYTUyLnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NTIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyNzI6MjogKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI3MjoyOiAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjcyOjM6ICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjc3OjY6ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI3Nzo3OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjc3Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI3ODo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjgzOjI6ICggKCBydWxlT3BPdGhlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjg0OjE6ICggcnVsZU9wT3RoZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzI4NDoxOiAoIHJ1bGVPcE90aGVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjg1OjM6IHJ1bGVPcE90aGVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE90aGVyX2luX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb244MjI1KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMjk4OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyOTk6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMyOTk6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzAwOjM6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjgyNDgpOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFkZGl0aXZlRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzMyNDoxOiBlbnRyeVJ1bGVPcE90aGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wT3RoZXIgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzMyNToyOiAoaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzMjY6MjogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3RoZXJfaW5fZW50cnlSdWxlT3BPdGhlcjgyODcpOworICAgICAgICAgICAgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE90aGVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE90aGVyODI5OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzMzMzoxOiBydWxlT3BPdGhlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzM2OjI4OiAoIChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzMzNzoxOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzM3OjE6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApCisgICAgICAgICAgICBpbnQgYWx0NTU9OTsKKyAgICAgICAgICAgIGFsdDU1ID0gZGZhNTUucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDU1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzM4OjI6IGt3PSAnLT4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDg5LEZPTExPV184OV9pbl9ydWxlT3BPdGhlcjgzMzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM0NToyOiBrdz0gJy4uPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTAsRk9MTE9XXzkwX2luX3J1bGVPcE90aGVyODM1NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNTE6NjogKGt3PSAnPicga3c9ICcuLicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM1MTo2OiAoa3c9ICc+JyBrdz0gJy4uJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM1MjoyOiBrdz0gJz4nIGt3PSAnLi4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV184MF9pbl9ydWxlT3BPdGhlcjgzNzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDkxLEZPTExPV185MV9pbl9ydWxlT3BPdGhlcjgzODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzJfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNjU6Mjoga3c9ICcuLicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTEsRk9MTE9XXzkxX2luX3J1bGVPcE90aGVyODQwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNzI6Mjoga3c9ICc9PicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzkyX2luX3J1bGVPcE90aGVyODQyNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNzg6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzNzg6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzc5OjI6IGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDgwLEZPTExPV184MF9pbl9ydWxlT3BPdGhlcjg0NDcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzg0OjE6ICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NTM9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTNfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNTNfMD09ODApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNTNfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTUzXzE9PUVPRnx8KExBNTNfMT49UlVMRV9JTlQgJiYgTEE1M18xPD1SVUxFX0RFQ0lNQUwpfHxMQTUzXzE9PTE0fHwoTEE1M18xPj02MiAmJiBMQTUzXzE8PTYzKXx8TEE1M18xPT02N3x8KExBNTNfMT49NzEgJiYgTEE1M18xPD03Mil8fExBNTNfMT09Nzl8fExBNTNfMT09OTV8fExBNTNfMT09OTl8fExBNTNfMT09MTA2fHxMQTUzXzE9PTEwOHx8KExBNTNfMT49MTEyICYmIExBNTNfMTw9MTE0KXx8KExBNTNfMT49MTE3ICYmIExBNTNfMTw9MTI4KXx8TEE1M18xPT0xMzApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDUzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBNTNfMT09ODApICYmIChzeW5wcmVkMTRfSW50ZXJuYWxDaGFydERTTCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDUzPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUzLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDUzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM4NDoyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzM4NDoyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzg0OjM6ICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjMzODg6NTogKGt3PSAnPicga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozMzg5OjI6IGt3PSAnPicga3c9ICc+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODAsRk9MTE9XXzgwX2luX3J1bGVPcE90aGVyODQ3OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsODAsRk9MTE9XXzgwX2luX3J1bGVPcE90aGVyODQ5MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQwMjoyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw4MCxGT0xMT1dfODBfaW5fcnVsZU9wT3RoZXI4NTEyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0MDg6NjogKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQwODo2OiAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQwOToyOiBrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDc5LEZPTExPV183OV9pbl9ydWxlT3BPdGhlcjg1MzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNDE0OjE6ICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ1ND0zOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE1NF8wPT03OSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NF8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNV9JbnRlcm5hbENoYXJ0RFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU0PTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKHRydWUpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU0PTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDU0LCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE1NF8wPT05MikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1ND0zOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNTQsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQxNDoyOiAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQxNDoyOiAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNDE0OjM6ICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxDaGFydERTTC5nOjM0MTg6NTogKGt3PSAnPCcga3c9ICc8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNDE5OjI6IGt3PSAnPCcga3c9ICc8JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzc5X2luX3J1bGVPcE90aGVyODU2NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNzksRk9MTE9XXzc5X2luX3J1bGVPcE90aGVyODU3OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF82XzFfMF8wXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQzMjoyOiBrdz0gJzwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw3OSxGT0xMT1dfNzlfaW5fcnVsZU9wT3RoZXI4NTk5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQzOToyOiBrdz0gJz0+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsOTIsRk9MTE9XXzkyX2luX3J1bGVPcE90aGVyODYxOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgOCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbENoYXJ0RFNMLmc6MzQ0NjoyOiBrdz0gJzw+JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw5MyxGT0xMT1dfOTNfaW5fcnVsZU9wT3RoZXI4NjM5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzcoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA5IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQ2hhcnREU0wuZzozNDUzOjI6IGt3PSAnPzonCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDk0LEZPTExPV185NF9pbl9ydWxlT3BPdGhlcjg2NTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3NlcmlhbGl6ZXIvQ2hhcnREU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2VyaWFsaXplci9DaGFydERTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM5NzljMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3NlcmlhbGl6ZXIvQ2hhcnREU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhCkBAIC0wLDAgKzEsMTY1NyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcmlhbGl6ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxJbXBvcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLk9TQlBUeXBlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0QmFyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERhdGFtYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREb251dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEhpZ2hsaWdodGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnROdW1iZXJJbnRlcnZhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGllOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRTZWdtZW50Q29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zZXJ2aWNlcy5DaGFydERTTEdyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZvcm1hbFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtSW5uZXJUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1Mb3dlckJvdW5kOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVXBwZXJCb3VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5UeXBlc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hY2NlcHRvci5JU2VtYW50aWNTZXF1ZW5jZUFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYWNjZXB0b3IuU2VxdWVuY2VGZWVkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5kaWFnbm9zdGljLklTZW1hbnRpY1NlcXVlbmNlckRpYWdub3N0aWNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmRpYWdub3N0aWMuSVNlcmlhbGl6YXRpb25EaWFnbm9zdGljLkFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLkdlbmVyaWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVNlbWFudGljTm9kZVByb3ZpZGVyLklOb2Rlc0ZvckVPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JU2VtYW50aWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVRyYW5zaWVudFZhbHVlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5JVHJhbnNpZW50VmFsdWVTZXJ2aWNlLlZhbHVlVHJhbnNpZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhBc3NpZ25tZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCYXNpY0Zvckxvb3BFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCaW5hcnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEJsb2NrRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQm9vbGVhbkxpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENhc2VQYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXN0ZWRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXRjaENsYXVzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2xvc3VyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ29uc3RydWN0b3JDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhEb1doaWxlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YRmVhdHVyZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEZvckxvb3BFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhJZkV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEluc3RhbmNlT2ZFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhMaXN0TGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTWVtYmVyRmVhdHVyZUNhbGw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWE51bGxMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhOdW1iZXJMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhQb3N0Zml4T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhSZXR1cm5FeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTZXRMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTdHJpbmdMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTd2l0Y2hFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhTeW5jaHJvbml6ZWRFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUaHJvd0V4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFR5cGVMaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhVbmFyeU9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVmFyaWFibGVEZWNsYXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YV2hpbGVFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhiYXNlUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5zZXJpYWxpemVyLlhiYXNlV2l0aEFubm90YXRpb25zU2VtYW50aWNTZXF1ZW5jZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMueEFubm90YXRpb25zLlhBbm5vdGF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMueEFubm90YXRpb25zLlhBbm5vdGF0aW9uc1BhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEZ1bmN0aW9uVHlwZVJlZjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YSW1wb3J0RGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEltcG9ydFNlY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWHR5cGVQYWNrYWdlOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBDaGFydERTTFNlbWFudGljU2VxdWVuY2VyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNTZW1hbnRpY1NlcXVlbmNlciB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBDaGFydERTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwdWJsaWMgdm9pZCBjcmVhdGVTZXF1ZW5jZShFT2JqZWN0IGNvbnRleHQsIEVPYmplY3Qgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBDaGFydERTTFBhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydChjb250ZXh0LCAoQ2hhcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9BWElTOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEF4aXNSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0QXhpcyhjb250ZXh0LCAoQ2hhcnRBeGlzKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfQkFSOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEJhclJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydEJhcihjb250ZXh0LCAoQ2hhcnRCYXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9CVUJCTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0QnViYmxlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0QnViYmxlKGNvbnRleHQsIChDaGFydEJ1YmJsZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0RBVEFNQVJUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydERhdGFtYXJ0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0RGF0YW1hcnQoY29udGV4dCwgKENoYXJ0RGF0YW1hcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9ET05VVDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnREb251dFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE9wdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydERvbnV0KGNvbnRleHQsIChDaGFydERvbnV0KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfR0FVR0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0R2F1Z2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRPcHRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQ2hhcnRHYXVnZShjb250ZXh0LCAoQ2hhcnRHYXVnZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX0hJR0hMSUdIVEVSOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRIaWdobGlnaHRlclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydEhpZ2hsaWdodGVyKGNvbnRleHQsIChDaGFydEhpZ2hsaWdodGVyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTEVHRU5EOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEVsZW1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMZWdlbmRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQ2hhcnRMZWdlbmQoY29udGV4dCwgKENoYXJ0TGVnZW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTElORToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRMaW5lUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0TGluZShjb250ZXh0LCAoQ2hhcnRMaW5lKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBDaGFydERTTFBhY2thZ2UuQ0hBUlRfTU9ERUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0TW9kZWxSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQ2hhcnRNb2RlbChjb250ZXh0LCAoQ2hhcnRNb2RlbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX05VTUJFUl9JTlRFUlZBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbnRlcnZhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0TnVtYmVySW50ZXJ2YWwoY29udGV4dCwgKENoYXJ0TnVtYmVySW50ZXJ2YWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QQUNLQUdFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydFBhY2thZ2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQ2hhcnRQYWNrYWdlKGNvbnRleHQsIChDaGFydFBhY2thZ2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIENoYXJ0RFNMUGFja2FnZS5DSEFSVF9QSUU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGllUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0UGllKGNvbnRleHQsIChDaGFydFBpZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1NFR01FTlRfQ09MT1I6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0UmFuZ2VFbGVtZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0U2VnbWVudENvbG9yUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0NoYXJ0U2VnbWVudENvbG9yKGNvbnRleHQsIChDaGFydFNlZ21lbnRDb2xvcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQ2hhcnREU0xQYWNrYWdlLkNIQVJUX1RSRUU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0T3B0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldENoYXJ0VHJlZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydFRyZWUoY29udGV4dCwgKENoYXJ0VHJlZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IE9TQlBUeXBlc1BhY2thZ2UuZUlOU1RBTkNFKSBzd2l0Y2goc2VtYW50aWNPYmplY3QuZUNsYXNzKCkuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgT1NCUFR5cGVzUGFja2FnZS5MSU1QT1JUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRDaGFydEltcG9ydFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9DaGFydEltcG9ydChjb250ZXh0LCAoTEltcG9ydCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0ZPUk1BTF9QQVJBTUVURVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRnVsbEp2bUZvcm1hbFBhcmFtZXRlcihjb250ZXh0LCAoSnZtRm9ybWFsUGFyYW1ldGVyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtRm9ybWFsUGFyYW1ldGVyKGNvbnRleHQsIChKdm1Gb3JtYWxQYXJhbWV0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fR0VORVJJQ19BUlJBWV9UWVBFX1JFRkVSRU5DRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1UeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0lOTkVSX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1Jbm5lclR5cGVSZWZlcmVuY2VPdXRlckFjdGlvbl8xXzRfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlQ29tcG9uZW50VHlwZUFjdGlvbl8wXzFfMF8wKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoY29udGV4dCwgKEp2bUlubmVyVHlwZVJlZmVyZW5jZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9MT1dFUl9CT1VORDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bUxvd2VyQm91bmRBbmRlZChjb250ZXh0LCAoSnZtTG93ZXJCb3VuZCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1Mb3dlckJvdW5kKGNvbnRleHQsIChKdm1Mb3dlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1BBUkFNRVRFUklaRURfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fVFlQRV9QQVJBTUVURVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtVHlwZVBhcmFtZXRlcihjb250ZXh0LCAoSnZtVHlwZVBhcmFtZXRlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9VUFBFUl9CT1VORDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVVwcGVyQm91bmRBbmRlZChjb250ZXh0LCAoSnZtVXBwZXJCb3VuZCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1VcHBlckJvdW5kKGNvbnRleHQsIChKdm1VcHBlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1dJTERDQVJEX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWEFubm90YXRpb25zUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBYQW5ub3RhdGlvbnNQYWNrYWdlLlhBTk5PVEFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uKGNvbnRleHQsIChYQW5ub3RhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWEFubm90YXRpb25zUGFja2FnZS5YQU5OT1RBVElPTl9FTEVNRU5UX1ZBTFVFX1BBSVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoY29udGV4dCwgKFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IFhiYXNlUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEFTU0lHTk1FTlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQXNzaWdubWVudF9YTWVtYmVyRmVhdHVyZUNhbGwoY29udGV4dCwgKFhBc3NpZ25tZW50KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJBU0lDX0ZPUl9MT09QX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQmFzaWNGb3JMb29wRXhwcmVzc2lvbihjb250ZXh0LCAoWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQklOQVJZX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBZGRpdGl2ZUV4cHJlc3Npb25fWEFuZEV4cHJlc3Npb25fWEFzc2lnbm1lbnRfWEVxdWFsaXR5RXhwcmVzc2lvbl9YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX1hPckV4cHJlc3Npb25fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX1hSZWxhdGlvbmFsRXhwcmVzc2lvbihjb250ZXh0LCAoWEJpbmFyeU9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCTE9DS19FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQmxvY2tFeHByZXNzaW9uKGNvbnRleHQsIChYQmxvY2tFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRXhwcmVzc2lvbkluQ2xvc3VyZShjb250ZXh0LCAoWEJsb2NrRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCT09MRUFOX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEJvb2xlYW5MaXRlcmFsKGNvbnRleHQsIChYQm9vbGVhbkxpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FTRV9QQVJUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENhc2VQYXJ0KGNvbnRleHQsIChYQ2FzZVBhcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FTVEVEX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2FzdGVkRXhwcmVzc2lvbihjb250ZXh0LCAoWENhc3RlZEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FUQ0hfQ0xBVVNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENhdGNoQ2xhdXNlKGNvbnRleHQsIChYQ2F0Y2hDbGF1c2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0xPU1VSRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDbG9zdXJlKGNvbnRleHQsIChYQ2xvc3VyZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU2hvcnRDbG9zdXJlKGNvbnRleHQsIChYQ2xvc3VyZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDT05TVFJVQ1RPUl9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ29uc3RydWN0b3JDYWxsKGNvbnRleHQsIChYQ29uc3RydWN0b3JDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWERPX1dISUxFX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWERvV2hpbGVFeHByZXNzaW9uKGNvbnRleHQsIChYRG9XaGlsZUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRkVBVFVSRV9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hGZWF0dXJlQ2FsbChjb250ZXh0LCAoWEZlYXR1cmVDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEZPUl9MT09QX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZvckxvb3BFeHByZXNzaW9uKGNvbnRleHQsIChYRm9yTG9vcEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YSUZfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWElmRXhwcmVzc2lvbihjb250ZXh0LCAoWElmRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhJTlNUQU5DRV9PRl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFJlbGF0aW9uYWxFeHByZXNzaW9uKGNvbnRleHQsIChYSW5zdGFuY2VPZkV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTElTVF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX1hMaXN0TGl0ZXJhbChjb250ZXh0LCAoWExpc3RMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTUVNQkVSX0ZFQVRVUkVfQ0FMTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hNZW1iZXJGZWF0dXJlQ2FsbChjb250ZXh0LCAoWE1lbWJlckZlYXR1cmVDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWE5VTExfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YTnVsbExpdGVyYWwoY29udGV4dCwgKFhOdWxsTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhOVU1CRVJfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hOdW1iZXJMaXRlcmFsKGNvbnRleHQsIChYTnVtYmVyTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhQT1NURklYX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hQb3N0Zml4T3BlcmF0aW9uKGNvbnRleHQsIChYUG9zdGZpeE9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhSRVRVUk5fRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hSZXR1cm5FeHByZXNzaW9uKGNvbnRleHQsIChYUmV0dXJuRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTRVRfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU2V0TGl0ZXJhbChjb250ZXh0LCAoWFNldExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1RSSU5HX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3RyaW5nTGl0ZXJhbChjb250ZXh0LCAoWFN0cmluZ0xpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1dJVENIX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3dpdGNoRXhwcmVzc2lvbihjb250ZXh0LCAoWFN3aXRjaEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1lOQ0hST05JWkVEX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3luY2hyb25pemVkRXhwcmVzc2lvbihjb250ZXh0LCAoWFN5bmNocm9uaXplZEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YVEhST1dfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFRocm93RXhwcmVzc2lvbihjb250ZXh0LCAoWFRocm93RXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhUUllfQ0FUQ0hfRklOQUxMWV9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oY29udGV4dCwgKFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFRZUEVfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVHlwZUxpdGVyYWwoY29udGV4dCwgKFhUeXBlTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhVTkFSWV9PUEVSQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVW5hcnlPcGVyYXRpb24oY29udGV4dCwgKFhVbmFyeU9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhWQVJJQUJMRV9ERUNMQVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hWYXJpYWJsZURlY2xhcmF0aW9uKGNvbnRleHQsIChYVmFyaWFibGVEZWNsYXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhXSElMRV9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YV2hpbGVFeHByZXNzaW9uKGNvbnRleHQsIChYV2hpbGVFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWHR5cGVQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFh0eXBlUGFja2FnZS5YRlVOQ1RJT05fVFlQRV9SRUY6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZ1bmN0aW9uVHlwZVJlZihjb250ZXh0LCAoWEZ1bmN0aW9uVHlwZVJlZikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhJTVBPUlRfREVDTEFSQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSW1wb3J0RGVjbGFyYXRpb24oY29udGV4dCwgKFhJbXBvcnREZWNsYXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhJTVBPUlRfU0VDVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydFNlY3Rpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEltcG9ydFNlY3Rpb24oY29udGV4dCwgKFhJbXBvcnRTZWN0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQlpZiAoZXJyb3JBY2NlcHRvciAhPSBudWxsKSBlcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlSW52YWxpZENvbnRleHRPclR5cGVEaWFnbm9zdGljKHNlbWFudGljT2JqZWN0LCBjb250ZXh0KSk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChheGlzPVtEYXRhbWFydEF4aXN8SURdIHJlbmRlclR5cGU9UmVuZGVyVHlwZUVudW0gc2hvcnRMYWJlbD89J3Nob3J0TGFiZWwnPyBhbmdsZT1TaWduZWROdW1iZXI/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0QXhpcyhFT2JqZWN0IGNvbnRleHQsIENoYXJ0QXhpcyBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKHNoYWRvdz89J3NoYWRlZCc/IGFuaW1hdGVkPz0nYW5pbWF0ZWQnPyBzd2FwcGVkPz0nc3dhcHBlZCc/IHN0YWNrZWQ/PSdzdGFja2VkJz8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ2hhcnRCYXIoRU9iamVjdCBjb250ZXh0LCBDaGFydEJhciBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKCgobXVsdGlwbGllcj89J211bHRpcGxpZXInIG11bHRpcGxpZXJWYWx1ZT1OdW1iZXIpPyAoZ3JhZGllbnQ/PSdncmFkaWVudCcgfCB0cmFuc3BhcmVudD89J3RyYW5zcGFyZW50JykpPykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydEJ1YmJsZShFT2JqZWN0IGNvbnRleHQsIENoYXJ0QnViYmxlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZGF0YW1hcnRSZWY9W0RhdGFtYXJ0RGVmaW5pdGlvbnxJRF0gZWxlbWVudHMrPUNoYXJ0RWxlbWVudCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ2hhcnREYXRhbWFydChFT2JqZWN0IGNvbnRleHQsIENoYXJ0RGF0YW1hcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHtDaGFydERvbnV0fQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0RG9udXQoRU9iamVjdCBjb250ZXh0LCBDaGFydERvbnV0IHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoKGxhYmVsZWQ/PSdsYWJlbCcgbGFiZWxWYWx1ZT1TVFJJTkcpPyAoaGFzVGlja3M/PSdoYXNUaWNrcycgbWluVmFsdWU9SU5UIG1heFZhbHVlPUlOVCk/IChoYXNJbnRlcnZhbHM/PSdpbnRlcnZhbHMnIGludGVydmFscys9Q2hhcnRJbnRlcnZhbCopPykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydEdhdWdlKEVPYmplY3QgY29udGV4dCwgQ2hhcnRHYXVnZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGxvY2F0aW9uPVRvb2x0aXBMb2NhdGlvbkVudW0gdG9vbHRpcEFsd2F5cz89J2Fsd2F5cyc/IGluc2lkZUNoYXJ0Pz0naW5zaWRlJz8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ2hhcnRIaWdobGlnaHRlcihFT2JqZWN0IGNvbnRleHQsIENoYXJ0SGlnaGxpZ2h0ZXIgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGltcG9ydGVkTmFtZXNwYWNlPUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0SW1wb3J0KEVPYmplY3QgY29udGV4dCwgTEltcG9ydCBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBPU0JQVHlwZXNQYWNrYWdlLkxpdGVyYWxzLkxJTVBPUlRfX0lNUE9SVEVEX05BTUVTUEFDRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBPU0JQVHlwZXNQYWNrYWdlLkxpdGVyYWxzLkxJTVBPUlRfX0lNUE9SVEVEX05BTUVTUEFDRSkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRJbXBvcnRlZE5hbWVzcGFjZSgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAocGxhY2VtZW50PUxlZ2VuZFBsYWNlbWVudEVudW0gKHRvZ2dsZT89J3RvZ2dsZScgcmVwbG90Pz0ncmVwbG90JyB0b2dnbGVUeXBlPVRvZ2dsZVR5cGVFbnVtKT8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ2hhcnRMZWdlbmQoRU9iamVjdCBjb250ZXh0LCBDaGFydExlZ2VuZCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKAorCSAqICAgICAgICAgYW5pbWF0ZWQ/PSdhbmltYXRlZCc/IAorCSAqICAgICAgICAgc2hvd01hcmtlcj89J3Nob3dNYXJrZXInPyAKKwkgKiAgICAgICAgIHRyZW5kTGluZT89J3RyZW5kTGluZSc/IAorCSAqICAgICAgICAgKGN1cnNvcj89J2N1cnNvcicgem9vbT89J3pvb20nPyB0b29sdGlwPz0ndG9vbHRpcCc/KT8gCisJICogICAgICAgICBmaWxsVG9aZXJvPz0nZmlsbFplcm8nPyAKKwkgKiAgICAgICAgIGZpbGxBcmVhPz0nZmlsbGVkJz8KKwkgKiAgICAgKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0TGluZShFT2JqZWN0IGNvbnRleHQsIENoYXJ0TGluZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgcGFja2FnZXMrPUNoYXJ0UGFja2FnZSoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydE1vZGVsKEVPYmplY3QgY29udGV4dCwgQ2hhcnRNb2RlbCBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG51bWJlckludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIG51bWJlclJhbmdlPUNoYXJ0UmFuZ2VFbGVtZW50KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0TnVtYmVySW50ZXJ2YWwoRU9iamVjdCBjb250ZXh0LCBDaGFydE51bWJlckludGVydmFsIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9OVU1CRVJfSU5URVJWQUxfX05VTUJFUl9JTlRFUlZBTF9WQUxVRSkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfSU5URVJWQUxfVkFMVUUpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfTlVNQkVSX0lOVEVSVkFMX19OVU1CRVJfUkFOR0UpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX05VTUJFUl9JTlRFUlZBTF9fTlVNQkVSX1JBTkdFKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRDaGFydE51bWJlckludGVydmFsQWNjZXNzKCkuZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCgpLCBzZW1hbnRpY09iamVjdC5nZXROdW1iZXJJbnRlcnZhbFZhbHVlKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpLmdldE51bWJlclJhbmdlQ2hhcnRSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0TnVtYmVyUmFuZ2UoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9UXVhbGlmaWVkTmFtZSAoaW1wb3J0cys9Q2hhcnRJbXBvcnQqIGNoYXJ0cys9Q2hhcnQqKT8pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQ2hhcnRQYWNrYWdlKEVPYmplY3QgY29udGV4dCwgQ2hhcnRQYWNrYWdlIHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZW1wdHk/PSdlbXB0eSc/KQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX0NoYXJ0UGllKEVPYmplY3QgY29udGV4dCwgQ2hhcnRQaWUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHJnYj1TVFJJTkcKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydFNlZ21lbnRDb2xvcihFT2JqZWN0IGNvbnRleHQsIENoYXJ0U2VnbWVudENvbG9yIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9TRUdNRU5UX0NPTE9SX19SR0IpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX1NFR01FTlRfQ09MT1JfX1JHQikpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKS5nZXRSZ2JTVFJJTkdUZXJtaW5hbFJ1bGVDYWxsXzFfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRSZ2IoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG1hcD89J21hcCcgfCBjb2xsYXBzaWJsZT89J2NvbGxhcHNpYmxlJykKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydFRyZWUoRU9iamVjdCBjb250ZXh0LCBDaGFydFRyZWUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICgKKwkgKiAgICAgICAgIG5hbWU9VFJBTlNMQVRBQkxFSUQgCisJICogICAgICAgICAoZGVzY3JpcHRpb24/PSdkZXNjcmliZWQgYnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gCisJICogICAgICAgICBjaGFydHR5cGU9Q2hhcnRPcHRpb24gCisJICogICAgICAgICAocG9sbGluZz89J3BvbGxpbmcnIHBvbGxpbmdUaW1lPUlOVCk/IAorCSAqICAgICAgICAgc291cmNlPUNoYXJ0RGF0YW1hcnQ/CisJICogICAgICkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9DaGFydChFT2JqZWN0IGNvbnRleHQsIENoYXJ0IHNlbWFudGljT2JqZWN0KSB7CisJCWdlbmVyaWNTZXF1ZW5jZXIuY3JlYXRlU2VxdWVuY2UoY29udGV4dCwgc2VtYW50aWNPYmplY3QpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3NlcmlhbGl6ZXIvQ2hhcnREU0xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3NlcmlhbGl6ZXIvQ2hhcnREU0xTeW50YWN0aWNTZXF1ZW5jZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWEwNmFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2VyaWFsaXplci9DaGFydERTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2VyaWFsaXplcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNlcnZpY2VzLkNoYXJ0RFNMR3JhbW1hckFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5JR3JhbW1hckFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5ub2RlbW9kZWwuSU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5HcmFtbWFyQWxpYXMuQWJzdHJhY3RFbGVtZW50QWxpYXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5HcmFtbWFyQWxpYXMuR3JvdXBBbGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLkdyYW1tYXJBbGlhcy5Ub2tlbkFsaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuSVN5bnRhY3RpY1NlcXVlbmNlclBEQVByb3ZpZGVyLklTeW5OYXZpZ2FibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5JU3ludGFjdGljU2VxdWVuY2VyUERBUHJvdmlkZXIuSVN5blRyYW5zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuQWJzdHJhY3RTeW50YWN0aWNTZXF1ZW5jZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMU3ludGFjdGljU2VxdWVuY2VyIGV4dGVuZHMgQWJzdHJhY3RTeW50YWN0aWNTZXF1ZW5jZXIgeworCisJcHJvdGVjdGVkIENoYXJ0RFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9DaGFydFBhY2thZ2VfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzBfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfM19fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcDsKKwkKKwlASW5qZWN0CisJcHJvdGVjdGVkIHZvaWQgaW5pdChJR3JhbW1hckFjY2VzcyBhY2Nlc3MpIHsKKwkJZ3JhbW1hckFjY2VzcyA9IChDaGFydERTTEdyYW1tYXJBY2Nlc3MpIGFjY2VzczsKKwkJbWF0Y2hfQ2hhcnRQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzNfX3EgPSBuZXcgR3JvdXBBbGlhcyhmYWxzZSwgdHJ1ZSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldENoYXJ0UGFja2FnZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzMoKSkpOworCQltYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcSA9IG5ldyBHcm91cEFsaWFzKGZhbHNlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKSwgbmV3IFRva2VuQWxpYXMoZmFsc2UsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpKTsKKwkJbWF0Y2hfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xID0gbmV3IFRva2VuQWxpYXMoZmFsc2UsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMl8xKCkpOworCQltYXRjaF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xID0gbmV3IFRva2VuQWxpYXMoZmFsc2UsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRTZW1pY29sb25LZXl3b3JkXzFfMSgpKTsKKwkJbWF0Y2hfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcSA9IG5ldyBHcm91cEFsaWFzKGZhbHNlLCB0cnVlLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMigpKSk7CisJCW1hdGNoX1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcSA9IG5ldyBUb2tlbkFsaWFzKGZhbHNlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMigpKTsKKwkJbWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hID0gbmV3IFRva2VuQWxpYXModHJ1ZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzAoKSk7CisJCW1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcCA9IG5ldyBUb2tlbkFsaWFzKHRydWUsIGZhbHNlLCBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMCgpKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZyBnZXRVbmFzc2lnbmVkUnVsZUNhbGxUb2tlbihFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBSdWxlQ2FsbCBydWxlQ2FsbCwgSU5vZGUgbm9kZSkgeworCQlpZihydWxlQ2FsbC5nZXRSdWxlKCkgPT0gZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKQorCQkJcmV0dXJuIGdldEFycmF5QnJhY2tldHNUb2tlbihzZW1hbnRpY09iamVjdCwgcnVsZUNhbGwsIG5vZGUpOworCQllbHNlIGlmKHJ1bGVDYWxsLmdldFJ1bGUoKSA9PSBncmFtbWFyQWNjZXNzLmdldE9wU2luZ2xlQXNzaWduUnVsZSgpKQorCQkJcmV0dXJuIGdldE9wU2luZ2xlQXNzaWduVG9rZW4oc2VtYW50aWNPYmplY3QsIHJ1bGVDYWxsLCBub2RlKTsKKwkJcmV0dXJuICIiOworCX0KKwkKKwkvKioKKwkgKiBBcnJheUJyYWNrZXRzIDoKKwkgKiAJJ1snICddJworCSAqIDsKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldEFycmF5QnJhY2tldHNUb2tlbihFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBSdWxlQ2FsbCBydWxlQ2FsbCwgSU5vZGUgbm9kZSkgeworCQlpZiAobm9kZSAhPSBudWxsKQorCQkJcmV0dXJuIGdldFRva2VuVGV4dChub2RlKTsKKwkJcmV0dXJuICJbXSI7CisJfQorCQorCS8qKgorCSAqIE9wU2luZ2xlQXNzaWduOgorCSAqIAknPScKKwkgKiA7CisJICovCisJcHJvdGVjdGVkIFN0cmluZyBnZXRPcFNpbmdsZUFzc2lnblRva2VuKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBJTm9kZSBub2RlKSB7CisJCWlmIChub2RlICE9IG51bGwpCisJCQlyZXR1cm4gZ2V0VG9rZW5UZXh0KG5vZGUpOworCQlyZXR1cm4gIj0iOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBlbWl0VW5hc3NpZ25lZFRva2VucyhFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luVHJhbnNpdGlvbiB0cmFuc2l0aW9uLCBJTm9kZSBmcm9tTm9kZSwgSU5vZGUgdG9Ob2RlKSB7CisJCWlmICh0cmFuc2l0aW9uLmdldEFtYmlndW91c1N5bnRheGVzKCkuaXNFbXB0eSgpKSByZXR1cm47CisJCUxpc3Q8SU5vZGU+IHRyYW5zaXRpb25Ob2RlcyA9IGNvbGxlY3ROb2Rlcyhmcm9tTm9kZSwgdG9Ob2RlKTsKKwkJZm9yIChBYnN0cmFjdEVsZW1lbnRBbGlhcyBzeW50YXggOiB0cmFuc2l0aW9uLmdldEFtYmlndW91c1N5bnRheGVzKCkpIHsKKwkJCUxpc3Q8SU5vZGU+IHN5bnRheE5vZGVzID0gZ2V0Tm9kZXNGb3IodHJhbnNpdGlvbk5vZGVzLCBzeW50YXgpOworCQkJaWYobWF0Y2hfQ2hhcnRQYWNrYWdlX19fTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wX1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzNfX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9DaGFydFBhY2thZ2VfX19MZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zXzBfUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfM19fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEV4cHJlc3Npb25JbkNsb3N1cmVfU2VtaWNvbG9uS2V5d29yZF8xXzFfcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hGdW5jdGlvblR5cGVSZWZfX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzJfX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hJbXBvcnREZWNsYXJhdGlvbl9TZW1pY29sb25LZXl3b3JkXzJfcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX3AuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX3Aoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGFjY2VwdE5vZGVzKGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCX0KKwl9CisKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgneycgJ30nKT8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X0NoYXJ0UGFja2FnZV9fX0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMF9SaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgnKCcgJyknKT8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICc7Jz8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hCbG9ja0V4cHJlc3Npb25fU2VtaWNvbG9uS2V5d29yZF8yXzFfcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnOyc/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICgnKCcgJyknKT8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hGdW5jdGlvblR5cGVSZWZfX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8wXzJfX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJzsnPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICcoJyoKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfYShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnKCcrCisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX3AoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2VydmljZXMvQ2hhcnREU0xHcmFtbWFyQWNjZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9zZXJ2aWNlcy9DaGFydERTTEdyYW1tYXJBY2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Y0NmZlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2VydmljZXMvQ2hhcnREU0xHcmFtbWFyQWNjZXNzLmphdmEKQEAgLTAsMCArMSwyNjA2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2VydmljZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcnZpY2UuR3JhbW1hclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcnZpY2UuQWJzdHJhY3RFbGVtZW50RmluZGVyLio7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5zZXJ2aWNlcy5YYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VydmljZXMuWGJhc2VHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlh0eXBlR3JhbW1hckFjY2VzczsKKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENoYXJ0RFNMR3JhbW1hckFjY2VzcyBleHRlbmRzIEFic3RyYWN0R3JhbW1hckVsZW1lbnRGaW5kZXIgeworCQorCQorCXB1YmxpYyBjbGFzcyBDaGFydE1vZGVsRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNoYXJ0TW9kZWwiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQYWNrYWdlc0Fzc2lnbm1lbnQgPSAoQXNzaWdubWVudClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGFja2FnZXNDaGFydFBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNQYWNrYWdlc0Fzc2lnbm1lbnQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9DaGFydE1vZGVsOgorCQkvLwlwYWNrYWdlcys9Q2hhcnRQYWNrYWdlKjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3BhY2thZ2VzKz1DaGFydFBhY2thZ2UqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBhY2thZ2VzQXNzaWdubWVudCgpIHsgcmV0dXJuIGNQYWNrYWdlc0Fzc2lnbm1lbnQ7IH0KKworCQkvL0NoYXJ0UGFja2FnZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGFja2FnZXNDaGFydFBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1BhY2thZ2VzQ2hhcnRQYWNrYWdlUGFyc2VyUnVsZUNhbGxfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydFBhY2thZ2VFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRQYWNrYWdlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ2hhcnRQYWNrYWdlQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUGFja2FnZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTmFtZUFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY05hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNHcm91cF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJbXBvcnRzQXNzaWdubWVudF8zXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ltcG9ydHNDaGFydEltcG9ydFBhcnNlclJ1bGVDYWxsXzNfMV8wID0gKFJ1bGVDYWxsKWNJbXBvcnRzQXNzaWdubWVudF8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NoYXJ0c0Fzc2lnbm1lbnRfM18yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydHNDaGFydFBhcnNlclJ1bGVDYWxsXzNfMl8wID0gKFJ1bGVDYWxsKWNDaGFydHNBc3NpZ25tZW50XzNfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMyA9IChLZXl3b3JkKWNHcm91cF8zLmVDb250ZW50cygpLmdldCgzKTsKKwkJCisJCS8vQ2hhcnRQYWNrYWdlOgorCQkvLwl7Q2hhcnRQYWNrYWdlfSAicGFja2FnZSIgbmFtZT1RdWFsaWZpZWROYW1lICgieyIgaW1wb3J0cys9Q2hhcnRJbXBvcnQqIGNoYXJ0cys9Q2hhcnQqICJ9Iik/OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0NoYXJ0UGFja2FnZX0gInBhY2thZ2UiIG5hbWU9UXVhbGlmaWVkTmFtZSAoInsiIGltcG9ydHMrPUNoYXJ0SW1wb3J0KiBjaGFydHMrPUNoYXJ0KiAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tDaGFydFBhY2thZ2V9CisJCXB1YmxpYyBBY3Rpb24gZ2V0Q2hhcnRQYWNrYWdlQWN0aW9uXzAoKSB7IHJldHVybiBjQ2hhcnRQYWNrYWdlQWN0aW9uXzA7IH0KKworCQkvLyJwYWNrYWdlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRQYWNrYWdlS2V5d29yZF8xKCkgeyByZXR1cm4gY1BhY2thZ2VLZXl3b3JkXzE7IH0KKworCQkvL25hbWU9UXVhbGlmaWVkTmFtZQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzI7IH0KKworCQkvL1F1YWxpZmllZE5hbWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wKCkgeyByZXR1cm4gY05hbWVRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wOyB9CisKKwkJLy8oInsiIGltcG9ydHMrPUNoYXJ0SW1wb3J0KiBjaGFydHMrPUNoYXJ0KiAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfM18wKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzNfMDsgfQorCisJCS8vaW1wb3J0cys9Q2hhcnRJbXBvcnQqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEltcG9ydHNBc3NpZ25tZW50XzNfMSgpIHsgcmV0dXJuIGNJbXBvcnRzQXNzaWdubWVudF8zXzE7IH0KKworCQkvL0NoYXJ0SW1wb3J0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbXBvcnRzQ2hhcnRJbXBvcnRQYXJzZXJSdWxlQ2FsbF8zXzFfMCgpIHsgcmV0dXJuIGNJbXBvcnRzQ2hhcnRJbXBvcnRQYXJzZXJSdWxlQ2FsbF8zXzFfMDsgfQorCisJCS8vY2hhcnRzKz1DaGFydCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q2hhcnRzQXNzaWdubWVudF8zXzIoKSB7IHJldHVybiBjQ2hhcnRzQXNzaWdubWVudF8zXzI7IH0KKworCQkvL0NoYXJ0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDaGFydHNDaGFydFBhcnNlclJ1bGVDYWxsXzNfMl8wKCkgeyByZXR1cm4gY0NoYXJ0c0NoYXJ0UGFyc2VyUnVsZUNhbGxfM18yXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfM18zKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8zXzM7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNDaGFydEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0NoYXJ0S2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMyA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0Rlc2NyaXB0aW9uQXNzaWdubWVudF8zXzAgPSAoQXNzaWdubWVudCljR3JvdXBfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGVzY3JpcHRpb25EZXNjcmliZWRCeUtleXdvcmRfM18wXzAgPSAoS2V5d29yZCljRGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfM18xXzAgPSAoUnVsZUNhbGwpY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQXNLZXl3b3JkXzQgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0NoYXJ0dHlwZUFzc2lnbm1lbnRfNSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NoYXJ0dHlwZUNoYXJ0T3B0aW9uUGFyc2VyUnVsZUNhbGxfNV8wID0gKFJ1bGVDYWxsKWNDaGFydHR5cGVBc3NpZ25tZW50XzUuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF82ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUG9sbGluZ0Fzc2lnbm1lbnRfNl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzYuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BvbGxpbmdQb2xsaW5nS2V5d29yZF82XzBfMCA9IChLZXl3b3JkKWNQb2xsaW5nQXNzaWdubWVudF82XzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1BvbGxpbmdUaW1lQXNzaWdubWVudF82XzEgPSAoQXNzaWdubWVudCljR3JvdXBfNi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1BvbGxpbmdUaW1lSU5UVGVybWluYWxSdWxlQ2FsbF82XzFfMCA9IChSdWxlQ2FsbCljUG9sbGluZ1RpbWVBc3NpZ25tZW50XzZfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzcgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCg3KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVc2luZ0tleXdvcmRfN18wID0gKEtleXdvcmQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1NvdXJjZUFzc2lnbm1lbnRfN18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzcuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNTb3VyY2VDaGFydERhdGFtYXJ0UGFyc2VyUnVsZUNhbGxfN18xXzAgPSAoUnVsZUNhbGwpY1NvdXJjZUFzc2lnbm1lbnRfN18xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vQ2hhcnQ6CisJCS8vCXtDaGFydH0gImNoYXJ0IiBuYW1lPVRSQU5TTEFUQUJMRUlEIChkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPyAiYXMiCisJCS8vCWNoYXJ0dHlwZT1DaGFydE9wdGlvbiAocG9sbGluZz89InBvbGxpbmciIHBvbGxpbmdUaW1lPUlOVCk/ICgidXNpbmciIHNvdXJjZT1DaGFydERhdGFtYXJ0KT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Q2hhcnR9ICJjaGFydCIgbmFtZT1UUkFOU0xBVEFCTEVJRCAoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gImFzIgorCQkvL2NoYXJ0dHlwZT1DaGFydE9wdGlvbiAocG9sbGluZz89InBvbGxpbmciIHBvbGxpbmdUaW1lPUlOVCk/ICgidXNpbmciIHNvdXJjZT1DaGFydERhdGFtYXJ0KT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Q2hhcnR9CisJCXB1YmxpYyBBY3Rpb24gZ2V0Q2hhcnRBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydEFjdGlvbl8wOyB9CisKKwkJLy8iY2hhcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldENoYXJ0S2V5d29yZF8xKCkgeyByZXR1cm4gY0NoYXJ0S2V5d29yZF8xOyB9CisKKwkJLy9uYW1lPVRSQU5TTEFUQUJMRUlECisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE5hbWVBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjTmFtZUFzc2lnbm1lbnRfMjsgfQorCisJCS8vVFJBTlNMQVRBQkxFSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE5hbWVUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNOYW1lVFJBTlNMQVRBQkxFSURQYXJzZXJSdWxlQ2FsbF8yXzA7IH0KKworCQkvLyhkZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIgZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMygpIHsgcmV0dXJuIGNHcm91cF8zOyB9CisKKwkJLy9kZXNjcmlwdGlvbj89ImRlc2NyaWJlZCBieSIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25Bc3NpZ25tZW50XzNfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvbkFzc2lnbm1lbnRfM18wOyB9CisKKwkJLy8iZGVzY3JpYmVkIGJ5IgorCQlwdWJsaWMgS2V5d29yZCBnZXREZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMCgpIHsgcmV0dXJuIGNEZXNjcmlwdGlvbkRlc2NyaWJlZEJ5S2V5d29yZF8zXzBfMDsgfQorCisJCS8vZGVzY3JpcHRpb25WYWx1ZT1UUkFOU0xBVEFCTEVTVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGVzY3JpcHRpb25WYWx1ZUFzc2lnbm1lbnRfM18xKCkgeyByZXR1cm4gY0Rlc2NyaXB0aW9uVmFsdWVBc3NpZ25tZW50XzNfMTsgfQorCisJCS8vVFJBTlNMQVRBQkxFU1RSSU5HCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXREZXNjcmlwdGlvblZhbHVlVFJBTlNMQVRBQkxFU1RSSU5HUGFyc2VyUnVsZUNhbGxfM18xXzAoKSB7IHJldHVybiBjRGVzY3JpcHRpb25WYWx1ZVRSQU5TTEFUQUJMRVNUUklOR1BhcnNlclJ1bGVDYWxsXzNfMV8wOyB9CisKKwkJLy8iYXMiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFzS2V5d29yZF80KCkgeyByZXR1cm4gY0FzS2V5d29yZF80OyB9CisKKwkJLy9jaGFydHR5cGU9Q2hhcnRPcHRpb24KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q2hhcnR0eXBlQXNzaWdubWVudF81KCkgeyByZXR1cm4gY0NoYXJ0dHlwZUFzc2lnbm1lbnRfNTsgfQorCisJCS8vQ2hhcnRPcHRpb24KKwkJcHVibGljIFJ1bGVDYWxsIGdldENoYXJ0dHlwZUNoYXJ0T3B0aW9uUGFyc2VyUnVsZUNhbGxfNV8wKCkgeyByZXR1cm4gY0NoYXJ0dHlwZUNoYXJ0T3B0aW9uUGFyc2VyUnVsZUNhbGxfNV8wOyB9CisKKwkJLy8ocG9sbGluZz89InBvbGxpbmciIHBvbGxpbmdUaW1lPUlOVCk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF82KCkgeyByZXR1cm4gY0dyb3VwXzY7IH0KKworCQkvL3BvbGxpbmc/PSJwb2xsaW5nIgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQb2xsaW5nQXNzaWdubWVudF82XzAoKSB7IHJldHVybiBjUG9sbGluZ0Fzc2lnbm1lbnRfNl8wOyB9CisKKwkJLy8icG9sbGluZyIKKwkJcHVibGljIEtleXdvcmQgZ2V0UG9sbGluZ1BvbGxpbmdLZXl3b3JkXzZfMF8wKCkgeyByZXR1cm4gY1BvbGxpbmdQb2xsaW5nS2V5d29yZF82XzBfMDsgfQorCisJCS8vcG9sbGluZ1RpbWU9SU5UCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBvbGxpbmdUaW1lQXNzaWdubWVudF82XzEoKSB7IHJldHVybiBjUG9sbGluZ1RpbWVBc3NpZ25tZW50XzZfMTsgfQorCisJCS8vSU5UCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQb2xsaW5nVGltZUlOVFRlcm1pbmFsUnVsZUNhbGxfNl8xXzAoKSB7IHJldHVybiBjUG9sbGluZ1RpbWVJTlRUZXJtaW5hbFJ1bGVDYWxsXzZfMV8wOyB9CisKKwkJLy8oInVzaW5nIiBzb3VyY2U9Q2hhcnREYXRhbWFydCk/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF83KCkgeyByZXR1cm4gY0dyb3VwXzc7IH0KKworCQkvLyJ1c2luZyIKKwkJcHVibGljIEtleXdvcmQgZ2V0VXNpbmdLZXl3b3JkXzdfMCgpIHsgcmV0dXJuIGNVc2luZ0tleXdvcmRfN18wOyB9CisKKwkJLy9zb3VyY2U9Q2hhcnREYXRhbWFydAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTb3VyY2VBc3NpZ25tZW50XzdfMSgpIHsgcmV0dXJuIGNTb3VyY2VBc3NpZ25tZW50XzdfMTsgfQorCisJCS8vQ2hhcnREYXRhbWFydAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0U291cmNlQ2hhcnREYXRhbWFydFBhcnNlclJ1bGVDYWxsXzdfMV8wKCkgeyByZXR1cm4gY1NvdXJjZUNoYXJ0RGF0YW1hcnRQYXJzZXJSdWxlQ2FsbF83XzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydE9wdGlvbkVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDaGFydE9wdGlvbiIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ2hhcnRCYXJQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydExpbmVQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydFBpZVBhcnNlclJ1bGVDYWxsXzIgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NoYXJ0RG9udXRQYXJzZXJSdWxlQ2FsbF8zID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydEJ1YmJsZVBhcnNlclJ1bGVDYWxsXzQgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NoYXJ0R2F1Z2VQYXJzZXJSdWxlQ2FsbF81ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydFRyZWVQYXJzZXJSdWxlQ2FsbF82ID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQkKKwkJLy9DaGFydE9wdGlvbjoKKwkJLy8JQ2hhcnRCYXIgfCBDaGFydExpbmUgfCBDaGFydFBpZSB8IENoYXJ0RG9udXQgfCBDaGFydEJ1YmJsZSB8IENoYXJ0R2F1Z2UgfCBDaGFydFRyZWU7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DaGFydEJhciB8IENoYXJ0TGluZSB8IENoYXJ0UGllIHwgQ2hhcnREb251dCB8IENoYXJ0QnViYmxlIHwgQ2hhcnRHYXVnZSB8IENoYXJ0VHJlZQorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0NoYXJ0QmFyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDaGFydEJhclBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjQ2hhcnRCYXJQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9DaGFydExpbmUKKwkJcHVibGljIFJ1bGVDYWxsIGdldENoYXJ0TGluZVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjQ2hhcnRMaW5lUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vQ2hhcnRQaWUKKwkJcHVibGljIFJ1bGVDYWxsIGdldENoYXJ0UGllUGFyc2VyUnVsZUNhbGxfMigpIHsgcmV0dXJuIGNDaGFydFBpZVBhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL0NoYXJ0RG9udXQKKwkJcHVibGljIFJ1bGVDYWxsIGdldENoYXJ0RG9udXRQYXJzZXJSdWxlQ2FsbF8zKCkgeyByZXR1cm4gY0NoYXJ0RG9udXRQYXJzZXJSdWxlQ2FsbF8zOyB9CisKKwkJLy9DaGFydEJ1YmJsZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRCdWJibGVQYXJzZXJSdWxlQ2FsbF80KCkgeyByZXR1cm4gY0NoYXJ0QnViYmxlUGFyc2VyUnVsZUNhbGxfNDsgfQorCisJCS8vQ2hhcnRHYXVnZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRHYXVnZVBhcnNlclJ1bGVDYWxsXzUoKSB7IHJldHVybiBjQ2hhcnRHYXVnZVBhcnNlclJ1bGVDYWxsXzU7IH0KKworCQkvL0NoYXJ0VHJlZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRUcmVlUGFyc2VyUnVsZUNhbGxfNigpIHsgcmV0dXJuIGNDaGFydFRyZWVQYXJzZXJSdWxlQ2FsbF82OyB9CisJfQorCisJcHVibGljIGNsYXNzIENoYXJ0QmFyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNoYXJ0QmFyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ2hhcnRCYXJBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCYXJLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFVub3JkZXJlZEdyb3VwIGNVbm9yZGVyZWRHcm91cF8yID0gKFVub3JkZXJlZEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU2hhZG93QXNzaWdubWVudF8yXzAgPSAoQXNzaWdubWVudCljVW5vcmRlcmVkR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU2hhZG93U2hhZGVkS2V5d29yZF8yXzBfMCA9IChLZXl3b3JkKWNTaGFkb3dBc3NpZ25tZW50XzJfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQW5pbWF0ZWRBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBbmltYXRlZEFuaW1hdGVkS2V5d29yZF8yXzFfMCA9IChLZXl3b3JkKWNBbmltYXRlZEFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTd2FwcGVkQXNzaWdubWVudF8yXzIgPSAoQXNzaWdubWVudCljVW5vcmRlcmVkR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjU3dhcHBlZFN3YXBwZWRLZXl3b3JkXzJfMl8wID0gKEtleXdvcmQpY1N3YXBwZWRBc3NpZ25tZW50XzJfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjU3RhY2tlZEFzc2lnbm1lbnRfMl8zID0gKEFzc2lnbm1lbnQpY1Vub3JkZXJlZEdyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1N0YWNrZWRTdGFja2VkS2V5d29yZF8yXzNfMCA9IChLZXl3b3JkKWNTdGFja2VkQXNzaWdubWVudF8yXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9DaGFydEJhcjoKKwkJLy8Je0NoYXJ0QmFyfSAiYmFyIiAoc2hhZG93Pz0ic2hhZGVkIj8gJiBhbmltYXRlZD89ImFuaW1hdGVkIj8gJiBzd2FwcGVkPz0ic3dhcHBlZCI/ICYgc3RhY2tlZD89InN0YWNrZWQiPyk7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Q2hhcnRCYXJ9ICJiYXIiIChzaGFkb3c/PSJzaGFkZWQiPyAmIGFuaW1hdGVkPz0iYW5pbWF0ZWQiPyAmIHN3YXBwZWQ/PSJzd2FwcGVkIj8gJiBzdGFja2VkPz0ic3RhY2tlZCI/KQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tDaGFydEJhcn0KKwkJcHVibGljIEFjdGlvbiBnZXRDaGFydEJhckFjdGlvbl8wKCkgeyByZXR1cm4gY0NoYXJ0QmFyQWN0aW9uXzA7IH0KKworCQkvLyJiYXIiCisJCXB1YmxpYyBLZXl3b3JkIGdldEJhcktleXdvcmRfMSgpIHsgcmV0dXJuIGNCYXJLZXl3b3JkXzE7IH0KKworCQkvL3NoYWRvdz89InNoYWRlZCI/ICYgYW5pbWF0ZWQ/PSJhbmltYXRlZCI/ICYgc3dhcHBlZD89InN3YXBwZWQiPyAmIHN0YWNrZWQ/PSJzdGFja2VkIj8KKwkJcHVibGljIFVub3JkZXJlZEdyb3VwIGdldFVub3JkZXJlZEdyb3VwXzIoKSB7IHJldHVybiBjVW5vcmRlcmVkR3JvdXBfMjsgfQorCisJCS8vc2hhZG93Pz0ic2hhZGVkIj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0U2hhZG93QXNzaWdubWVudF8yXzAoKSB7IHJldHVybiBjU2hhZG93QXNzaWdubWVudF8yXzA7IH0KKworCQkvLyJzaGFkZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNoYWRvd1NoYWRlZEtleXdvcmRfMl8wXzAoKSB7IHJldHVybiBjU2hhZG93U2hhZGVkS2V5d29yZF8yXzBfMDsgfQorCisJCS8vYW5pbWF0ZWQ/PSJhbmltYXRlZCI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFuaW1hdGVkQXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjQW5pbWF0ZWRBc3NpZ25tZW50XzJfMTsgfQorCisJCS8vImFuaW1hdGVkIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBbmltYXRlZEFuaW1hdGVkS2V5d29yZF8yXzFfMCgpIHsgcmV0dXJuIGNBbmltYXRlZEFuaW1hdGVkS2V5d29yZF8yXzFfMDsgfQorCisJCS8vc3dhcHBlZD89InN3YXBwZWQiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTd2FwcGVkQXNzaWdubWVudF8yXzIoKSB7IHJldHVybiBjU3dhcHBlZEFzc2lnbm1lbnRfMl8yOyB9CisKKwkJLy8ic3dhcHBlZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3dhcHBlZFN3YXBwZWRLZXl3b3JkXzJfMl8wKCkgeyByZXR1cm4gY1N3YXBwZWRTd2FwcGVkS2V5d29yZF8yXzJfMDsgfQorCisJCS8vc3RhY2tlZD89InN0YWNrZWQiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTdGFja2VkQXNzaWdubWVudF8yXzMoKSB7IHJldHVybiBjU3RhY2tlZEFzc2lnbm1lbnRfMl8zOyB9CisKKwkJLy8ic3RhY2tlZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U3RhY2tlZFN0YWNrZWRLZXl3b3JkXzJfM18wKCkgeyByZXR1cm4gY1N0YWNrZWRTdGFja2VkS2V5d29yZF8yXzNfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydExpbmVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRMaW5lIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ2hhcnRMaW5lQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGluZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzIgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBbmltYXRlZEFzc2lnbm1lbnRfMl8wID0gKEFzc2lnbm1lbnQpY1Vub3JkZXJlZEdyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FuaW1hdGVkQW5pbWF0ZWRLZXl3b3JkXzJfMF8wID0gKEtleXdvcmQpY0FuaW1hdGVkQXNzaWdubWVudF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Nob3dNYXJrZXJBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTaG93TWFya2VyU2hvd01hcmtlcktleXdvcmRfMl8xXzAgPSAoS2V5d29yZCljU2hvd01hcmtlckFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUcmVuZExpbmVBc3NpZ25tZW50XzJfMiA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNUcmVuZExpbmVUcmVuZExpbmVLZXl3b3JkXzJfMl8wID0gKEtleXdvcmQpY1RyZW5kTGluZUFzc2lnbm1lbnRfMl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMl8zID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNDdXJzb3JBc3NpZ25tZW50XzJfM18wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ3Vyc29yQ3Vyc29yS2V5d29yZF8yXzNfMF8wID0gKEtleXdvcmQpY0N1cnNvckFzc2lnbm1lbnRfMl8zXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1pvb21Bc3NpZ25tZW50XzJfM18xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjWm9vbVpvb21LZXl3b3JkXzJfM18xXzAgPSAoS2V5d29yZCljWm9vbUFzc2lnbm1lbnRfMl8zXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Rvb2x0aXBBc3NpZ25tZW50XzJfM18yID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVG9vbHRpcFRvb2x0aXBLZXl3b3JkXzJfM18yXzAgPSAoS2V5d29yZCljVG9vbHRpcEFzc2lnbm1lbnRfMl8zXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ZpbGxUb1plcm9Bc3NpZ25tZW50XzJfNCA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGaWxsVG9aZXJvRmlsbFplcm9LZXl3b3JkXzJfNF8wID0gKEtleXdvcmQpY0ZpbGxUb1plcm9Bc3NpZ25tZW50XzJfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRmlsbEFyZWFBc3NpZ25tZW50XzJfNSA9IChBc3NpZ25tZW50KWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGaWxsQXJlYUZpbGxlZEtleXdvcmRfMl81XzAgPSAoS2V5d29yZCljRmlsbEFyZWFBc3NpZ25tZW50XzJfNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0TGluZToKKwkJLy8Je0NoYXJ0TGluZX0gImxpbmUiIChhbmltYXRlZD89ImFuaW1hdGVkIj8gJiBzaG93TWFya2VyPz0ic2hvd01hcmtlciI/ICYgdHJlbmRMaW5lPz0idHJlbmRMaW5lIj8gJiAoY3Vyc29yPz0iY3Vyc29yIgorCQkvLwl6b29tPz0iem9vbSI/IHRvb2x0aXA/PSJ0b29sdGlwIj8pPyAmIGZpbGxUb1plcm8/PSJmaWxsWmVybyI/ICYgZmlsbEFyZWE/PSJmaWxsZWQiPyk7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Q2hhcnRMaW5lfSAibGluZSIgKGFuaW1hdGVkPz0iYW5pbWF0ZWQiPyAmIHNob3dNYXJrZXI/PSJzaG93TWFya2VyIj8gJiB0cmVuZExpbmU/PSJ0cmVuZExpbmUiPyAmIChjdXJzb3I/PSJjdXJzb3IiCisJCS8vem9vbT89Inpvb20iPyB0b29sdGlwPz0idG9vbHRpcCI/KT8gJiBmaWxsVG9aZXJvPz0iZmlsbFplcm8iPyAmIGZpbGxBcmVhPz0iZmlsbGVkIj8pCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0NoYXJ0TGluZX0KKwkJcHVibGljIEFjdGlvbiBnZXRDaGFydExpbmVBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydExpbmVBY3Rpb25fMDsgfQorCisJCS8vImxpbmUiCisJCXB1YmxpYyBLZXl3b3JkIGdldExpbmVLZXl3b3JkXzEoKSB7IHJldHVybiBjTGluZUtleXdvcmRfMTsgfQorCisJCS8vYW5pbWF0ZWQ/PSJhbmltYXRlZCI/ICYgc2hvd01hcmtlcj89InNob3dNYXJrZXIiPyAmIHRyZW5kTGluZT89InRyZW5kTGluZSI/ICYgKGN1cnNvcj89ImN1cnNvciIgem9vbT89Inpvb20iPworCQkvL3Rvb2x0aXA/PSJ0b29sdGlwIj8pPyAmIGZpbGxUb1plcm8/PSJmaWxsWmVybyI/ICYgZmlsbEFyZWE/PSJmaWxsZWQiPworCQlwdWJsaWMgVW5vcmRlcmVkR3JvdXAgZ2V0VW5vcmRlcmVkR3JvdXBfMigpIHsgcmV0dXJuIGNVbm9yZGVyZWRHcm91cF8yOyB9CisKKwkJLy9hbmltYXRlZD89ImFuaW1hdGVkIj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QW5pbWF0ZWRBc3NpZ25tZW50XzJfMCgpIHsgcmV0dXJuIGNBbmltYXRlZEFzc2lnbm1lbnRfMl8wOyB9CisKKwkJLy8iYW5pbWF0ZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFuaW1hdGVkQW5pbWF0ZWRLZXl3b3JkXzJfMF8wKCkgeyByZXR1cm4gY0FuaW1hdGVkQW5pbWF0ZWRLZXl3b3JkXzJfMF8wOyB9CisKKwkJLy9zaG93TWFya2VyPz0ic2hvd01hcmtlciI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFNob3dNYXJrZXJBc3NpZ25tZW50XzJfMSgpIHsgcmV0dXJuIGNTaG93TWFya2VyQXNzaWdubWVudF8yXzE7IH0KKworCQkvLyJzaG93TWFya2VyIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTaG93TWFya2VyU2hvd01hcmtlcktleXdvcmRfMl8xXzAoKSB7IHJldHVybiBjU2hvd01hcmtlclNob3dNYXJrZXJLZXl3b3JkXzJfMV8wOyB9CisKKwkJLy90cmVuZExpbmU/PSJ0cmVuZExpbmUiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUcmVuZExpbmVBc3NpZ25tZW50XzJfMigpIHsgcmV0dXJuIGNUcmVuZExpbmVBc3NpZ25tZW50XzJfMjsgfQorCisJCS8vInRyZW5kTGluZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0VHJlbmRMaW5lVHJlbmRMaW5lS2V5d29yZF8yXzJfMCgpIHsgcmV0dXJuIGNUcmVuZExpbmVUcmVuZExpbmVLZXl3b3JkXzJfMl8wOyB9CisKKwkJLy8oY3Vyc29yPz0iY3Vyc29yIiB6b29tPz0iem9vbSI/IHRvb2x0aXA/PSJ0b29sdGlwIj8pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8zKCkgeyByZXR1cm4gY0dyb3VwXzJfMzsgfQorCisJCS8vY3Vyc29yPz0iY3Vyc29yIgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRDdXJzb3JBc3NpZ25tZW50XzJfM18wKCkgeyByZXR1cm4gY0N1cnNvckFzc2lnbm1lbnRfMl8zXzA7IH0KKworCQkvLyJjdXJzb3IiCisJCXB1YmxpYyBLZXl3b3JkIGdldEN1cnNvckN1cnNvcktleXdvcmRfMl8zXzBfMCgpIHsgcmV0dXJuIGNDdXJzb3JDdXJzb3JLZXl3b3JkXzJfM18wXzA7IH0KKworCQkvL3pvb20/PSJ6b29tIj8KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Wm9vbUFzc2lnbm1lbnRfMl8zXzEoKSB7IHJldHVybiBjWm9vbUFzc2lnbm1lbnRfMl8zXzE7IH0KKworCQkvLyJ6b29tIgorCQlwdWJsaWMgS2V5d29yZCBnZXRab29tWm9vbUtleXdvcmRfMl8zXzFfMCgpIHsgcmV0dXJuIGNab29tWm9vbUtleXdvcmRfMl8zXzFfMDsgfQorCisJCS8vdG9vbHRpcD89InRvb2x0aXAiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUb29sdGlwQXNzaWdubWVudF8yXzNfMigpIHsgcmV0dXJuIGNUb29sdGlwQXNzaWdubWVudF8yXzNfMjsgfQorCisJCS8vInRvb2x0aXAiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRvb2x0aXBUb29sdGlwS2V5d29yZF8yXzNfMl8wKCkgeyByZXR1cm4gY1Rvb2x0aXBUb29sdGlwS2V5d29yZF8yXzNfMl8wOyB9CisKKwkJLy9maWxsVG9aZXJvPz0iZmlsbFplcm8iPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGaWxsVG9aZXJvQXNzaWdubWVudF8yXzQoKSB7IHJldHVybiBjRmlsbFRvWmVyb0Fzc2lnbm1lbnRfMl80OyB9CisKKwkJLy8iZmlsbFplcm8iCisJCXB1YmxpYyBLZXl3b3JkIGdldEZpbGxUb1plcm9GaWxsWmVyb0tleXdvcmRfMl80XzAoKSB7IHJldHVybiBjRmlsbFRvWmVyb0ZpbGxaZXJvS2V5d29yZF8yXzRfMDsgfQorCisJCS8vZmlsbEFyZWE/PSJmaWxsZWQiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRGaWxsQXJlYUFzc2lnbm1lbnRfMl81KCkgeyByZXR1cm4gY0ZpbGxBcmVhQXNzaWdubWVudF8yXzU7IH0KKworCQkvLyJmaWxsZWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEZpbGxBcmVhRmlsbGVkS2V5d29yZF8yXzVfMCgpIHsgcmV0dXJuIGNGaWxsQXJlYUZpbGxlZEtleXdvcmRfMl81XzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRQaWVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRQaWUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNDaGFydFBpZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1BpZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRW1wdHlBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0VtcHR5RW1wdHlLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNFbXB0eUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0UGllOgorCQkvLwl7Q2hhcnRQaWV9ICJwaWUiIGVtcHR5Pz0iZW1wdHkiPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tDaGFydFBpZX0gInBpZSIgZW1wdHk/PSJlbXB0eSI/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0NoYXJ0UGllfQorCQlwdWJsaWMgQWN0aW9uIGdldENoYXJ0UGllQWN0aW9uXzAoKSB7IHJldHVybiBjQ2hhcnRQaWVBY3Rpb25fMDsgfQorCisJCS8vInBpZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UGllS2V5d29yZF8xKCkgeyByZXR1cm4gY1BpZUtleXdvcmRfMTsgfQorCisJCS8vZW1wdHk/PSJlbXB0eSI/CisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVtcHR5QXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0VtcHR5QXNzaWdubWVudF8yOyB9CisKKwkJLy8iZW1wdHkiCisJCXB1YmxpYyBLZXl3b3JkIGdldEVtcHR5RW1wdHlLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNFbXB0eUVtcHR5S2V5d29yZF8yXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnREb251dEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDaGFydERvbnV0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ2hhcnREb251dEFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RvbnV0S2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vQ2hhcnREb251dDoKKwkJLy8Je0NoYXJ0RG9udXR9ICJkb251dCI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Q2hhcnREb251dH0gImRvbnV0IgorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tDaGFydERvbnV0fQorCQlwdWJsaWMgQWN0aW9uIGdldENoYXJ0RG9udXRBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydERvbnV0QWN0aW9uXzA7IH0KKworCQkvLyJkb251dCIKKwkJcHVibGljIEtleXdvcmQgZ2V0RG9udXRLZXl3b3JkXzEoKSB7IHJldHVybiBjRG9udXRLZXl3b3JkXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRCdWJibGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRCdWJibGUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNDaGFydEJ1YmJsZUFjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0J1YmJsZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzIgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMl8wID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNdWx0aXBsaWVyQXNzaWdubWVudF8yXzBfMCA9IChBc3NpZ25tZW50KWNHcm91cF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY011bHRpcGxpZXJNdWx0aXBsaWVyS2V5d29yZF8yXzBfMF8wID0gKEtleXdvcmQpY011bHRpcGxpZXJBc3NpZ25tZW50XzJfMF8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNdWx0aXBsaWVyVmFsdWVBc3NpZ25tZW50XzJfMF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY011bHRpcGxpZXJWYWx1ZU51bWJlclBhcnNlclJ1bGVDYWxsXzJfMF8xXzAgPSAoUnVsZUNhbGwpY011bHRpcGxpZXJWYWx1ZUFzc2lnbm1lbnRfMl8wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzXzJfMSA9IChBbHRlcm5hdGl2ZXMpY1Vub3JkZXJlZEdyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0dyYWRpZW50QXNzaWdubWVudF8yXzFfMCA9IChBc3NpZ25tZW50KWNBbHRlcm5hdGl2ZXNfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHcmFkaWVudEdyYWRpZW50S2V5d29yZF8yXzFfMF8wID0gKEtleXdvcmQpY0dyYWRpZW50QXNzaWdubWVudF8yXzFfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xID0gKEFzc2lnbm1lbnQpY0FsdGVybmF0aXZlc18yXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RyYW5zcGFyZW50VHJhbnNwYXJlbnRLZXl3b3JkXzJfMV8xXzAgPSAoS2V5d29yZCljVHJhbnNwYXJlbnRBc3NpZ25tZW50XzJfMV8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vQ2hhcnRCdWJibGU6CisJCS8vCXtDaGFydEJ1YmJsZX0gImJ1YmJsZSIgKChtdWx0aXBsaWVyPz0ibXVsdGlwbGllciIgbXVsdGlwbGllclZhbHVlPU51bWJlcik/ICYgKGdyYWRpZW50Pz0iZ3JhZGllbnQiIHwKKwkJLy8JdHJhbnNwYXJlbnQ/PSJ0cmFuc3BhcmVudCIpKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Q2hhcnRCdWJibGV9ICJidWJibGUiICgobXVsdGlwbGllcj89Im11bHRpcGxpZXIiIG11bHRpcGxpZXJWYWx1ZT1OdW1iZXIpPyAmIChncmFkaWVudD89ImdyYWRpZW50IiB8CisJCS8vdHJhbnNwYXJlbnQ/PSJ0cmFuc3BhcmVudCIpKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Q2hhcnRCdWJibGV9CisJCXB1YmxpYyBBY3Rpb24gZ2V0Q2hhcnRCdWJibGVBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydEJ1YmJsZUFjdGlvbl8wOyB9CisKKwkJLy8iYnViYmxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRCdWJibGVLZXl3b3JkXzEoKSB7IHJldHVybiBjQnViYmxlS2V5d29yZF8xOyB9CisKKwkJLy8oKG11bHRpcGxpZXI/PSJtdWx0aXBsaWVyIiBtdWx0aXBsaWVyVmFsdWU9TnVtYmVyKT8gJiAoZ3JhZGllbnQ/PSJncmFkaWVudCIgfCB0cmFuc3BhcmVudD89InRyYW5zcGFyZW50IikpPworCQlwdWJsaWMgVW5vcmRlcmVkR3JvdXAgZ2V0VW5vcmRlcmVkR3JvdXBfMigpIHsgcmV0dXJuIGNVbm9yZGVyZWRHcm91cF8yOyB9CisKKwkJLy8obXVsdGlwbGllcj89Im11bHRpcGxpZXIiIG11bHRpcGxpZXJWYWx1ZT1OdW1iZXIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8wKCkgeyByZXR1cm4gY0dyb3VwXzJfMDsgfQorCisJCS8vbXVsdGlwbGllcj89Im11bHRpcGxpZXIiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldE11bHRpcGxpZXJBc3NpZ25tZW50XzJfMF8wKCkgeyByZXR1cm4gY011bHRpcGxpZXJBc3NpZ25tZW50XzJfMF8wOyB9CisKKwkJLy8ibXVsdGlwbGllciIKKwkJcHVibGljIEtleXdvcmQgZ2V0TXVsdGlwbGllck11bHRpcGxpZXJLZXl3b3JkXzJfMF8wXzAoKSB7IHJldHVybiBjTXVsdGlwbGllck11bHRpcGxpZXJLZXl3b3JkXzJfMF8wXzA7IH0KKworCQkvL211bHRpcGxpZXJWYWx1ZT1OdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TXVsdGlwbGllclZhbHVlQXNzaWdubWVudF8yXzBfMSgpIHsgcmV0dXJuIGNNdWx0aXBsaWVyVmFsdWVBc3NpZ25tZW50XzJfMF8xOyB9CisKKwkJLy9OdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldE11bHRpcGxpZXJWYWx1ZU51bWJlclBhcnNlclJ1bGVDYWxsXzJfMF8xXzAoKSB7IHJldHVybiBjTXVsdGlwbGllclZhbHVlTnVtYmVyUGFyc2VyUnVsZUNhbGxfMl8wXzFfMDsgfQorCisJCS8vZ3JhZGllbnQ/PSJncmFkaWVudCIgfCB0cmFuc3BhcmVudD89InRyYW5zcGFyZW50IgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlc18yXzEoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzXzJfMTsgfQorCisJCS8vZ3JhZGllbnQ/PSJncmFkaWVudCIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0R3JhZGllbnRBc3NpZ25tZW50XzJfMV8wKCkgeyByZXR1cm4gY0dyYWRpZW50QXNzaWdubWVudF8yXzFfMDsgfQorCisJCS8vImdyYWRpZW50IgorCQlwdWJsaWMgS2V5d29yZCBnZXRHcmFkaWVudEdyYWRpZW50S2V5d29yZF8yXzFfMF8wKCkgeyByZXR1cm4gY0dyYWRpZW50R3JhZGllbnRLZXl3b3JkXzJfMV8wXzA7IH0KKworCQkvL3RyYW5zcGFyZW50Pz0idHJhbnNwYXJlbnQiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRyYW5zcGFyZW50QXNzaWdubWVudF8yXzFfMSgpIHsgcmV0dXJuIGNUcmFuc3BhcmVudEFzc2lnbm1lbnRfMl8xXzE7IH0KKworCQkvLyJ0cmFuc3BhcmVudCIKKwkJcHVibGljIEtleXdvcmQgZ2V0VHJhbnNwYXJlbnRUcmFuc3BhcmVudEtleXdvcmRfMl8xXzFfMCgpIHsgcmV0dXJuIGNUcmFuc3BhcmVudFRyYW5zcGFyZW50S2V5d29yZF8yXzFfMV8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIENoYXJ0R2F1Z2VFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRHYXVnZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0NoYXJ0R2F1Z2VBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNHYXVnZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgVW5vcmRlcmVkR3JvdXAgY1Vub3JkZXJlZEdyb3VwXzIgPSAoVW5vcmRlcmVkR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMl8wID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNMYWJlbGVkQXNzaWdubWVudF8yXzBfMCA9IChBc3NpZ25tZW50KWNHcm91cF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xhYmVsZWRMYWJlbEtleXdvcmRfMl8wXzBfMCA9IChLZXl3b3JkKWNMYWJlbGVkQXNzaWdubWVudF8yXzBfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEgPSAoQXNzaWdubWVudCljR3JvdXBfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTGFiZWxWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzFfMCA9IChSdWxlQ2FsbCljTGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8yXzEgPSAoR3JvdXApY1Vub3JkZXJlZEdyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0hhc1RpY2tzQXNzaWdubWVudF8yXzFfMCA9IChBc3NpZ25tZW50KWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0hhc1RpY2tzSGFzVGlja3NLZXl3b3JkXzJfMV8wXzAgPSAoS2V5d29yZCljSGFzVGlja3NBc3NpZ25tZW50XzJfMV8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNaW5pbXVtS2V5d29yZF8yXzFfMSA9IChLZXl3b3JkKWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01pblZhbHVlQXNzaWdubWVudF8yXzFfMiA9IChBc3NpZ25tZW50KWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNaW5WYWx1ZUlOVFRlcm1pbmFsUnVsZUNhbGxfMl8xXzJfMCA9IChSdWxlQ2FsbCljTWluVmFsdWVBc3NpZ25tZW50XzJfMV8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNNYXhpbXVtS2V5d29yZF8yXzFfMyA9IChLZXl3b3JkKWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY01heFZhbHVlQXNzaWdubWVudF8yXzFfNCA9IChBc3NpZ25tZW50KWNHcm91cF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNNYXhWYWx1ZUlOVFRlcm1pbmFsUnVsZUNhbGxfMl8xXzRfMCA9IChSdWxlQ2FsbCljTWF4VmFsdWVBc3NpZ25tZW50XzJfMV80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMl8yID0gKEdyb3VwKWNVbm9yZGVyZWRHcm91cF8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNIYXNJbnRlcnZhbHNBc3NpZ25tZW50XzJfMl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzJfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSGFzSW50ZXJ2YWxzSW50ZXJ2YWxzS2V5d29yZF8yXzJfMF8wID0gKEtleXdvcmQpY0hhc0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8xID0gKEtleXdvcmQpY0dyb3VwXzJfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW50ZXJ2YWxzQXNzaWdubWVudF8yXzJfMiA9IChBc3NpZ25tZW50KWNHcm91cF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbnRlcnZhbHNDaGFydEludGVydmFsUGFyc2VyUnVsZUNhbGxfMl8yXzJfMCA9IChSdWxlQ2FsbCljSW50ZXJ2YWxzQXNzaWdubWVudF8yXzJfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8zID0gKEtleXdvcmQpY0dyb3VwXzJfMi5lQ29udGVudHMoKS5nZXQoMyk7CisJCQorCQkvL0NoYXJ0R2F1Z2U6CisJCS8vCXtDaGFydEdhdWdlfSAiZ2F1Z2UiICgobGFiZWxlZD89ImxhYmVsIiBsYWJlbFZhbHVlPVNUUklORyk/ICYgKGhhc1RpY2tzPz0iaGFzVGlja3MiICJtaW5pbXVtIiBtaW5WYWx1ZT1JTlQgIm1heGltdW0iCisJCS8vCW1heFZhbHVlPUlOVCk/ICYgKGhhc0ludGVydmFscz89ImludGVydmFscyIgInsiIGludGVydmFscys9Q2hhcnRJbnRlcnZhbCogIn0iKT8pOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0NoYXJ0R2F1Z2V9ICJnYXVnZSIgKChsYWJlbGVkPz0ibGFiZWwiIGxhYmVsVmFsdWU9U1RSSU5HKT8gJiAoaGFzVGlja3M/PSJoYXNUaWNrcyIgIm1pbmltdW0iIG1pblZhbHVlPUlOVCAibWF4aW11bSIKKwkJLy9tYXhWYWx1ZT1JTlQpPyAmIChoYXNJbnRlcnZhbHM/PSJpbnRlcnZhbHMiICJ7IiBpbnRlcnZhbHMrPUNoYXJ0SW50ZXJ2YWwqICJ9Iik/KQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tDaGFydEdhdWdlfQorCQlwdWJsaWMgQWN0aW9uIGdldENoYXJ0R2F1Z2VBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydEdhdWdlQWN0aW9uXzA7IH0KKworCQkvLyJnYXVnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0R2F1Z2VLZXl3b3JkXzEoKSB7IHJldHVybiBjR2F1Z2VLZXl3b3JkXzE7IH0KKworCQkvLyhsYWJlbGVkPz0ibGFiZWwiIGxhYmVsVmFsdWU9U1RSSU5HKT8gJiAoaGFzVGlja3M/PSJoYXNUaWNrcyIgIm1pbmltdW0iIG1pblZhbHVlPUlOVCAibWF4aW11bSIgbWF4VmFsdWU9SU5UKT8gJgorCQkvLyhoYXNJbnRlcnZhbHM/PSJpbnRlcnZhbHMiICJ7IiBpbnRlcnZhbHMrPUNoYXJ0SW50ZXJ2YWwqICJ9Iik/CisJCXB1YmxpYyBVbm9yZGVyZWRHcm91cCBnZXRVbm9yZGVyZWRHcm91cF8yKCkgeyByZXR1cm4gY1Vub3JkZXJlZEdyb3VwXzI7IH0KKworCQkvLyhsYWJlbGVkPz0ibGFiZWwiIGxhYmVsVmFsdWU9U1RSSU5HKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzJfMCgpIHsgcmV0dXJuIGNHcm91cF8yXzA7IH0KKworCQkvL2xhYmVsZWQ/PSJsYWJlbCIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TGFiZWxlZEFzc2lnbm1lbnRfMl8wXzAoKSB7IHJldHVybiBjTGFiZWxlZEFzc2lnbm1lbnRfMl8wXzA7IH0KKworCQkvLyJsYWJlbCIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGFiZWxlZExhYmVsS2V5d29yZF8yXzBfMF8wKCkgeyByZXR1cm4gY0xhYmVsZWRMYWJlbEtleXdvcmRfMl8wXzBfMDsgfQorCisJCS8vbGFiZWxWYWx1ZT1TVFJJTkcKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzEoKSB7IHJldHVybiBjTGFiZWxWYWx1ZUFzc2lnbm1lbnRfMl8wXzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0TGFiZWxWYWx1ZVNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMl8wXzFfMCgpIHsgcmV0dXJuIGNMYWJlbFZhbHVlU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8yXzBfMV8wOyB9CisKKwkJLy8oaGFzVGlja3M/PSJoYXNUaWNrcyIgIm1pbmltdW0iIG1pblZhbHVlPUlOVCAibWF4aW11bSIgbWF4VmFsdWU9SU5UKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzJfMSgpIHsgcmV0dXJuIGNHcm91cF8yXzE7IH0KKworCQkvL2hhc1RpY2tzPz0iaGFzVGlja3MiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEhhc1RpY2tzQXNzaWdubWVudF8yXzFfMCgpIHsgcmV0dXJuIGNIYXNUaWNrc0Fzc2lnbm1lbnRfMl8xXzA7IH0KKworCQkvLyJoYXNUaWNrcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0SGFzVGlja3NIYXNUaWNrc0tleXdvcmRfMl8xXzBfMCgpIHsgcmV0dXJuIGNIYXNUaWNrc0hhc1RpY2tzS2V5d29yZF8yXzFfMF8wOyB9CisKKwkJLy8ibWluaW11bSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWluaW11bUtleXdvcmRfMl8xXzEoKSB7IHJldHVybiBjTWluaW11bUtleXdvcmRfMl8xXzE7IH0KKworCQkvL21pblZhbHVlPUlOVAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNaW5WYWx1ZUFzc2lnbm1lbnRfMl8xXzIoKSB7IHJldHVybiBjTWluVmFsdWVBc3NpZ25tZW50XzJfMV8yOyB9CisKKwkJLy9JTlQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1pblZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfMl8wKCkgeyByZXR1cm4gY01pblZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfMl8wOyB9CisKKwkJLy8ibWF4aW11bSIKKwkJcHVibGljIEtleXdvcmQgZ2V0TWF4aW11bUtleXdvcmRfMl8xXzMoKSB7IHJldHVybiBjTWF4aW11bUtleXdvcmRfMl8xXzM7IH0KKworCQkvL21heFZhbHVlPUlOVAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRNYXhWYWx1ZUFzc2lnbm1lbnRfMl8xXzQoKSB7IHJldHVybiBjTWF4VmFsdWVBc3NpZ25tZW50XzJfMV80OyB9CisKKwkJLy9JTlQKKwkJcHVibGljIFJ1bGVDYWxsIGdldE1heFZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfNF8wKCkgeyByZXR1cm4gY01heFZhbHVlSU5UVGVybWluYWxSdWxlQ2FsbF8yXzFfNF8wOyB9CisKKwkJLy8oaGFzSW50ZXJ2YWxzPz0iaW50ZXJ2YWxzIiAieyIgaW50ZXJ2YWxzKz1DaGFydEludGVydmFsKiAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMl8yKCkgeyByZXR1cm4gY0dyb3VwXzJfMjsgfQorCisJCS8vaGFzSW50ZXJ2YWxzPz0iaW50ZXJ2YWxzIgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRIYXNJbnRlcnZhbHNBc3NpZ25tZW50XzJfMl8wKCkgeyByZXR1cm4gY0hhc0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzA7IH0KKworCQkvLyJpbnRlcnZhbHMiCisJCXB1YmxpYyBLZXl3b3JkIGdldEhhc0ludGVydmFsc0ludGVydmFsc0tleXdvcmRfMl8yXzBfMCgpIHsgcmV0dXJuIGNIYXNJbnRlcnZhbHNJbnRlcnZhbHNLZXl3b3JkXzJfMl8wXzA7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yXzJfMSgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yXzJfMTsgfQorCisJCS8vaW50ZXJ2YWxzKz1DaGFydEludGVydmFsKgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJbnRlcnZhbHNBc3NpZ25tZW50XzJfMl8yKCkgeyByZXR1cm4gY0ludGVydmFsc0Fzc2lnbm1lbnRfMl8yXzI7IH0KKworCQkvL0NoYXJ0SW50ZXJ2YWwKKwkJcHVibGljIFJ1bGVDYWxsIGdldEludGVydmFsc0NoYXJ0SW50ZXJ2YWxQYXJzZXJSdWxlQ2FsbF8yXzJfMl8wKCkgeyByZXR1cm4gY0ludGVydmFsc0NoYXJ0SW50ZXJ2YWxQYXJzZXJSdWxlQ2FsbF8yXzJfMl8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzJfMl8zKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF8yXzJfMzsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydFRyZWVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRUcmVlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQ2hhcnRUcmVlQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVHJlZUtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXNfMiA9IChBbHRlcm5hdGl2ZXMpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNNYXBBc3NpZ25tZW50XzJfMCA9IChBc3NpZ25tZW50KWNBbHRlcm5hdGl2ZXNfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTWFwTWFwS2V5d29yZF8yXzBfMCA9IChLZXl3b3JkKWNNYXBBc3NpZ25tZW50XzJfMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQ29sbGFwc2libGVBc3NpZ25tZW50XzJfMSA9IChBc3NpZ25tZW50KWNBbHRlcm5hdGl2ZXNfMi5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ29sbGFwc2libGVDb2xsYXBzaWJsZUtleXdvcmRfMl8xXzAgPSAoS2V5d29yZCljQ29sbGFwc2libGVBc3NpZ25tZW50XzJfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0VHJlZToKKwkJLy8Je0NoYXJ0VHJlZX0gInRyZWUiIChtYXA/PSJtYXAiIHwgY29sbGFwc2libGU/PSJjb2xsYXBzaWJsZSIpOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0NoYXJ0VHJlZX0gInRyZWUiIChtYXA/PSJtYXAiIHwgY29sbGFwc2libGU/PSJjb2xsYXBzaWJsZSIpCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve0NoYXJ0VHJlZX0KKwkJcHVibGljIEFjdGlvbiBnZXRDaGFydFRyZWVBY3Rpb25fMCgpIHsgcmV0dXJuIGNDaGFydFRyZWVBY3Rpb25fMDsgfQorCisJCS8vInRyZWUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFRyZWVLZXl3b3JkXzEoKSB7IHJldHVybiBjVHJlZUtleXdvcmRfMTsgfQorCisJCS8vbWFwPz0ibWFwIiB8IGNvbGxhcHNpYmxlPz0iY29sbGFwc2libGUiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzXzIoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzXzI7IH0KKworCQkvL21hcD89Im1hcCIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TWFwQXNzaWdubWVudF8yXzAoKSB7IHJldHVybiBjTWFwQXNzaWdubWVudF8yXzA7IH0KKworCQkvLyJtYXAiCisJCXB1YmxpYyBLZXl3b3JkIGdldE1hcE1hcEtleXdvcmRfMl8wXzAoKSB7IHJldHVybiBjTWFwTWFwS2V5d29yZF8yXzBfMDsgfQorCisJCS8vY29sbGFwc2libGU/PSJjb2xsYXBzaWJsZSIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0Q29sbGFwc2libGVBc3NpZ25tZW50XzJfMSgpIHsgcmV0dXJuIGNDb2xsYXBzaWJsZUFzc2lnbm1lbnRfMl8xOyB9CisKKwkJLy8iY29sbGFwc2libGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldENvbGxhcHNpYmxlQ29sbGFwc2libGVLZXl3b3JkXzJfMV8wKCkgeyByZXR1cm4gY0NvbGxhcHNpYmxlQ29sbGFwc2libGVLZXl3b3JkXzJfMV8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIENoYXJ0SW50ZXJ2YWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRJbnRlcnZhbCIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydE51bWJlckludGVydmFsUGFyc2VyUnVsZUNhbGwgPSAoUnVsZUNhbGwpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL0NoYXJ0SW50ZXJ2YWw6CisJCS8vCUNoYXJ0TnVtYmVySW50ZXJ2YWw7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DaGFydE51bWJlckludGVydmFsCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRDaGFydE51bWJlckludGVydmFsUGFyc2VyUnVsZUNhbGwoKSB7IHJldHVybiBjQ2hhcnROdW1iZXJJbnRlcnZhbFBhcnNlclJ1bGVDYWxsOyB9CisJfQorCisJcHVibGljIGNsYXNzIENoYXJ0TnVtYmVySW50ZXJ2YWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnROdW1iZXJJbnRlcnZhbCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY0NoYXJ0TnVtYmVySW50ZXJ2YWxBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVcFRvS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTnVtYmVySW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljTnVtYmVySW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNOdW1iZXJSYW5nZUNoYXJ0UmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNOdW1iZXJSYW5nZUFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0TnVtYmVySW50ZXJ2YWw6CisJCS8vCXtDaGFydE51bWJlckludGVydmFsfSAidXAgdG8iIG51bWJlckludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIG51bWJlclJhbmdlPUNoYXJ0UmFuZ2VFbGVtZW50OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve0NoYXJ0TnVtYmVySW50ZXJ2YWx9ICJ1cCB0byIgbnVtYmVySW50ZXJ2YWxWYWx1ZT1TaWduZWROdW1iZXIgbnVtYmVyUmFuZ2U9Q2hhcnRSYW5nZUVsZW1lbnQKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Q2hhcnROdW1iZXJJbnRlcnZhbH0KKwkJcHVibGljIEFjdGlvbiBnZXRDaGFydE51bWJlckludGVydmFsQWN0aW9uXzAoKSB7IHJldHVybiBjQ2hhcnROdW1iZXJJbnRlcnZhbEFjdGlvbl8wOyB9CisKKwkJLy8idXAgdG8iCisJCXB1YmxpYyBLZXl3b3JkIGdldFVwVG9LZXl3b3JkXzEoKSB7IHJldHVybiBjVXBUb0tleXdvcmRfMTsgfQorCisJCS8vbnVtYmVySW50ZXJ2YWxWYWx1ZT1TaWduZWROdW1iZXIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZUFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNOdW1iZXJJbnRlcnZhbFZhbHVlQXNzaWdubWVudF8yOyB9CisKKwkJLy9TaWduZWROdW1iZXIKKwkJcHVibGljIFJ1bGVDYWxsIGdldE51bWJlckludGVydmFsVmFsdWVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjTnVtYmVySW50ZXJ2YWxWYWx1ZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vbnVtYmVyUmFuZ2U9Q2hhcnRSYW5nZUVsZW1lbnQKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TnVtYmVyUmFuZ2VBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjTnVtYmVyUmFuZ2VBc3NpZ25tZW50XzM7IH0KKworCQkvL0NoYXJ0UmFuZ2VFbGVtZW50CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROdW1iZXJSYW5nZUNoYXJ0UmFuZ2VFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY051bWJlclJhbmdlQ2hhcnRSYW5nZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnREYXRhbWFydEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDaGFydERhdGFtYXJ0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RhdGFtYXJ0S2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEYXRhbWFydFJlZkFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0RhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uQ3Jvc3NSZWZlcmVuY2VfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNEYXRhbWFydFJlZkFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0RhdGFtYXJ0UmVmRGF0YW1hcnREZWZpbml0aW9uSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xID0gKFJ1bGVDYWxsKWNEYXRhbWFydFJlZkRhdGFtYXJ0RGVmaW5pdGlvbkNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRWxlbWVudHNBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbGVtZW50c0NoYXJ0RWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljRWxlbWVudHNBc3NpZ25tZW50XzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80ID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJCisJCS8vQ2hhcnREYXRhbWFydDoKKwkJLy8JImRhdGFtYXJ0IiBkYXRhbWFydFJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0RGVmaW5pdGlvbl0gInsiIGVsZW1lbnRzKz1DaGFydEVsZW1lbnQqICJ9IjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJkYXRhbWFydCIgZGF0YW1hcnRSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dICJ7IiBlbGVtZW50cys9Q2hhcnRFbGVtZW50KiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iZGF0YW1hcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldERhdGFtYXJ0S2V5d29yZF8wKCkgeyByZXR1cm4gY0RhdGFtYXJ0S2V5d29yZF8wOyB9CisKKwkJLy9kYXRhbWFydFJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0RGVmaW5pdGlvbl0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RGF0YW1hcnRSZWZBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjRGF0YW1hcnRSZWZBc3NpZ25tZW50XzE7IH0KKworCQkvL1tkYXRhbWFydDo6RGF0YW1hcnREZWZpbml0aW9uXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0RGF0YW1hcnRSZWZEYXRhbWFydERlZmluaXRpb25Dcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjRGF0YW1hcnRSZWZEYXRhbWFydERlZmluaXRpb25Dcm9zc1JlZmVyZW5jZV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXREYXRhbWFydFJlZkRhdGFtYXJ0RGVmaW5pdGlvbklEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNEYXRhbWFydFJlZkRhdGFtYXJ0RGVmaW5pdGlvbklEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMjsgfQorCisJCS8vZWxlbWVudHMrPUNoYXJ0RWxlbWVudCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RWxlbWVudHNBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjRWxlbWVudHNBc3NpZ25tZW50XzM7IH0KKworCQkvL0NoYXJ0RWxlbWVudAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RWxlbWVudHNDaGFydEVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRWxlbWVudHNDaGFydEVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydEVsZW1lbnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRFbGVtZW50Iik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydEF4aXNQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNDaGFydExlZ2VuZFBhcnNlclJ1bGVDYWxsXzEgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0NoYXJ0SGlnaGxpZ2h0ZXJQYXJzZXJSdWxlQ2FsbF8yID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQkKKwkJLy9DaGFydEVsZW1lbnQ6CisJCS8vCUNoYXJ0QXhpcyB8IENoYXJ0TGVnZW5kIHwgQ2hhcnRIaWdobGlnaHRlcjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0NoYXJ0QXhpcyB8IENoYXJ0TGVnZW5kIHwgQ2hhcnRIaWdobGlnaHRlcgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0NoYXJ0QXhpcworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRBeGlzUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNDaGFydEF4aXNQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9DaGFydExlZ2VuZAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRMZWdlbmRQYXJzZXJSdWxlQ2FsbF8xKCkgeyByZXR1cm4gY0NoYXJ0TGVnZW5kUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vQ2hhcnRIaWdobGlnaHRlcgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Q2hhcnRIaWdobGlnaHRlclBhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjQ2hhcnRIaWdobGlnaHRlclBhcnNlclJ1bGVDYWxsXzI7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRMZWdlbmRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRMZWdlbmQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVnZW5kS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNQbGFjZW1lbnRBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNQbGFjZW1lbnRMZWdlbmRQbGFjZW1lbnRFbnVtRW51bVJ1bGVDYWxsXzFfMCA9IChSdWxlQ2FsbCljUGxhY2VtZW50QXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMiA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RvZ2dsZUFzc2lnbm1lbnRfMl8wID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1RvZ2dsZVRvZ2dsZUtleXdvcmRfMl8wXzAgPSAoS2V5d29yZCljVG9nZ2xlQXNzaWdubWVudF8yXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlcGxvdEFzc2lnbm1lbnRfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlcGxvdFJlcGxvdEtleXdvcmRfMl8xXzAgPSAoS2V5d29yZCljUmVwbG90QXNzaWdubWVudF8yXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1RvZ2dsZVR5cGVBc3NpZ25tZW50XzJfMiA9IChBc3NpZ25tZW50KWNHcm91cF8yLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVG9nZ2xlVHlwZVRvZ2dsZVR5cGVFbnVtRW51bVJ1bGVDYWxsXzJfMl8wID0gKFJ1bGVDYWxsKWNUb2dnbGVUeXBlQXNzaWdubWVudF8yXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9DaGFydExlZ2VuZDoKKwkJLy8JImxlZ2VuZCIgcGxhY2VtZW50PUxlZ2VuZFBsYWNlbWVudEVudW0gKHRvZ2dsZT89InRvZ2dsZSIgcmVwbG90Pz0icmVwbG90IiB0b2dnbGVUeXBlPVRvZ2dsZVR5cGVFbnVtKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8ibGVnZW5kIiBwbGFjZW1lbnQ9TGVnZW5kUGxhY2VtZW50RW51bSAodG9nZ2xlPz0idG9nZ2xlIiByZXBsb3Q/PSJyZXBsb3QiIHRvZ2dsZVR5cGU9VG9nZ2xlVHlwZUVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJsZWdlbmQiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZ2VuZEtleXdvcmRfMCgpIHsgcmV0dXJuIGNMZWdlbmRLZXl3b3JkXzA7IH0KKworCQkvL3BsYWNlbWVudD1MZWdlbmRQbGFjZW1lbnRFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBsYWNlbWVudEFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNQbGFjZW1lbnRBc3NpZ25tZW50XzE7IH0KKworCQkvL0xlZ2VuZFBsYWNlbWVudEVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFBsYWNlbWVudExlZ2VuZFBsYWNlbWVudEVudW1FbnVtUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY1BsYWNlbWVudExlZ2VuZFBsYWNlbWVudEVudW1FbnVtUnVsZUNhbGxfMV8wOyB9CisKKwkJLy8odG9nZ2xlPz0idG9nZ2xlIiByZXBsb3Q/PSJyZXBsb3QiIHRvZ2dsZVR5cGU9VG9nZ2xlVHlwZUVudW0pPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMigpIHsgcmV0dXJuIGNHcm91cF8yOyB9CisKKwkJLy90b2dnbGU/PSJ0b2dnbGUiCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFRvZ2dsZUFzc2lnbm1lbnRfMl8wKCkgeyByZXR1cm4gY1RvZ2dsZUFzc2lnbm1lbnRfMl8wOyB9CisKKwkJLy8idG9nZ2xlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUb2dnbGVUb2dnbGVLZXl3b3JkXzJfMF8wKCkgeyByZXR1cm4gY1RvZ2dsZVRvZ2dsZUtleXdvcmRfMl8wXzA7IH0KKworCQkvL3JlcGxvdD89InJlcGxvdCIKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0UmVwbG90QXNzaWdubWVudF8yXzEoKSB7IHJldHVybiBjUmVwbG90QXNzaWdubWVudF8yXzE7IH0KKworCQkvLyJyZXBsb3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlcGxvdFJlcGxvdEtleXdvcmRfMl8xXzAoKSB7IHJldHVybiBjUmVwbG90UmVwbG90S2V5d29yZF8yXzFfMDsgfQorCisJCS8vdG9nZ2xlVHlwZT1Ub2dnbGVUeXBlRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUb2dnbGVUeXBlQXNzaWdubWVudF8yXzIoKSB7IHJldHVybiBjVG9nZ2xlVHlwZUFzc2lnbm1lbnRfMl8yOyB9CisKKwkJLy9Ub2dnbGVUeXBlRW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VG9nZ2xlVHlwZVRvZ2dsZVR5cGVFbnVtRW51bVJ1bGVDYWxsXzJfMl8wKCkgeyByZXR1cm4gY1RvZ2dsZVR5cGVUb2dnbGVUeXBlRW51bUVudW1SdWxlQ2FsbF8yXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydEhpZ2hsaWdodGVyRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNoYXJ0SGlnaGxpZ2h0ZXIiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVG9vbHRpcEtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjTG9jYXRpb25Bc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNMb2NhdGlvblRvb2x0aXBMb2NhdGlvbkVudW1FbnVtUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNMb2NhdGlvbkFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzIgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNUb29sdGlwQWx3YXlzQXNzaWdubWVudF8yXzAgPSAoQXNzaWdubWVudCljR3JvdXBfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVG9vbHRpcEFsd2F5c0Fsd2F5c0tleXdvcmRfMl8wXzAgPSAoS2V5d29yZCljVG9vbHRpcEFsd2F5c0Fzc2lnbm1lbnRfMl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJbnNpZGVDaGFydEFzc2lnbm1lbnRfMl8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzIuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0luc2lkZUNoYXJ0SW5zaWRlS2V5d29yZF8yXzFfMCA9IChLZXl3b3JkKWNJbnNpZGVDaGFydEFzc2lnbm1lbnRfMl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vQ2hhcnRIaWdobGlnaHRlcjoKKwkJLy8JInRvb2x0aXAiIGxvY2F0aW9uPVRvb2x0aXBMb2NhdGlvbkVudW0gKHRvb2x0aXBBbHdheXM/PSJhbHdheXMiPyBpbnNpZGVDaGFydD89Imluc2lkZSI/KTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJ0b29sdGlwIiBsb2NhdGlvbj1Ub29sdGlwTG9jYXRpb25FbnVtICh0b29sdGlwQWx3YXlzPz0iYWx3YXlzIj8gaW5zaWRlQ2hhcnQ/PSJpbnNpZGUiPykKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8idG9vbHRpcCIKKwkJcHVibGljIEtleXdvcmQgZ2V0VG9vbHRpcEtleXdvcmRfMCgpIHsgcmV0dXJuIGNUb29sdGlwS2V5d29yZF8wOyB9CisKKwkJLy9sb2NhdGlvbj1Ub29sdGlwTG9jYXRpb25FbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldExvY2F0aW9uQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0xvY2F0aW9uQXNzaWdubWVudF8xOyB9CisKKwkJLy9Ub29sdGlwTG9jYXRpb25FbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRMb2NhdGlvblRvb2x0aXBMb2NhdGlvbkVudW1FbnVtUnVsZUNhbGxfMV8wKCkgeyByZXR1cm4gY0xvY2F0aW9uVG9vbHRpcExvY2F0aW9uRW51bUVudW1SdWxlQ2FsbF8xXzA7IH0KKworCQkvL3Rvb2x0aXBBbHdheXM/PSJhbHdheXMiPyBpbnNpZGVDaGFydD89Imluc2lkZSI/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF8yKCkgeyByZXR1cm4gY0dyb3VwXzI7IH0KKworCQkvL3Rvb2x0aXBBbHdheXM/PSJhbHdheXMiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRUb29sdGlwQWx3YXlzQXNzaWdubWVudF8yXzAoKSB7IHJldHVybiBjVG9vbHRpcEFsd2F5c0Fzc2lnbm1lbnRfMl8wOyB9CisKKwkJLy8iYWx3YXlzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUb29sdGlwQWx3YXlzQWx3YXlzS2V5d29yZF8yXzBfMCgpIHsgcmV0dXJuIGNUb29sdGlwQWx3YXlzQWx3YXlzS2V5d29yZF8yXzBfMDsgfQorCisJCS8vaW5zaWRlQ2hhcnQ/PSJpbnNpZGUiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJbnNpZGVDaGFydEFzc2lnbm1lbnRfMl8xKCkgeyByZXR1cm4gY0luc2lkZUNoYXJ0QXNzaWdubWVudF8yXzE7IH0KKworCQkvLyJpbnNpZGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEluc2lkZUNoYXJ0SW5zaWRlS2V5d29yZF8yXzFfMCgpIHsgcmV0dXJuIGNJbnNpZGVDaGFydEluc2lkZUtleXdvcmRfMl8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRBeGlzRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNoYXJ0QXhpcyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBeGlzS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBeGlzQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQXhpc0RhdGFtYXJ0QXhpc0Nyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljQXhpc0Fzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0F4aXNEYXRhbWFydEF4aXNJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0F4aXNEYXRhbWFydEF4aXNDcm9zc1JlZmVyZW5jZV8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JlbmRlcnNLZXl3b3JkXzIgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JlbmRlclR5cGVBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSZW5kZXJUeXBlUmVuZGVyVHlwZUVudW1FbnVtUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNSZW5kZXJUeXBlQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNTaG9ydExhYmVsQXNzaWdubWVudF80ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTaG9ydExhYmVsU2hvcnRMYWJlbEtleXdvcmRfNF8wID0gKEtleXdvcmQpY1Nob3J0TGFiZWxBc3NpZ25tZW50XzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF81ID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVGlja2FuZ2xlS2V5d29yZF81XzAgPSAoS2V5d29yZCljR3JvdXBfNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQW5nbGVBc3NpZ25tZW50XzVfMSA9IChBc3NpZ25tZW50KWNHcm91cF81LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQW5nbGVTaWduZWROdW1iZXJQYXJzZXJSdWxlQ2FsbF81XzFfMCA9IChSdWxlQ2FsbCljQW5nbGVBc3NpZ25tZW50XzVfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0QXhpczoKKwkJLy8JImF4aXMiIGF4aXM9W2RhdGFtYXJ0OjpEYXRhbWFydEF4aXNdICJyZW5kZXJzIiByZW5kZXJUeXBlPVJlbmRlclR5cGVFbnVtIHNob3J0TGFiZWw/PSJzaG9ydExhYmVsIj8gKCJ0aWNrYW5nbGUiCisJCS8vCWFuZ2xlPVNpZ25lZE51bWJlcik/OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vImF4aXMiIGF4aXM9W2RhdGFtYXJ0OjpEYXRhbWFydEF4aXNdICJyZW5kZXJzIiByZW5kZXJUeXBlPVJlbmRlclR5cGVFbnVtIHNob3J0TGFiZWw/PSJzaG9ydExhYmVsIj8gKCJ0aWNrYW5nbGUiCisJCS8vYW5nbGU9U2lnbmVkTnVtYmVyKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iYXhpcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0QXhpc0tleXdvcmRfMCgpIHsgcmV0dXJuIGNBeGlzS2V5d29yZF8wOyB9CisKKwkJLy9heGlzPVtkYXRhbWFydDo6RGF0YW1hcnRBeGlzXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRBeGlzQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0F4aXNBc3NpZ25tZW50XzE7IH0KKworCQkvL1tkYXRhbWFydDo6RGF0YW1hcnRBeGlzXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0QXhpc0RhdGFtYXJ0QXhpc0Nyb3NzUmVmZXJlbmNlXzFfMCgpIHsgcmV0dXJuIGNBeGlzRGF0YW1hcnRBeGlzQ3Jvc3NSZWZlcmVuY2VfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QXhpc0RhdGFtYXJ0QXhpc0lEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNBeGlzRGF0YW1hcnRBeGlzSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xOyB9CisKKwkJLy8icmVuZGVycyIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmVuZGVyc0tleXdvcmRfMigpIHsgcmV0dXJuIGNSZW5kZXJzS2V5d29yZF8yOyB9CisKKwkJLy9yZW5kZXJUeXBlPVJlbmRlclR5cGVFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJlbmRlclR5cGVBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjUmVuZGVyVHlwZUFzc2lnbm1lbnRfMzsgfQorCisJCS8vUmVuZGVyVHlwZUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldFJlbmRlclR5cGVSZW5kZXJUeXBlRW51bUVudW1SdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjUmVuZGVyVHlwZVJlbmRlclR5cGVFbnVtRW51bVJ1bGVDYWxsXzNfMDsgfQorCisJCS8vc2hvcnRMYWJlbD89InNob3J0TGFiZWwiPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRTaG9ydExhYmVsQXNzaWdubWVudF80KCkgeyByZXR1cm4gY1Nob3J0TGFiZWxBc3NpZ25tZW50XzQ7IH0KKworCQkvLyJzaG9ydExhYmVsIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTaG9ydExhYmVsU2hvcnRMYWJlbEtleXdvcmRfNF8wKCkgeyByZXR1cm4gY1Nob3J0TGFiZWxTaG9ydExhYmVsS2V5d29yZF80XzA7IH0KKworCQkvLygidGlja2FuZ2xlIiBhbmdsZT1TaWduZWROdW1iZXIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNSgpIHsgcmV0dXJuIGNHcm91cF81OyB9CisKKwkJLy8idGlja2FuZ2xlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRUaWNrYW5nbGVLZXl3b3JkXzVfMCgpIHsgcmV0dXJuIGNUaWNrYW5nbGVLZXl3b3JkXzVfMDsgfQorCisJCS8vYW5nbGU9U2lnbmVkTnVtYmVyCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEFuZ2xlQXNzaWdubWVudF81XzEoKSB7IHJldHVybiBjQW5nbGVBc3NpZ25tZW50XzVfMTsgfQorCisJCS8vU2lnbmVkTnVtYmVyCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRBbmdsZVNpZ25lZE51bWJlclBhcnNlclJ1bGVDYWxsXzVfMV8wKCkgeyByZXR1cm4gY0FuZ2xlU2lnbmVkTnVtYmVyUGFyc2VyUnVsZUNhbGxfNV8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRSYW5nZUVsZW1lbnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRSYW5nZUVsZW1lbnQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQ2hhcnRTZWdtZW50Q29sb3JQYXJzZXJSdWxlQ2FsbCA9IChSdWxlQ2FsbClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vQ2hhcnRSYW5nZUVsZW1lbnQ6CisJCS8vCUNoYXJ0U2VnbWVudENvbG9yOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vQ2hhcnRTZWdtZW50Q29sb3IKKwkJcHVibGljIFJ1bGVDYWxsIGdldENoYXJ0U2VnbWVudENvbG9yUGFyc2VyUnVsZUNhbGwoKSB7IHJldHVybiBjQ2hhcnRTZWdtZW50Q29sb3JQYXJzZXJSdWxlQ2FsbDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBDaGFydFNlZ21lbnRDb2xvckVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJDaGFydFNlZ21lbnRDb2xvciIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTZWdtZW50Y29sb3JLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1JnYkFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JnYlNUUklOR1Rlcm1pbmFsUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNSZ2JBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9DaGFydFNlZ21lbnRDb2xvcjoKKwkJLy8JInNlZ21lbnRjb2xvciIgcmdiPVNUUklORzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJzZWdtZW50Y29sb3IiIHJnYj1TVFJJTkcKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8ic2VnbWVudGNvbG9yIgorCQlwdWJsaWMgS2V5d29yZCBnZXRTZWdtZW50Y29sb3JLZXl3b3JkXzAoKSB7IHJldHVybiBjU2VnbWVudGNvbG9yS2V5d29yZF8wOyB9CisKKwkJLy9yZ2I9U1RSSU5HCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJnYkFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNSZ2JBc3NpZ25tZW50XzE7IH0KKworCQkvL1NUUklORworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UmdiU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjUmdiU1RSSU5HVGVybWluYWxSdWxlQ2FsbF8xXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRJbXBvcnRFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQ2hhcnRJbXBvcnQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSW1wb3J0S2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0ltcG9ydGVkTmFtZXNwYWNlQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0NoYXJ0SW1wb3J0IHJldHVybnMgdHlwZXM6OkxJbXBvcnQ6CisJCS8vCSJpbXBvcnQiIGltcG9ydGVkTmFtZXNwYWNlPUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJpbXBvcnQiIGltcG9ydGVkTmFtZXNwYWNlPUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJpbXBvcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEltcG9ydEtleXdvcmRfMCgpIHsgcmV0dXJuIGNJbXBvcnRLZXl3b3JkXzA7IH0KKworCQkvL2ltcG9ydGVkTmFtZXNwYWNlPUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMTsgfQorCisJCS8vQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbXBvcnRlZE5hbWVzcGFjZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNJbXBvcnRlZE5hbWVzcGFjZUNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBTaWduZWROdW1iZXJFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiU2lnbmVkTnVtYmVyIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0h5cGhlbk1pbnVzS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSU5UVGVybWluYWxSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvLy8vU2lnbmVkTnVtYmVyIHJldHVybnMgZWNvcmU6OkVEb3VibGU6CisJCS8vLy8JJy0nPyBOdW1iZXI7CisJCS8vU2lnbmVkTnVtYmVyIHJldHVybnMgZWNvcmU6OkVJbnQ6CisJCS8vCSgiLSI/IElOVCk/OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vKCItIj8gSU5UKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8iLSI/CisJCXB1YmxpYyBLZXl3b3JkIGdldEh5cGhlbk1pbnVzS2V5d29yZF8wKCkgeyByZXR1cm4gY0h5cGhlbk1pbnVzS2V5d29yZF8wOyB9CisKKwkJLy9JTlQKKwkJcHVibGljIFJ1bGVDYWxsIGdldElOVFRlcm1pbmFsUnVsZUNhbGxfMSgpIHsgcmV0dXJuIGNJTlRUZXJtaW5hbFJ1bGVDYWxsXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkNoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfMSA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0Z1bGxTdG9wS2V5d29yZF8xXzAgPSAoS2V5d29yZCljR3JvdXBfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQXN0ZXJpc2tLZXl3b3JkXzFfMSA9IChLZXl3b3JkKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOgorCQkvLwlRdWFsaWZpZWROYW1lICgiLiIgIioiKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9RdWFsaWZpZWROYW1lICgiLiIgIioiKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy9RdWFsaWZpZWROYW1lCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vKCIuIiAiKiIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfMSgpIHsgcmV0dXJuIGNHcm91cF8xOyB9CisKKwkJLy8iLiIKKwkJcHVibGljIEtleXdvcmQgZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNGdWxsU3RvcEtleXdvcmRfMV8wOyB9CisKKwkJLy8iKiIKKwkJcHVibGljIEtleXdvcmQgZ2V0QXN0ZXJpc2tLZXl3b3JkXzFfMSgpIHsgcmV0dXJuIGNBc3Rlcmlza0tleXdvcmRfMV8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRSQU5TTEFUQUJMRVNUUklOR0VsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUUkFOU0xBVEFCTEVTVFJJTkciKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjU1RSSU5HVGVybWluYWxSdWxlQ2FsbCA9IChSdWxlQ2FsbClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vVFJBTlNMQVRBQkxFU1RSSU5HOgorCQkvLwlTVFJJTkc7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9TVFJJTkcKKwkJcHVibGljIFJ1bGVDYWxsIGdldFNUUklOR1Rlcm1pbmFsUnVsZUNhbGwoKSB7IHJldHVybiBjU1RSSU5HVGVybWluYWxSdWxlQ2FsbDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBUUkFOU0xBVEFCTEVJREVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUUkFOU0xBVEFCTEVJRCIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJRFRlcm1pbmFsUnVsZUNhbGwgPSAoUnVsZUNhbGwpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1RSQU5TTEFUQUJMRUlEOgorCQkvLwlJRDsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSB7IHJldHVybiBjSURUZXJtaW5hbFJ1bGVDYWxsOyB9CisJfQorCQorCQorCXB1YmxpYyBjbGFzcyBMZWdlbmRQbGFjZW1lbnRFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkxlZ2VuZFBsYWNlbWVudEVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjSU5TSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjSU5TSURFSW5zaWRlS2V5d29yZF8wXzAgPSAoS2V5d29yZCljSU5TSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNJTlNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0lOU0lERV9HUklESW5zaWRlR3JpZEtleXdvcmRfMV8wID0gKEtleXdvcmQpY0lOU0lERV9HUklERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNPVVRTSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjT1VUU0lERU91dHNpZGVLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNPVVRTSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNPVVRTSURFX0dSSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNPVVRTSURFX0dSSURPdXRzaWRlR3JpZEtleXdvcmRfM18wID0gKEtleXdvcmQpY09VVFNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gTGVnZW5kUGxhY2VtZW50RW51bToKKwkJLy8JSU5TSURFPSJpbnNpZGUiIHwgSU5TSURFX0dSSUQ9Imluc2lkZS1ncmlkIiB8IE9VVFNJREU9Im91dHNpZGUiIHwgT1VUU0lERV9HUklEPSJvdXRzaWRlLWdyaWQiOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL0lOU0lERT0iaW5zaWRlIiB8IElOU0lERV9HUklEPSJpbnNpZGUtZ3JpZCIgfCBPVVRTSURFPSJvdXRzaWRlIiB8IE9VVFNJREVfR1JJRD0ib3V0c2lkZS1ncmlkIgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL0lOU0lERT0iaW5zaWRlIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRJTlNJREVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjSU5TSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8iaW5zaWRlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRJTlNJREVJbnNpZGVLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNJTlNJREVJbnNpZGVLZXl3b3JkXzBfMDsgfQorCisJCS8vSU5TSURFX0dSSUQ9Imluc2lkZS1ncmlkIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRJTlNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNJTlNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vImluc2lkZS1ncmlkIgorCQlwdWJsaWMgS2V5d29yZCBnZXRJTlNJREVfR1JJREluc2lkZUdyaWRLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNJTlNJREVfR1JJREluc2lkZUdyaWRLZXl3b3JkXzFfMDsgfQorCisJCS8vT1VUU0lERT0ib3V0c2lkZSIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0T1VUU0lERUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNPVVRTSURFRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8ib3V0c2lkZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0T1VUU0lERU91dHNpZGVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNPVVRTSURFT3V0c2lkZUtleXdvcmRfMl8wOyB9CisKKwkJLy9PVVRTSURFX0dSSUQ9Im91dHNpZGUtZ3JpZCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0T1VUU0lERV9HUklERW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY09VVFNJREVfR1JJREVudW1MaXRlcmFsRGVjbGFyYXRpb25fMzsgfQorCisJCS8vIm91dHNpZGUtZ3JpZCIKKwkJcHVibGljIEtleXdvcmQgZ2V0T1VUU0lERV9HUklET3V0c2lkZUdyaWRLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNPVVRTSURFX0dSSURPdXRzaWRlR3JpZEtleXdvcmRfM18wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFRvZ2dsZVR5cGVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlRvZ2dsZVR5cGVFbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY05PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY05PUk1BTE5vcm1hbEtleXdvcmRfMF8wID0gKEtleXdvcmQpY05PUk1BTEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjU0xPV0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1NMT1dTbG93S2V5d29yZF8xXzAgPSAoS2V5d29yZCljU0xPV0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjRkFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ZBU1RGYXN0S2V5d29yZF8yXzAgPSAoS2V5d29yZCljRkFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gVG9nZ2xlVHlwZUVudW06CisJCS8vCU5PUk1BTD0ibm9ybWFsIiB8IFNMT1c9InNsb3ciIHwgRkFTVD0iZmFzdCI7CisJCXB1YmxpYyBFbnVtUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vTk9STUFMPSJub3JtYWwiIHwgU0xPVz0ic2xvdyIgfCBGQVNUPSJmYXN0IgorCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL05PUk1BTD0ibm9ybWFsIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROT1JNQUxFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSB7IHJldHVybiBjTk9STUFMRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wOyB9CisKKwkJLy8ibm9ybWFsIgorCQlwdWJsaWMgS2V5d29yZCBnZXROT1JNQUxOb3JtYWxLZXl3b3JkXzBfMCgpIHsgcmV0dXJuIGNOT1JNQUxOb3JtYWxLZXl3b3JkXzBfMDsgfQorCisJCS8vU0xPVz0ic2xvdyIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0U0xPV0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNTTE9XRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xOyB9CisKKwkJLy8ic2xvdyIKKwkJcHVibGljIEtleXdvcmQgZ2V0U0xPV1Nsb3dLZXl3b3JkXzFfMCgpIHsgcmV0dXJuIGNTTE9XU2xvd0tleXdvcmRfMV8wOyB9CisKKwkJLy9GQVNUPSJmYXN0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRGQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY0ZBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJmYXN0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRGQVNURmFzdEtleXdvcmRfMl8wKCkgeyByZXR1cm4gY0ZBU1RGYXN0S2V5d29yZF8yXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVG9vbHRpcExvY2F0aW9uRW51bUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RFbnVtUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIEVudW1SdWxlIHJ1bGUgPSAoRW51bVJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJUb29sdGlwTG9jYXRpb25FbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY05PUlRIRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTk9SVEhOb3J0aEtleXdvcmRfMF8wID0gKEtleXdvcmQpY05PUlRIRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNOT1JUSF9FQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTk9SVEhfRUFTVE5vcnRoRWFzdEtleXdvcmRfMV8wID0gKEtleXdvcmQpY05PUlRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFQVNURWFzdEtleXdvcmRfMl8wID0gKEtleXdvcmQpY0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1NPVVRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTT1VUSF9FQVNUU291dGhFYXN0S2V5d29yZF8zXzAgPSAoS2V5d29yZCljU09VVEhfRUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjU09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTT1VUSFNvdXRoS2V5d29yZF80XzAgPSAoS2V5d29yZCljU09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1NPVVRIX1dFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzUgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTT1VUSF9XRVNUU291dGhXZXN0S2V5d29yZF81XzAgPSAoS2V5d29yZCljU09VVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDYpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1dFU1RXZXN0S2V5d29yZF82XzAgPSAoS2V5d29yZCljV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjTk9SVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDcpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY05PUlRIX1dFU1ROb3J0aFdlc3RLZXl3b3JkXzdfMCA9IChLZXl3b3JkKWNOT1JUSF9XRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl83LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBUb29sdGlwTG9jYXRpb25FbnVtOgorCQkvLwlOT1JUSD0ibm9ydGgiIHwgTk9SVEhfRUFTVD0ibm9ydGgtZWFzdCIgfCBFQVNUPSJlYXN0IiB8IFNPVVRIX0VBU1Q9InNvdXRoLWVhc3QiIHwgU09VVEg9InNvdXRoIiB8CisJCS8vCVNPVVRIX1dFU1Q9InNvdXRoLXdlc3QiIHwgV0VTVD0id2VzdCIgfCBOT1JUSF9XRVNUPSJub3J0aC13ZXN0IjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9OT1JUSD0ibm9ydGgiIHwgTk9SVEhfRUFTVD0ibm9ydGgtZWFzdCIgfCBFQVNUPSJlYXN0IiB8IFNPVVRIX0VBU1Q9InNvdXRoLWVhc3QiIHwgU09VVEg9InNvdXRoIiB8CisJCS8vU09VVEhfV0VTVD0ic291dGgtd2VzdCIgfCBXRVNUPSJ3ZXN0IiB8IE5PUlRIX1dFU1Q9Im5vcnRoLXdlc3QiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vTk9SVEg9Im5vcnRoIgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROT1JUSEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNOT1JUSEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vIm5vcnRoIgorCQlwdWJsaWMgS2V5d29yZCBnZXROT1JUSE5vcnRoS2V5d29yZF8wXzAoKSB7IHJldHVybiBjTk9SVEhOb3J0aEtleXdvcmRfMF8wOyB9CisKKwkJLy9OT1JUSF9FQVNUPSJub3J0aC1lYXN0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROT1JUSF9FQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY05PUlRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzE7IH0KKworCQkvLyJub3J0aC1lYXN0IgorCQlwdWJsaWMgS2V5d29yZCBnZXROT1JUSF9FQVNUTm9ydGhFYXN0S2V5d29yZF8xXzAoKSB7IHJldHVybiBjTk9SVEhfRUFTVE5vcnRoRWFzdEtleXdvcmRfMV8wOyB9CisKKwkJLy9FQVNUPSJlYXN0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRFQVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzI7IH0KKworCQkvLyJlYXN0IgorCQlwdWJsaWMgS2V5d29yZCBnZXRFQVNURWFzdEtleXdvcmRfMl8wKCkgeyByZXR1cm4gY0VBU1RFYXN0S2V5d29yZF8yXzA7IH0KKworCQkvL1NPVVRIX0VBU1Q9InNvdXRoLWVhc3QiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFNPVVRIX0VBU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjU09VVEhfRUFTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMzsgfQorCisJCS8vInNvdXRoLWVhc3QiCisJCXB1YmxpYyBLZXl3b3JkIGdldFNPVVRIX0VBU1RTb3V0aEVhc3RLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNTT1VUSF9FQVNUU291dGhFYXN0S2V5d29yZF8zXzA7IH0KKworCQkvL1NPVVRIPSJzb3V0aCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0U09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjU09VVEhFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJzb3V0aCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U09VVEhTb3V0aEtleXdvcmRfNF8wKCkgeyByZXR1cm4gY1NPVVRIU291dGhLZXl3b3JkXzRfMDsgfQorCisJCS8vU09VVEhfV0VTVD0ic291dGgtd2VzdCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0U09VVEhfV0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNSgpIHsgcmV0dXJuIGNTT1VUSF9XRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl81OyB9CisKKwkJLy8ic291dGgtd2VzdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0U09VVEhfV0VTVFNvdXRoV2VzdEtleXdvcmRfNV8wKCkgeyByZXR1cm4gY1NPVVRIX1dFU1RTb3V0aFdlc3RLZXl3b3JkXzVfMDsgfQorCisJCS8vV0VTVD0id2VzdCIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0V0VTVEVudW1MaXRlcmFsRGVjbGFyYXRpb25fNigpIHsgcmV0dXJuIGNXRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl82OyB9CisKKwkJLy8id2VzdCIKKwkJcHVibGljIEtleXdvcmQgZ2V0V0VTVFdlc3RLZXl3b3JkXzZfMCgpIHsgcmV0dXJuIGNXRVNUV2VzdEtleXdvcmRfNl8wOyB9CisKKwkJLy9OT1JUSF9XRVNUPSJub3J0aC13ZXN0IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROT1JUSF9XRVNURW51bUxpdGVyYWxEZWNsYXJhdGlvbl83KCkgeyByZXR1cm4gY05PUlRIX1dFU1RFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzc7IH0KKworCQkvLyJub3J0aC13ZXN0IgorCQlwdWJsaWMgS2V5d29yZCBnZXROT1JUSF9XRVNUTm9ydGhXZXN0S2V5d29yZF83XzAoKSB7IHJldHVybiBjTk9SVEhfV0VTVE5vcnRoV2VzdEtleXdvcmRfN18wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJlbmRlclR5cGVFbnVtRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdEVudW1SdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgRW51bVJ1bGUgcnVsZSA9IChFbnVtUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJlbmRlclR5cGVFbnVtIik7CisJCXByaXZhdGUgZmluYWwgQWx0ZXJuYXRpdmVzIGNBbHRlcm5hdGl2ZXMgPSAoQWx0ZXJuYXRpdmVzKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0NBVEVHT1JZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQ0FURUdPUllDYXRlZ29yeUtleXdvcmRfMF8wID0gKEtleXdvcmQpY0NBVEVHT1JZRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNMSU5FQVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMSU5FQVJMaW5lYXJLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNMSU5FQVJFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0RBVEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNEQVRFRGF0ZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY0RBVEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0xPR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMyA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xPR0xvZ2FyaXRobWljS2V5d29yZF8zXzAgPSAoS2V5d29yZCljTE9HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNQWVJBTUlERW51bUxpdGVyYWxEZWNsYXJhdGlvbl80ID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoNCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUFlSQU1JRFB5cmFtaWRLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNQWVJBTUlERW51bUxpdGVyYWxEZWNsYXJhdGlvbl80LmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBSZW5kZXJUeXBlRW51bToKKwkJLy8JQ0FURUdPUlk9ImNhdGVnb3J5IiB8IExJTkVBUj0ibGluZWFyIiB8IERBVEU9ImRhdGUiIHwgTE9HPSJsb2dhcml0aG1pYyIgfCBQWVJBTUlEPSJweXJhbWlkIjsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9DQVRFR09SWT0iY2F0ZWdvcnkiIHwgTElORUFSPSJsaW5lYXIiIHwgREFURT0iZGF0ZSIgfCBMT0c9ImxvZ2FyaXRobWljIiB8IFBZUkFNSUQ9InB5cmFtaWQiCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vQ0FURUdPUlk9ImNhdGVnb3J5IgorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRDQVRFR09SWUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNDQVRFR09SWUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMDsgfQorCisJCS8vImNhdGVnb3J5IgorCQlwdWJsaWMgS2V5d29yZCBnZXRDQVRFR09SWUNhdGVnb3J5S2V5d29yZF8wXzAoKSB7IHJldHVybiBjQ0FURUdPUllDYXRlZ29yeUtleXdvcmRfMF8wOyB9CisKKwkJLy9MSU5FQVI9ImxpbmVhciIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0TElORUFSRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY0xJTkVBUkVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vImxpbmVhciIKKwkJcHVibGljIEtleXdvcmQgZ2V0TElORUFSTGluZWFyS2V5d29yZF8xXzAoKSB7IHJldHVybiBjTElORUFSTGluZWFyS2V5d29yZF8xXzA7IH0KKworCQkvL0RBVEU9ImRhdGUiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldERBVEVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSB7IHJldHVybiBjREFURUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vImRhdGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldERBVEVEYXRlS2V5d29yZF8yXzAoKSB7IHJldHVybiBjREFURURhdGVLZXl3b3JkXzJfMDsgfQorCisJCS8vTE9HPSJsb2dhcml0aG1pYyIKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0TE9HRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkgeyByZXR1cm4gY0xPR0VudW1MaXRlcmFsRGVjbGFyYXRpb25fMzsgfQorCisJCS8vImxvZ2FyaXRobWljIgorCQlwdWJsaWMgS2V5d29yZCBnZXRMT0dMb2dhcml0aG1pY0tleXdvcmRfM18wKCkgeyByZXR1cm4gY0xPR0xvZ2FyaXRobWljS2V5d29yZF8zXzA7IH0KKworCQkvL1BZUkFNSUQ9InB5cmFtaWQiCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFBZUkFNSURFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQoKSB7IHJldHVybiBjUFlSQU1JREVudW1MaXRlcmFsRGVjbGFyYXRpb25fNDsgfQorCisJCS8vInB5cmFtaWQiCisJCXB1YmxpYyBLZXl3b3JkIGdldFBZUkFNSURQeXJhbWlkS2V5d29yZF80XzAoKSB7IHJldHVybiBjUFlSQU1JRFB5cmFtaWRLZXl3b3JkXzRfMDsgfQorCX0KKwkKKwlwcml2YXRlIGZpbmFsIENoYXJ0TW9kZWxFbGVtZW50cyBwQ2hhcnRNb2RlbDsKKwlwcml2YXRlIGZpbmFsIENoYXJ0UGFja2FnZUVsZW1lbnRzIHBDaGFydFBhY2thZ2U7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEVsZW1lbnRzIHBDaGFydDsKKwlwcml2YXRlIGZpbmFsIENoYXJ0T3B0aW9uRWxlbWVudHMgcENoYXJ0T3B0aW9uOworCXByaXZhdGUgZmluYWwgQ2hhcnRCYXJFbGVtZW50cyBwQ2hhcnRCYXI7CisJcHJpdmF0ZSBmaW5hbCBDaGFydExpbmVFbGVtZW50cyBwQ2hhcnRMaW5lOworCXByaXZhdGUgZmluYWwgQ2hhcnRQaWVFbGVtZW50cyBwQ2hhcnRQaWU7CisJcHJpdmF0ZSBmaW5hbCBDaGFydERvbnV0RWxlbWVudHMgcENoYXJ0RG9udXQ7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEJ1YmJsZUVsZW1lbnRzIHBDaGFydEJ1YmJsZTsKKwlwcml2YXRlIGZpbmFsIENoYXJ0R2F1Z2VFbGVtZW50cyBwQ2hhcnRHYXVnZTsKKwlwcml2YXRlIGZpbmFsIENoYXJ0VHJlZUVsZW1lbnRzIHBDaGFydFRyZWU7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEludGVydmFsRWxlbWVudHMgcENoYXJ0SW50ZXJ2YWw7CisJcHJpdmF0ZSBmaW5hbCBDaGFydE51bWJlckludGVydmFsRWxlbWVudHMgcENoYXJ0TnVtYmVySW50ZXJ2YWw7CisJcHJpdmF0ZSBmaW5hbCBDaGFydERhdGFtYXJ0RWxlbWVudHMgcENoYXJ0RGF0YW1hcnQ7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEVsZW1lbnRFbGVtZW50cyBwQ2hhcnRFbGVtZW50OworCXByaXZhdGUgZmluYWwgQ2hhcnRMZWdlbmRFbGVtZW50cyBwQ2hhcnRMZWdlbmQ7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEhpZ2hsaWdodGVyRWxlbWVudHMgcENoYXJ0SGlnaGxpZ2h0ZXI7CisJcHJpdmF0ZSBmaW5hbCBDaGFydEF4aXNFbGVtZW50cyBwQ2hhcnRBeGlzOworCXByaXZhdGUgZmluYWwgQ2hhcnRSYW5nZUVsZW1lbnRFbGVtZW50cyBwQ2hhcnRSYW5nZUVsZW1lbnQ7CisJcHJpdmF0ZSBmaW5hbCBDaGFydFNlZ21lbnRDb2xvckVsZW1lbnRzIHBDaGFydFNlZ21lbnRDb2xvcjsKKwlwcml2YXRlIGZpbmFsIENoYXJ0SW1wb3J0RWxlbWVudHMgcENoYXJ0SW1wb3J0OworCXByaXZhdGUgZmluYWwgU2lnbmVkTnVtYmVyRWxlbWVudHMgcFNpZ25lZE51bWJlcjsKKwlwcml2YXRlIGZpbmFsIENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEVsZW1lbnRzIHBDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJcHJpdmF0ZSBmaW5hbCBUUkFOU0xBVEFCTEVTVFJJTkdFbGVtZW50cyBwVFJBTlNMQVRBQkxFU1RSSU5HOworCXByaXZhdGUgZmluYWwgVFJBTlNMQVRBQkxFSURFbGVtZW50cyBwVFJBTlNMQVRBQkxFSUQ7CisJcHJpdmF0ZSBmaW5hbCBMZWdlbmRQbGFjZW1lbnRFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtOworCXByaXZhdGUgZmluYWwgVG9nZ2xlVHlwZUVudW1FbGVtZW50cyB1bmtub3duUnVsZVRvZ2dsZVR5cGVFbnVtOworCXByaXZhdGUgZmluYWwgVG9vbHRpcExvY2F0aW9uRW51bUVsZW1lbnRzIHVua25vd25SdWxlVG9vbHRpcExvY2F0aW9uRW51bTsKKwlwcml2YXRlIGZpbmFsIFJlbmRlclR5cGVFbnVtRWxlbWVudHMgdW5rbm93blJ1bGVSZW5kZXJUeXBlRW51bTsKKwkKKwlwcml2YXRlIGZpbmFsIEdyYW1tYXIgZ3JhbW1hcjsKKworCXByaXZhdGUgZmluYWwgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnM7CisKKwlASW5qZWN0CisJcHVibGljIENoYXJ0RFNMR3JhbW1hckFjY2VzcyhHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyLAorCQlYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MgZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucykgeworCQl0aGlzLmdyYW1tYXIgPSBpbnRlcm5hbEZpbmRHcmFtbWFyKGdyYW1tYXJQcm92aWRlcik7CisJCXRoaXMuZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucyA9IGdhWGJhc2VXaXRoQW5ub3RhdGlvbnM7CisJCXRoaXMucENoYXJ0TW9kZWwgPSBuZXcgQ2hhcnRNb2RlbEVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0UGFja2FnZSA9IG5ldyBDaGFydFBhY2thZ2VFbGVtZW50cygpOworCQl0aGlzLnBDaGFydCA9IG5ldyBDaGFydEVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0T3B0aW9uID0gbmV3IENoYXJ0T3B0aW9uRWxlbWVudHMoKTsKKwkJdGhpcy5wQ2hhcnRCYXIgPSBuZXcgQ2hhcnRCYXJFbGVtZW50cygpOworCQl0aGlzLnBDaGFydExpbmUgPSBuZXcgQ2hhcnRMaW5lRWxlbWVudHMoKTsKKwkJdGhpcy5wQ2hhcnRQaWUgPSBuZXcgQ2hhcnRQaWVFbGVtZW50cygpOworCQl0aGlzLnBDaGFydERvbnV0ID0gbmV3IENoYXJ0RG9udXRFbGVtZW50cygpOworCQl0aGlzLnBDaGFydEJ1YmJsZSA9IG5ldyBDaGFydEJ1YmJsZUVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0R2F1Z2UgPSBuZXcgQ2hhcnRHYXVnZUVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0VHJlZSA9IG5ldyBDaGFydFRyZWVFbGVtZW50cygpOworCQl0aGlzLnBDaGFydEludGVydmFsID0gbmV3IENoYXJ0SW50ZXJ2YWxFbGVtZW50cygpOworCQl0aGlzLnBDaGFydE51bWJlckludGVydmFsID0gbmV3IENoYXJ0TnVtYmVySW50ZXJ2YWxFbGVtZW50cygpOworCQl0aGlzLnBDaGFydERhdGFtYXJ0ID0gbmV3IENoYXJ0RGF0YW1hcnRFbGVtZW50cygpOworCQl0aGlzLnBDaGFydEVsZW1lbnQgPSBuZXcgQ2hhcnRFbGVtZW50RWxlbWVudHMoKTsKKwkJdGhpcy5wQ2hhcnRMZWdlbmQgPSBuZXcgQ2hhcnRMZWdlbmRFbGVtZW50cygpOworCQl0aGlzLnBDaGFydEhpZ2hsaWdodGVyID0gbmV3IENoYXJ0SGlnaGxpZ2h0ZXJFbGVtZW50cygpOworCQl0aGlzLnBDaGFydEF4aXMgPSBuZXcgQ2hhcnRBeGlzRWxlbWVudHMoKTsKKwkJdGhpcy5wQ2hhcnRSYW5nZUVsZW1lbnQgPSBuZXcgQ2hhcnRSYW5nZUVsZW1lbnRFbGVtZW50cygpOworCQl0aGlzLnBDaGFydFNlZ21lbnRDb2xvciA9IG5ldyBDaGFydFNlZ21lbnRDb2xvckVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0SW1wb3J0ID0gbmV3IENoYXJ0SW1wb3J0RWxlbWVudHMoKTsKKwkJdGhpcy5wU2lnbmVkTnVtYmVyID0gbmV3IFNpZ25lZE51bWJlckVsZW1lbnRzKCk7CisJCXRoaXMucENoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG5ldyBDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cygpOworCQl0aGlzLnBUUkFOU0xBVEFCTEVTVFJJTkcgPSBuZXcgVFJBTlNMQVRBQkxFU1RSSU5HRWxlbWVudHMoKTsKKwkJdGhpcy5wVFJBTlNMQVRBQkxFSUQgPSBuZXcgVFJBTlNMQVRBQkxFSURFbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlTGVnZW5kUGxhY2VtZW50RW51bSA9IG5ldyBMZWdlbmRQbGFjZW1lbnRFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVRvZ2dsZVR5cGVFbnVtID0gbmV3IFRvZ2dsZVR5cGVFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVRvb2x0aXBMb2NhdGlvbkVudW0gPSBuZXcgVG9vbHRpcExvY2F0aW9uRW51bUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVSZW5kZXJUeXBlRW51bSA9IG5ldyBSZW5kZXJUeXBlRW51bUVsZW1lbnRzKCk7CisJfQorCQorCXByb3RlY3RlZCBHcmFtbWFyIGludGVybmFsRmluZEdyYW1tYXIoR3JhbW1hclByb3ZpZGVyIGdyYW1tYXJQcm92aWRlcikgeworCQlHcmFtbWFyIGdyYW1tYXIgPSBncmFtbWFyUHJvdmlkZXIuZ2V0R3JhbW1hcih0aGlzKTsKKwkJd2hpbGUgKGdyYW1tYXIgIT0gbnVsbCkgeworCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMIi5lcXVhbHMoZ3JhbW1hci5nZXROYW1lKCkpKSB7CisJCQkJcmV0dXJuIGdyYW1tYXI7CisJCQl9CisJCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZ3JhbW1hci5nZXRVc2VkR3JhbW1hcnMoKTsKKwkJCWlmICghZ3JhbW1hcnMuaXNFbXB0eSgpKSB7CisJCQkJZ3JhbW1hciA9IGdyYW1tYXJzLml0ZXJhdG9yKCkubmV4dCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JhbW1hcjsKKwl9CisJCisJCisJcHVibGljIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKwkJcmV0dXJuIGdyYW1tYXI7CisJfQorCQorCisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2VzcyBnZXRYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zOworCX0KKworCQorCS8vQ2hhcnRNb2RlbDoKKwkvLwlwYWNrYWdlcys9Q2hhcnRQYWNrYWdlKjsKKwlwdWJsaWMgQ2hhcnRNb2RlbEVsZW1lbnRzIGdldENoYXJ0TW9kZWxBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRNb2RlbDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q2hhcnRNb2RlbFJ1bGUoKSB7CisJCXJldHVybiBnZXRDaGFydE1vZGVsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRQYWNrYWdlOgorCS8vCXtDaGFydFBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgKCJ7IiBpbXBvcnRzKz1DaGFydEltcG9ydCogY2hhcnRzKz1DaGFydCogIn0iKT87CisJcHVibGljIENoYXJ0UGFja2FnZUVsZW1lbnRzIGdldENoYXJ0UGFja2FnZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydFBhY2thZ2U7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0UGFja2FnZVJ1bGUoKSB7CisJCXJldHVybiBnZXRDaGFydFBhY2thZ2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydDoKKwkvLwl7Q2hhcnR9ICJjaGFydCIgbmFtZT1UUkFOU0xBVEFCTEVJRCAoZGVzY3JpcHRpb24/PSJkZXNjcmliZWQgYnkiIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gImFzIgorCS8vCWNoYXJ0dHlwZT1DaGFydE9wdGlvbiAocG9sbGluZz89InBvbGxpbmciIHBvbGxpbmdUaW1lPUlOVCk/ICgidXNpbmciIHNvdXJjZT1DaGFydERhdGFtYXJ0KT87CisJcHVibGljIENoYXJ0RWxlbWVudHMgZ2V0Q2hhcnRBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0UnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRPcHRpb246CisJLy8JQ2hhcnRCYXIgfCBDaGFydExpbmUgfCBDaGFydFBpZSB8IENoYXJ0RG9udXQgfCBDaGFydEJ1YmJsZSB8IENoYXJ0R2F1Z2UgfCBDaGFydFRyZWU7CisJcHVibGljIENoYXJ0T3B0aW9uRWxlbWVudHMgZ2V0Q2hhcnRPcHRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRPcHRpb247CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0T3B0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0T3B0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRCYXI6CisJLy8Je0NoYXJ0QmFyfSAiYmFyIiAoc2hhZG93Pz0ic2hhZGVkIj8gJiBhbmltYXRlZD89ImFuaW1hdGVkIj8gJiBzd2FwcGVkPz0ic3dhcHBlZCI/ICYgc3RhY2tlZD89InN0YWNrZWQiPyk7CisJcHVibGljIENoYXJ0QmFyRWxlbWVudHMgZ2V0Q2hhcnRCYXJBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRCYXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0QmFyUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0QmFyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRMaW5lOgorCS8vCXtDaGFydExpbmV9ICJsaW5lIiAoYW5pbWF0ZWQ/PSJhbmltYXRlZCI/ICYgc2hvd01hcmtlcj89InNob3dNYXJrZXIiPyAmIHRyZW5kTGluZT89InRyZW5kTGluZSI/ICYgKGN1cnNvcj89ImN1cnNvciIKKwkvLwl6b29tPz0iem9vbSI/IHRvb2x0aXA/PSJ0b29sdGlwIj8pPyAmIGZpbGxUb1plcm8/PSJmaWxsWmVybyI/ICYgZmlsbEFyZWE/PSJmaWxsZWQiPyk7CisJcHVibGljIENoYXJ0TGluZUVsZW1lbnRzIGdldENoYXJ0TGluZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydExpbmU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0TGluZVJ1bGUoKSB7CisJCXJldHVybiBnZXRDaGFydExpbmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydFBpZToKKwkvLwl7Q2hhcnRQaWV9ICJwaWUiIGVtcHR5Pz0iZW1wdHkiPzsKKwlwdWJsaWMgQ2hhcnRQaWVFbGVtZW50cyBnZXRDaGFydFBpZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydFBpZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q2hhcnRQaWVSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnRQaWVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydERvbnV0OgorCS8vCXtDaGFydERvbnV0fSAiZG9udXQiOworCXB1YmxpYyBDaGFydERvbnV0RWxlbWVudHMgZ2V0Q2hhcnREb251dEFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydERvbnV0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydERvbnV0UnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0RG9udXRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydEJ1YmJsZToKKwkvLwl7Q2hhcnRCdWJibGV9ICJidWJibGUiICgobXVsdGlwbGllcj89Im11bHRpcGxpZXIiIG11bHRpcGxpZXJWYWx1ZT1OdW1iZXIpPyAmIChncmFkaWVudD89ImdyYWRpZW50IiB8CisJLy8JdHJhbnNwYXJlbnQ/PSJ0cmFuc3BhcmVudCIpKT87CisJcHVibGljIENoYXJ0QnViYmxlRWxlbWVudHMgZ2V0Q2hhcnRCdWJibGVBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRCdWJibGU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0QnViYmxlUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0QnViYmxlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRHYXVnZToKKwkvLwl7Q2hhcnRHYXVnZX0gImdhdWdlIiAoKGxhYmVsZWQ/PSJsYWJlbCIgbGFiZWxWYWx1ZT1TVFJJTkcpPyAmIChoYXNUaWNrcz89Imhhc1RpY2tzIiAibWluaW11bSIgbWluVmFsdWU9SU5UICJtYXhpbXVtIgorCS8vCW1heFZhbHVlPUlOVCk/ICYgKGhhc0ludGVydmFscz89ImludGVydmFscyIgInsiIGludGVydmFscys9Q2hhcnRJbnRlcnZhbCogIn0iKT8pOworCXB1YmxpYyBDaGFydEdhdWdlRWxlbWVudHMgZ2V0Q2hhcnRHYXVnZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydEdhdWdlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydEdhdWdlUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0R2F1Z2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydFRyZWU6CisJLy8Je0NoYXJ0VHJlZX0gInRyZWUiIChtYXA/PSJtYXAiIHwgY29sbGFwc2libGU/PSJjb2xsYXBzaWJsZSIpOworCXB1YmxpYyBDaGFydFRyZWVFbGVtZW50cyBnZXRDaGFydFRyZWVBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRUcmVlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydFRyZWVSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnRUcmVlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRJbnRlcnZhbDoKKwkvLwlDaGFydE51bWJlckludGVydmFsOworCXB1YmxpYyBDaGFydEludGVydmFsRWxlbWVudHMgZ2V0Q2hhcnRJbnRlcnZhbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydEludGVydmFsOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydEludGVydmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0SW50ZXJ2YWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydE51bWJlckludGVydmFsOgorCS8vCXtDaGFydE51bWJlckludGVydmFsfSAidXAgdG8iIG51bWJlckludGVydmFsVmFsdWU9U2lnbmVkTnVtYmVyIG51bWJlclJhbmdlPUNoYXJ0UmFuZ2VFbGVtZW50OworCXB1YmxpYyBDaGFydE51bWJlckludGVydmFsRWxlbWVudHMgZ2V0Q2hhcnROdW1iZXJJbnRlcnZhbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydE51bWJlckludGVydmFsOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydE51bWJlckludGVydmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0TnVtYmVySW50ZXJ2YWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydERhdGFtYXJ0OgorCS8vCSJkYXRhbWFydCIgZGF0YW1hcnRSZWY9W2RhdGFtYXJ0OjpEYXRhbWFydERlZmluaXRpb25dICJ7IiBlbGVtZW50cys9Q2hhcnRFbGVtZW50KiAifSI7CisJcHVibGljIENoYXJ0RGF0YW1hcnRFbGVtZW50cyBnZXRDaGFydERhdGFtYXJ0QWNjZXNzKCkgeworCQlyZXR1cm4gcENoYXJ0RGF0YW1hcnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0RGF0YW1hcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnREYXRhbWFydEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NoYXJ0RWxlbWVudDoKKwkvLwlDaGFydEF4aXMgfCBDaGFydExlZ2VuZCB8IENoYXJ0SGlnaGxpZ2h0ZXI7CisJcHVibGljIENoYXJ0RWxlbWVudEVsZW1lbnRzIGdldENoYXJ0RWxlbWVudEFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydEVsZW1lbnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0RWxlbWVudFJ1bGUoKSB7CisJCXJldHVybiBnZXRDaGFydEVsZW1lbnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydExlZ2VuZDoKKwkvLwkibGVnZW5kIiBwbGFjZW1lbnQ9TGVnZW5kUGxhY2VtZW50RW51bSAodG9nZ2xlPz0idG9nZ2xlIiByZXBsb3Q/PSJyZXBsb3QiIHRvZ2dsZVR5cGU9VG9nZ2xlVHlwZUVudW0pPzsKKwlwdWJsaWMgQ2hhcnRMZWdlbmRFbGVtZW50cyBnZXRDaGFydExlZ2VuZEFjY2VzcygpIHsKKwkJcmV0dXJuIHBDaGFydExlZ2VuZDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q2hhcnRMZWdlbmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnRMZWdlbmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydEhpZ2hsaWdodGVyOgorCS8vCSJ0b29sdGlwIiBsb2NhdGlvbj1Ub29sdGlwTG9jYXRpb25FbnVtICh0b29sdGlwQWx3YXlzPz0iYWx3YXlzIj8gaW5zaWRlQ2hhcnQ/PSJpbnNpZGUiPyk7CisJcHVibGljIENoYXJ0SGlnaGxpZ2h0ZXJFbGVtZW50cyBnZXRDaGFydEhpZ2hsaWdodGVyQWNjZXNzKCkgeworCQlyZXR1cm4gcENoYXJ0SGlnaGxpZ2h0ZXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0SGlnaGxpZ2h0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnRIaWdobGlnaHRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NoYXJ0QXhpczoKKwkvLwkiYXhpcyIgYXhpcz1bZGF0YW1hcnQ6OkRhdGFtYXJ0QXhpc10gInJlbmRlcnMiIHJlbmRlclR5cGU9UmVuZGVyVHlwZUVudW0gc2hvcnRMYWJlbD89InNob3J0TGFiZWwiPyAoInRpY2thbmdsZSIKKwkvLwlhbmdsZT1TaWduZWROdW1iZXIpPzsKKwlwdWJsaWMgQ2hhcnRBeGlzRWxlbWVudHMgZ2V0Q2hhcnRBeGlzQWNjZXNzKCkgeworCQlyZXR1cm4gcENoYXJ0QXhpczsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Q2hhcnRBeGlzUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0QXhpc0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NoYXJ0UmFuZ2VFbGVtZW50OgorCS8vCUNoYXJ0U2VnbWVudENvbG9yOworCXB1YmxpYyBDaGFydFJhbmdlRWxlbWVudEVsZW1lbnRzIGdldENoYXJ0UmFuZ2VFbGVtZW50QWNjZXNzKCkgeworCQlyZXR1cm4gcENoYXJ0UmFuZ2VFbGVtZW50OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydFJhbmdlRWxlbWVudFJ1bGUoKSB7CisJCXJldHVybiBnZXRDaGFydFJhbmdlRWxlbWVudEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0NoYXJ0U2VnbWVudENvbG9yOgorCS8vCSJzZWdtZW50Y29sb3IiIHJnYj1TVFJJTkc7CisJcHVibGljIENoYXJ0U2VnbWVudENvbG9yRWxlbWVudHMgZ2V0Q2hhcnRTZWdtZW50Q29sb3JBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRTZWdtZW50Q29sb3I7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0U2VnbWVudENvbG9yUnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0U2VnbWVudENvbG9yQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQ2hhcnRJbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwkvLwkiaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJcHVibGljIENoYXJ0SW1wb3J0RWxlbWVudHMgZ2V0Q2hhcnRJbXBvcnRBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRJbXBvcnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldENoYXJ0SW1wb3J0UnVsZSgpIHsKKwkJcmV0dXJuIGdldENoYXJ0SW1wb3J0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vLy9TaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKwkvLy8vCSctJz8gTnVtYmVyOworCS8vU2lnbmVkTnVtYmVyIHJldHVybnMgZWNvcmU6OkVJbnQ6CisJLy8JKCItIj8gSU5UKT87CisJcHVibGljIFNpZ25lZE51bWJlckVsZW1lbnRzIGdldFNpZ25lZE51bWJlckFjY2VzcygpIHsKKwkJcmV0dXJuIHBTaWduZWROdW1iZXI7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFNpZ25lZE51bWJlclJ1bGUoKSB7CisJCXJldHVybiBnZXRTaWduZWROdW1iZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9DaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ6CisJLy8JUXVhbGlmaWVkTmFtZSAoIi4iICIqIik/OworCXB1YmxpYyBDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cyBnZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKSB7CisJCXJldHVybiBwQ2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRDaGFydFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVFJBTlNMQVRBQkxFU1RSSU5HOgorCS8vCVNUUklORzsKKwlwdWJsaWMgVFJBTlNMQVRBQkxFU1RSSU5HRWxlbWVudHMgZ2V0VFJBTlNMQVRBQkxFU1RSSU5HQWNjZXNzKCkgeworCQlyZXR1cm4gcFRSQU5TTEFUQUJMRVNUUklORzsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0VFJBTlNMQVRBQkxFU1RSSU5HUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRSQU5TTEFUQUJMRVNUUklOR0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RSQU5TTEFUQUJMRUlEOgorCS8vCUlEOworCXB1YmxpYyBUUkFOU0xBVEFCTEVJREVsZW1lbnRzIGdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkgeworCQlyZXR1cm4gcFRSQU5TTEFUQUJMRUlEOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSB7CisJCXJldHVybiBnZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gTGVnZW5kUGxhY2VtZW50RW51bToKKwkvLwlJTlNJREU9Imluc2lkZSIgfCBJTlNJREVfR1JJRD0iaW5zaWRlLWdyaWQiIHwgT1VUU0lERT0ib3V0c2lkZSIgfCBPVVRTSURFX0dSSUQ9Im91dHNpZGUtZ3JpZCI7CisJcHVibGljIExlZ2VuZFBsYWNlbWVudEVudW1FbGVtZW50cyBnZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVMZWdlbmRQbGFjZW1lbnRFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0TGVnZW5kUGxhY2VtZW50RW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRMZWdlbmRQbGFjZW1lbnRFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBUb2dnbGVUeXBlRW51bToKKwkvLwlOT1JNQUw9Im5vcm1hbCIgfCBTTE9XPSJzbG93IiB8IEZBU1Q9ImZhc3QiOworCXB1YmxpYyBUb2dnbGVUeXBlRW51bUVsZW1lbnRzIGdldFRvZ2dsZVR5cGVFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVUb2dnbGVUeXBlRW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldFRvZ2dsZVR5cGVFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldFRvZ2dsZVR5cGVFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBUb29sdGlwTG9jYXRpb25FbnVtOgorCS8vCU5PUlRIPSJub3J0aCIgfCBOT1JUSF9FQVNUPSJub3J0aC1lYXN0IiB8IEVBU1Q9ImVhc3QiIHwgU09VVEhfRUFTVD0ic291dGgtZWFzdCIgfCBTT1VUSD0ic291dGgiIHwKKwkvLwlTT1VUSF9XRVNUPSJzb3V0aC13ZXN0IiB8IFdFU1Q9Indlc3QiIHwgTk9SVEhfV0VTVD0ibm9ydGgtd2VzdCI7CisJcHVibGljIFRvb2x0aXBMb2NhdGlvbkVudW1FbGVtZW50cyBnZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVUb29sdGlwTG9jYXRpb25FbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0VG9vbHRpcExvY2F0aW9uRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRUb29sdGlwTG9jYXRpb25FbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vZW51bSBSZW5kZXJUeXBlRW51bToKKwkvLwlDQVRFR09SWT0iY2F0ZWdvcnkiIHwgTElORUFSPSJsaW5lYXIiIHwgREFURT0iZGF0ZSIgfCBMT0c9ImxvZ2FyaXRobWljIiB8IFBZUkFNSUQ9InB5cmFtaWQiOworCXB1YmxpYyBSZW5kZXJUeXBlRW51bUVsZW1lbnRzIGdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkgeworCQlyZXR1cm4gdW5rbm93blJ1bGVSZW5kZXJUeXBlRW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldFJlbmRlclR5cGVFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJlbmRlclR5cGVFbnVtQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb246CisJLy8Je1hBbm5vdGF0aW9ufSAiQCIgYW5ub3RhdGlvblR5cGU9W3R5cGVzOjpKdm1Bbm5vdGF0aW9uVHlwZXxRdWFsaWZpZWROYW1lXSAoIigiCisJLy8JKGVsZW1lbnRWYWx1ZVBhaXJzKz1YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKCIsIiBlbGVtZW50VmFsdWVQYWlycys9WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyKSogfAorCS8vCXZhbHVlPVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QpPyAiKSIpPzsKKwlwdWJsaWMgWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzLlhBbm5vdGF0aW9uRWxlbWVudHMgZ2V0WEFubm90YXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbm5vdGF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyOgorCS8vCT0+IChlbGVtZW50PVt0eXBlczo6SnZtT3BlcmF0aW9ufFZhbGlkSURdICI9IikgdmFsdWU9WEFubm90YXRpb25FbGVtZW50VmFsdWU7CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJFbGVtZW50cyBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCByZXR1cm5zIHhiYXNlOjpYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe3hiYXNlOjpYTGlzdExpdGVyYWx9ICIjIiAiWyIpIChlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24pKik/ICJdIgorCS8vCXwgWEFubm90YXRpb25PckV4cHJlc3Npb24gKHt4YmFzZTo6WExpc3RMaXRlcmFsLmVsZW1lbnRzKz1jdXJyZW50fSAoIiwiIGVsZW1lbnRzKz1YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbikrKT87CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0RWxlbWVudHMgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSByZXR1cm5zIHhiYXNlOjpYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe3hiYXNlOjpYTGlzdExpdGVyYWx9ICIjIiAiWyIpIChlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24pKik/ICJdIgorCS8vCXwgWEFubm90YXRpb25PckV4cHJlc3Npb247CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUVsZW1lbnRzIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgeGJhc2U6OlhFeHByZXNzaW9uOgorCS8vCVhBbm5vdGF0aW9uIHwgWEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hFeHByZXNzaW9uOgorCS8vCVhBc3NpZ25tZW50OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25FbGVtZW50cyBnZXRYRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQXNzaWdubWVudCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQXNzaWdubWVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8RmVhdHVyZUNhbGxJRF0gT3BTaW5nbGVBc3NpZ24gdmFsdWU9WEFzc2lnbm1lbnQgfCBYT3JFeHByZXNzaW9uCisJLy8JKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE11bHRpQXNzaWduXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEFzc2lnbm1lbnQpPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhBc3NpZ25tZW50RWxlbWVudHMgZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBc3NpZ25tZW50QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBc3NpZ25tZW50UnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BTaW5nbGVBc3NpZ246CisJLy8JIj0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BTaW5nbGVBc3NpZ25FbGVtZW50cyBnZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE11bHRpQXNzaWduOgorCS8vCSIrPSIgfCAiLT0iIHwgIio9IiB8ICIvPSIgfCAiJT0iIHwgIjwiICI8IiAiPSIgfCAiPiIgIj4iPyAiPj0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BNdWx0aUFzc2lnbkVsZW1lbnRzIGdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSB7CisJCXJldHVybiBnZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE9yRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhBbmRFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BPcl0pCisJLy8JcmlnaHRPcGVyYW5kPVhBbmRFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YT3JFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYT3JFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE9yOgorCS8vCSJ8fCI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE9yRWxlbWVudHMgZ2V0T3BPckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BPckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE9yUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wT3JBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5kRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhFcXVhbGl0eUV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcEFuZF0pCisJLy8JcmlnaHRPcGVyYW5kPVhFcXVhbGl0eUV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhBbmRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BBbmQ6CisJLy8JIiYmIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wQW5kRWxlbWVudHMgZ2V0T3BBbmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wQW5kQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wQW5kUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wQW5kQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wRXF1YWxpdHldKQorCS8vCXJpZ2h0T3BlcmFuZD1YUmVsYXRpb25hbEV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhFcXVhbGl0eUV4cHJlc3Npb25FbGVtZW50cyBnZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wRXF1YWxpdHk6CisJLy8JIj09IiB8ICIhPSIgfCAiPT09IiB8ICIhPT0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BFcXVhbGl0eUVsZW1lbnRzIGdldE9wRXF1YWxpdHlBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wRXF1YWxpdHlBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BFcXVhbGl0eVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFJlbGF0aW9uYWxFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICg9PiAoe1hJbnN0YW5jZU9mRXhwcmVzc2lvbi5leHByZXNzaW9uPWN1cnJlbnR9ICJpbnN0YW5jZW9mIikgdHlwZT1Kdm1UeXBlUmVmZXJlbmNlIHwgPT4KKwkvLwkoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BDb21wYXJlXSkKKwkvLwlyaWdodE9wZXJhbmQ9WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUmVsYXRpb25hbEV4cHJlc3Npb25FbGVtZW50cyBnZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BDb21wYXJlOgorCS8vCSI+PSIgfCAiPCIgIj0iIHwgIj4iIHwgIjwiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BDb21wYXJlRWxlbWVudHMgZ2V0T3BDb21wYXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcENvbXBhcmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BDb21wYXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wQ29tcGFyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhBZGRpdGl2ZUV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE90aGVyXSkKKwkvLwlyaWdodE9wZXJhbmQ9WEFkZGl0aXZlRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wT3RoZXI6CisJLy8JIi0+IiB8ICIuLjwiIHwgIj4iICIuLiIgfCAiLi4iIHwgIj0+IiB8ICI+IiAoPT4gKCI+IiAiPiIpIHwgIj4iKSB8ICI8IiAoPT4gKCI8IiAiPCIpIHwgIjwiIHwgIj0+IikgfCAiPD4iIHwgIj86IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wT3RoZXJFbGVtZW50cyBnZXRPcE90aGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcE90aGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wT3RoZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BPdGhlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BBZGRdKQorCS8vCXJpZ2h0T3BlcmFuZD1YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQWRkaXRpdmVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcEFkZDoKKwkvLwkiKyIgfCAiLSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcEFkZEVsZW1lbnRzIGdldE9wQWRkQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcEFkZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcEFkZFJ1bGUoKSB7CisJCXJldHVybiBnZXRPcEFkZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYVW5hcnlPcGVyYXRpb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcE11bHRpXSkKKwkvLwlyaWdodE9wZXJhbmQ9WFVuYXJ5T3BlcmF0aW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE11bHRpOgorCS8vCSIqIiB8ICIqKiIgfCAiLyIgfCAiJSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE11bHRpRWxlbWVudHMgZ2V0T3BNdWx0aUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BNdWx0aUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE11bHRpUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wTXVsdGlBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVW5hcnlPcGVyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFVuYXJ5T3BlcmF0aW9ufSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcFVuYXJ5XSBvcGVyYW5kPVhVbmFyeU9wZXJhdGlvbiB8IFhDYXN0ZWRFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFVuYXJ5T3BlcmF0aW9uRWxlbWVudHMgZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wVW5hcnk6CisJLy8JIiEiIHwgIi0iIHwgIisiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BVbmFyeUVsZW1lbnRzIGdldE9wVW5hcnlBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wVW5hcnlBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BVbmFyeVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENhc3RlZEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYUG9zdGZpeE9wZXJhdGlvbiAoPT4gKHtYQ2FzdGVkRXhwcmVzc2lvbi50YXJnZXQ9Y3VycmVudH0gImFzIikgdHlwZT1Kdm1UeXBlUmVmZXJlbmNlKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2FzdGVkRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQb3N0Zml4T3BlcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWE1lbWJlckZlYXR1cmVDYWxsID0+ICh7WFBvc3RmaXhPcGVyYXRpb24ub3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcFBvc3RmaXhdKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUG9zdGZpeE9wZXJhdGlvbkVsZW1lbnRzIGdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wUG9zdGZpeDoKKwkvLwkiKysiIHwgIi0tIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wUG9zdGZpeEVsZW1lbnRzIGdldE9wUG9zdGZpeEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BQb3N0Zml4QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wUG9zdGZpeFJ1bGUoKSB7CisJCXJldHVybiBnZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTWVtYmVyRmVhdHVyZUNhbGwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYUHJpbWFyeUV4cHJlc3Npb24gKD0+ICh7WEFzc2lnbm1lbnQuYXNzaWduYWJsZT1jdXJyZW50fSAoIi4iIHwgZXhwbGljaXRTdGF0aWM/PSI6OiIpCisJLy8JZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8RmVhdHVyZUNhbGxJRF0gT3BTaW5nbGVBc3NpZ24pIHZhbHVlPVhBc3NpZ25tZW50IHwgPT4KKwkvLwkoe1hNZW1iZXJGZWF0dXJlQ2FsbC5tZW1iZXJDYWxsVGFyZ2V0PWN1cnJlbnR9ICgiLiIgfCBudWxsU2FmZT89Ij8uIiB8IGV4cGxpY2l0U3RhdGljPz0iOjoiKSkgKCI8IgorCS8vCXR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/CisJLy8JZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8SWRPclN1cGVyXSAoPT4gZXhwbGljaXRPcGVyYXRpb25DYWxsPz0iKCIgKG1lbWJlckNhbGxBcmd1bWVudHMrPVhTaG9ydENsb3N1cmUKKwkvLwl8IG1lbWJlckNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uICgiLCIgbWVtYmVyQ2FsbEFyZ3VtZW50cys9WEV4cHJlc3Npb24pKik/ICIpIik/IG1lbWJlckNhbGxBcmd1bWVudHMrPVhDbG9zdXJlPykqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE1lbWJlckZlYXR1cmVDYWxsRWxlbWVudHMgZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQcmltYXJ5RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhDb25zdHJ1Y3RvckNhbGwgfCBYQmxvY2tFeHByZXNzaW9uIHwgWFN3aXRjaEV4cHJlc3Npb24gfCBYU3luY2hyb25pemVkRXhwcmVzc2lvbiB8IFhGZWF0dXJlQ2FsbCB8IFhMaXRlcmFsIHwKKwkvLwlYSWZFeHByZXNzaW9uIHwgWEZvckxvb3BFeHByZXNzaW9uIHwgWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gfCBYV2hpbGVFeHByZXNzaW9uIHwgWERvV2hpbGVFeHByZXNzaW9uIHwKKwkvLwlYVGhyb3dFeHByZXNzaW9uIHwgWFJldHVybkV4cHJlc3Npb24gfCBYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiB8IFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhQcmltYXJ5RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhDb2xsZWN0aW9uTGl0ZXJhbCB8IFhDbG9zdXJlIHwgWEJvb2xlYW5MaXRlcmFsIHwgWE51bWJlckxpdGVyYWwgfCBYTnVsbExpdGVyYWwgfCBYU3RyaW5nTGl0ZXJhbCB8IFhUeXBlTGl0ZXJhbDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhMaXRlcmFsRWxlbWVudHMgZ2V0WExpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENvbGxlY3Rpb25MaXRlcmFsOgorCS8vCVhTZXRMaXRlcmFsIHwgWExpc3RMaXRlcmFsOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENvbGxlY3Rpb25MaXRlcmFsRWxlbWVudHMgZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTZXRMaXRlcmFsOgorCS8vCXtYU2V0TGl0ZXJhbH0gIiMiICJ7IiAoZWxlbWVudHMrPVhFeHByZXNzaW9uICgiLCIgZWxlbWVudHMrPVhFeHByZXNzaW9uKSopPyAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU2V0TGl0ZXJhbEVsZW1lbnRzIGdldFhTZXRMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU2V0TGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hMaXN0TGl0ZXJhbDoKKwkvLwl7WExpc3RMaXRlcmFsfSAiIyIgIlsiIChlbGVtZW50cys9WEV4cHJlc3Npb24gKCIsIiBlbGVtZW50cys9WEV4cHJlc3Npb24pKik/ICJdIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhMaXN0TGl0ZXJhbEVsZW1lbnRzIGdldFhMaXN0TGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhMaXN0TGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ2xvc3VyZSByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCT0+ICh7WENsb3N1cmV9ICJbIikgPT4gKChkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMrPUp2bUZvcm1hbFBhcmFtZXRlciAoIiwiCisJLy8JZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIpKik/IGV4cGxpY2l0U3ludGF4Pz0ifCIpPyBleHByZXNzaW9uPVhFeHByZXNzaW9uSW5DbG9zdXJlICJdIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDbG9zdXJlRWxlbWVudHMgZ2V0WENsb3N1cmVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDbG9zdXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDbG9zdXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEV4cHJlc3Npb25JbkNsb3N1cmUgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJsb2NrRXhwcmVzc2lvbn0gKGV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gIjsiPykqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25JbkNsb3N1cmVFbGVtZW50cyBnZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU2hvcnRDbG9zdXJlIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYQ2xvc3VyZX0gKGRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycys9SnZtRm9ybWFsUGFyYW1ldGVyICgiLCIgZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIpKik/CisJLy8JZXhwbGljaXRTeW50YXg/PSJ8IikgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTaG9ydENsb3N1cmVFbGVtZW50cyBnZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTaG9ydENsb3N1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCSIoIiBYRXhwcmVzc2lvbiAiKSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUGFyZW50aGVzaXplZEV4cHJlc3Npb25FbGVtZW50cyBnZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWElmRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYSWZFeHByZXNzaW9ufSAiaWYiICIoIiBpZj1YRXhwcmVzc2lvbiAiKSIgdGhlbj1YRXhwcmVzc2lvbiAoImVsc2UiIGVsc2U9WEV4cHJlc3Npb24pPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhJZkV4cHJlc3Npb25FbGVtZW50cyBnZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJZkV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTd2l0Y2hFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hTd2l0Y2hFeHByZXNzaW9ufSAic3dpdGNoIiAoPT4gKCIoIiBkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpIHN3aXRjaD1YRXhwcmVzc2lvbiAiKSIgfCA9PgorCS8vCShkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpPyBzd2l0Y2g9WEV4cHJlc3Npb24pICJ7IiBjYXNlcys9WENhc2VQYXJ0KiAoImRlZmF1bHQiICI6IgorCS8vCWRlZmF1bHQ9WEV4cHJlc3Npb24pPyAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU3dpdGNoRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDYXNlUGFydDoKKwkvLwl7WENhc2VQYXJ0fSB0eXBlR3VhcmQ9SnZtVHlwZVJlZmVyZW5jZT8gKCJjYXNlIiBjYXNlPVhFeHByZXNzaW9uKT8gKCI6IiB0aGVuPVhFeHByZXNzaW9uIHwgZmFsbFRocm91Z2g/PSIsIik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2FzZVBhcnRFbGVtZW50cyBnZXRYQ2FzZVBhcnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDYXNlUGFydEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2FzZVBhcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZvckxvb3BFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYRm9yTG9vcEV4cHJlc3Npb259ICJmb3IiICIoIiBkZWNsYXJlZFBhcmFtPUp2bUZvcm1hbFBhcmFtZXRlciAiOiIpIGZvckV4cHJlc3Npb249WEV4cHJlc3Npb24gIikiCisJLy8JZWFjaEV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRm9yTG9vcEV4cHJlc3Npb25FbGVtZW50cyBnZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJhc2ljRm9yTG9vcEV4cHJlc3Npb259ICJmb3IiICIoIiAoaW5pdEV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gKCIsIgorCS8vCWluaXRFeHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKSopPyAiOyIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbj8gIjsiICh1cGRhdGVFeHByZXNzaW9ucys9WEV4cHJlc3Npb24gKCIsIgorCS8vCXVwZGF0ZUV4cHJlc3Npb25zKz1YRXhwcmVzc2lvbikqKT8gIikiIGVhY2hFeHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25FbGVtZW50cyBnZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YV2hpbGVFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hXaGlsZUV4cHJlc3Npb259ICJ3aGlsZSIgIigiIHByZWRpY2F0ZT1YRXhwcmVzc2lvbiAiKSIgYm9keT1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhXaGlsZUV4cHJlc3Npb25FbGVtZW50cyBnZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hEb1doaWxlRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYRG9XaGlsZUV4cHJlc3Npb259ICJkbyIgYm9keT1YRXhwcmVzc2lvbiAid2hpbGUiICIoIiBwcmVkaWNhdGU9WEV4cHJlc3Npb24gIikiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWERvV2hpbGVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hCbG9ja0V4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEJsb2NrRXhwcmVzc2lvbn0gInsiIChleHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICI7Ij8pKiAifSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQmxvY2tFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEJsb2NrRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYVmFyaWFibGVEZWNsYXJhdGlvbiB8IFhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hWYXJpYWJsZURlY2xhcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hWYXJpYWJsZURlY2xhcmF0aW9ufSAod3JpdGVhYmxlPz0idmFyIiB8ICJ2YWwiKSAoPT4gKHR5cGU9SnZtVHlwZVJlZmVyZW5jZSBuYW1lPVZhbGlkSUQpIHwgbmFtZT1WYWxpZElEKSAoIj0iCisJLy8JcmlnaHQ9WEV4cHJlc3Npb24pPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhWYXJpYWJsZURlY2xhcmF0aW9uRWxlbWVudHMgZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgdHlwZXM6Okp2bUZvcm1hbFBhcmFtZXRlcjoKKwkvLwlwYXJhbWV0ZXJUeXBlPUp2bVR5cGVSZWZlcmVuY2U/IG5hbWU9VmFsaWRJRDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLkp2bUZvcm1hbFBhcmFtZXRlckVsZW1lbnRzIGdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9GdWxsSnZtRm9ybWFsUGFyYW1ldGVyIHJldHVybnMgdHlwZXM6Okp2bUZvcm1hbFBhcmFtZXRlcjoKKwkvLwlwYXJhbWV0ZXJUeXBlPUp2bVR5cGVSZWZlcmVuY2UgbmFtZT1WYWxpZElEOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuRnVsbEp2bUZvcm1hbFBhcmFtZXRlckVsZW1lbnRzIGdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSB7CisJCXJldHVybiBnZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZlYXR1cmVDYWxsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hGZWF0dXJlQ2FsbH0gKCI8IiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPworCS8vCWZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fElkT3JTdXBlcl0gKD0+IGV4cGxpY2l0T3BlcmF0aW9uQ2FsbD89IigiIChmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WFNob3J0Q2xvc3VyZQorCS8vCXwgZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uICgiLCIgZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uKSopPyAiKSIpPyBmZWF0dXJlQ2FsbEFyZ3VtZW50cys9WENsb3N1cmU/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEZlYXR1cmVDYWxsRWxlbWVudHMgZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEZlYXR1cmVDYWxsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0ZlYXR1cmVDYWxsSUQ6CisJLy8JVmFsaWRJRCB8ICJleHRlbmRzIiB8ICJzdGF0aWMiIHwgImltcG9ydCIgfCAiZXh0ZW5zaW9uIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLkZlYXR1cmVDYWxsSURFbGVtZW50cyBnZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEZlYXR1cmVDYWxsSURSdWxlKCkgeworCQlyZXR1cm4gZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0lkT3JTdXBlcjoKKwkvLwlGZWF0dXJlQ2FsbElEIHwgInN1cGVyIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLklkT3JTdXBlckVsZW1lbnRzIGdldElkT3JTdXBlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SWRPclN1cGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldElkT3JTdXBlclJ1bGUoKSB7CisJCXJldHVybiBnZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ29uc3RydWN0b3JDYWxsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hDb25zdHJ1Y3RvckNhbGx9ICJuZXciIGNvbnN0cnVjdG9yPVt0eXBlczo6SnZtQ29uc3RydWN0b3J8UXVhbGlmaWVkTmFtZV0gKCI8IgorCS8vCXR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiIHR5cGVBcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+Iik/ICg9PgorCS8vCWV4cGxpY2l0Q29uc3RydWN0b3JDYWxsPz0iKCIgKGFyZ3VtZW50cys9WFNob3J0Q2xvc3VyZSB8IGFyZ3VtZW50cys9WEV4cHJlc3Npb24gKCIsIiBhcmd1bWVudHMrPVhFeHByZXNzaW9uKSopPyAiKSIpPworCS8vCWFyZ3VtZW50cys9WENsb3N1cmU/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENvbnN0cnVjdG9yQ2FsbEVsZW1lbnRzIGdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEJvb2xlYW5MaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hCb29sZWFuTGl0ZXJhbH0gKCJmYWxzZSIgfCBpc1RydWU/PSJ0cnVlIik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQm9vbGVhbkxpdGVyYWxFbGVtZW50cyBnZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQm9vbGVhbkxpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE51bGxMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hOdWxsTGl0ZXJhbH0gIm51bGwiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE51bGxMaXRlcmFsRWxlbWVudHMgZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE51bGxMaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hOdW1iZXJMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hOdW1iZXJMaXRlcmFsfSB2YWx1ZT1OdW1iZXI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTnVtYmVyTGl0ZXJhbEVsZW1lbnRzIGdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTdHJpbmdMaXRlcmFsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hTdHJpbmdMaXRlcmFsfSB2YWx1ZT1TVFJJTkc7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU3RyaW5nTGl0ZXJhbEVsZW1lbnRzIGdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hUeXBlTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVHlwZUxpdGVyYWx9ICJ0eXBlb2YiICIoIiB0eXBlPVt0eXBlczo6SnZtVHlwZXxRdWFsaWZpZWROYW1lXSBhcnJheURpbWVuc2lvbnMrPUFycmF5QnJhY2tldHMqICIpIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhUeXBlTGl0ZXJhbEVsZW1lbnRzIGdldFhUeXBlTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhUeXBlTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVGhyb3dFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hUaHJvd0V4cHJlc3Npb259ICJ0aHJvdyIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhUaHJvd0V4cHJlc3Npb25FbGVtZW50cyBnZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hSZXR1cm5FeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hSZXR1cm5FeHByZXNzaW9ufSAicmV0dXJuIiAtPiBleHByZXNzaW9uPVhFeHByZXNzaW9uPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhSZXR1cm5FeHByZXNzaW9uRWxlbWVudHMgZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb259ICJ0cnkiIGV4cHJlc3Npb249WEV4cHJlc3Npb24gKGNhdGNoQ2xhdXNlcys9WENhdGNoQ2xhdXNlKyAoImZpbmFsbHkiCisJLy8JZmluYWxseUV4cHJlc3Npb249WEV4cHJlc3Npb24pPyB8ICJmaW5hbGx5IiBmaW5hbGx5RXhwcmVzc2lvbj1YRXhwcmVzc2lvbik7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkVsZW1lbnRzIGdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JPT4gKHtYU3luY2hyb25pemVkRXhwcmVzc2lvbn0gInN5bmNocm9uaXplZCIgIigiKSBwYXJhbT1YRXhwcmVzc2lvbiAiKSIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhTeW5jaHJvbml6ZWRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENhdGNoQ2xhdXNlOgorCS8vCSJjYXRjaCIgIigiIGRlY2xhcmVkUGFyYW09RnVsbEp2bUZvcm1hbFBhcmFtZXRlciAiKSIgZXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDYXRjaENsYXVzZUVsZW1lbnRzIGdldFhDYXRjaENsYXVzZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDYXRjaENsYXVzZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9RdWFsaWZpZWROYW1lOgorCS8vCVZhbGlkSUQgKCIuIiBWYWxpZElEKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5RdWFsaWZpZWROYW1lRWxlbWVudHMgZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRRdWFsaWZpZWROYW1lUnVsZSgpIHsKKwkJcmV0dXJuIGdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9OdW1iZXIgaGlkZGVuKCk6CisJLy8JSEVYIHwgKElOVCB8IERFQ0lNQUwpICgiLiIgKElOVCB8IERFQ0lNQUwpKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5OdW1iZXJFbGVtZW50cyBnZXROdW1iZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE51bWJlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXROdW1iZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vLyAqKgorCS8vICogRHVtbXkgcnVsZSwgZm9yICJiZXR0ZXIiIGRvd253YXJkcyBjb21wYXRpYmlsaXR5LCBzaW5jZSBHcmFtbWFyQWNjZXNzIGdlbmVyYXRlcyBub24tc3RhdGljIGlubmVyIGNsYXNzZXMsIAorCS8vICogd2hpY2ggbWFrZXMgZG93bnN0cmVhbSBncmFtbWFycyBicmVhayBvbiBjbGFzc2xvYWRpbmcsIHdoZW4gYSBydWxlIGlzIHJlbW92ZWQuCisJLy8gKiAvCisJLy9TdGF0aWNRdWFsaWZpZXI6CisJLy8JKFZhbGlkSUQgIjo6IikrOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuU3RhdGljUXVhbGlmaWVyRWxlbWVudHMgZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTdGF0aWNRdWFsaWZpZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0U3RhdGljUXVhbGlmaWVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFN0YXRpY1F1YWxpZmllckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL3Rlcm1pbmFsIEhFWDoKKwkvLwkoIjB4IiB8ICIwWCIpICgiMCIuLiI5IiB8ICJhIi4uImYiIHwgIkEiLi4iRiIgfCAiXyIpKyAoIiMiICgoImIiIHwgIkIiKSAoImkiIHwgIkkiKSB8ICgibCIgfCAiTCIpKSk/OworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SEVYUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SEVYUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIElOVCByZXR1cm5zIGVjb3JlOjpFSW50OgorCS8vCSIwIi4uIjkiICgiMCIuLiI5IiB8ICJfIikqOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SU5UUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIERFQ0lNQUw6CisJLy8JSU5UICgoImUiIHwgIkUiKSAoIisiIHwgIi0iKT8gSU5UKT8gKCgiYiIgfCAiQiIpICgiaSIgfCAiSSIgfCAiZCIgfCAiRCIpIHwgKCJsIiB8ICJMIiB8ICJkIiB8ICJEIiB8ICJmIiB8ICJGIikpPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldERFQ0lNQUxSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRERUNJTUFMUnVsZSgpOworCX0gCisKKwkvL0p2bVR5cGVSZWZlcmVuY2U6CisJLy8JSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgPT4gKHtKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlLmNvbXBvbmVudFR5cGU9Y3VycmVudH0gQXJyYXlCcmFja2V0cykqIHwKKwkvLwlYRnVuY3Rpb25UeXBlUmVmOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQXJyYXlCcmFja2V0czoKKwkvLwkiWyIgIl0iOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuQXJyYXlCcmFja2V0c0VsZW1lbnRzIGdldEFycmF5QnJhY2tldHNBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSB7CisJCXJldHVybiBnZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEZ1bmN0aW9uVHlwZVJlZjoKKwkvLwkoIigiIChwYXJhbVR5cGVzKz1Kdm1UeXBlUmVmZXJlbmNlICgiLCIgcGFyYW1UeXBlcys9SnZtVHlwZVJlZmVyZW5jZSkqKT8gIikiKT8gIj0+IiByZXR1cm5UeXBlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5YRnVuY3Rpb25UeXBlUmVmRWxlbWVudHMgZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZToKKwkvLwl0eXBlPVtKdm1UeXBlfFF1YWxpZmllZE5hbWVdICgiPCIgYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiBhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSkqICI+IgorCS8vCSg9PiAoe0p2bUlubmVyVHlwZVJlZmVyZW5jZS5vdXRlcj1jdXJyZW50fSAiLiIpIHR5cGU9W0p2bVR5cGV8VmFsaWRJRF0gKCI8IiBhcmd1bWVudHMrPUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSAoIiwiCisJLy8JYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPykqKT87CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSByZXR1cm5zIEp2bVR5cGVSZWZlcmVuY2U6CisJLy8JSnZtVHlwZVJlZmVyZW5jZSB8IEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U6CisJLy8Je0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZX0gIj8iIChjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZCBjb25zdHJhaW50cys9SnZtVXBwZXJCb3VuZEFuZGVkKiB8CisJLy8JY29uc3RyYWludHMrPUp2bUxvd2VyQm91bmQgY29uc3RyYWludHMrPUp2bUxvd2VyQm91bmRBbmRlZCopPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUVsZW1lbnRzIGdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1VcHBlckJvdW5kOgorCS8vCSJleHRlbmRzIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1VcHBlckJvdW5kRWxlbWVudHMgZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1VcHBlckJvdW5kUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1VcHBlckJvdW5kQW5kZWQgcmV0dXJucyBKdm1VcHBlckJvdW5kOgorCS8vCSImIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1VcHBlckJvdW5kQW5kZWRFbGVtZW50cyBnZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtTG93ZXJCb3VuZDoKKwkvLwkic3VwZXIiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUxvd2VyQm91bmRFbGVtZW50cyBnZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUxvd2VyQm91bmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUxvd2VyQm91bmRBbmRlZCByZXR1cm5zIEp2bUxvd2VyQm91bmQ6CisJLy8JIiYiIHR5cGVSZWZlcmVuY2U9SnZtVHlwZVJlZmVyZW5jZTsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bUxvd2VyQm91bmRBbmRlZEVsZW1lbnRzIGdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1UeXBlUGFyYW1ldGVyOgorCS8vCW5hbWU9VmFsaWRJRCAoY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmQgY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmRBbmRlZCopPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVR5cGVQYXJhbWV0ZXJFbGVtZW50cyBnZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVR5cGVQYXJhbWV0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ6CisJLy8JUXVhbGlmaWVkTmFtZSAiLiIgIioiOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEVsZW1lbnRzIGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vVmFsaWRJRDoKKwkvLwlJRDsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlZhbGlkSURFbGVtZW50cyBnZXRWYWxpZElEQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRWYWxpZElEQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFZhbGlkSURSdWxlKCkgeworCQlyZXR1cm4gZ2V0VmFsaWRJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hJbXBvcnRTZWN0aW9uOgorCS8vCWltcG9ydERlY2xhcmF0aW9ucys9WEltcG9ydERlY2xhcmF0aW9uKzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlhJbXBvcnRTZWN0aW9uRWxlbWVudHMgZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJbXBvcnRTZWN0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEltcG9ydERlY2xhcmF0aW9uOgorCS8vCSJpbXBvcnQiIChzdGF0aWM/PSJzdGF0aWMiIGV4dGVuc2lvbj89ImV4dGVuc2lvbiI/IGltcG9ydGVkVHlwZT1bSnZtRGVjbGFyZWRUeXBlfFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF0KKwkvLwkod2lsZGNhcmQ/PSIqIiB8IG1lbWJlck5hbWU9VmFsaWRJRCkgfCBpbXBvcnRlZFR5cGU9W0p2bURlY2xhcmVkVHlwZXxRdWFsaWZpZWROYW1lXSB8CisJLy8JaW1wb3J0ZWROYW1lc3BhY2U9UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCkgIjsiPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlhJbXBvcnREZWNsYXJhdGlvbkVsZW1lbnRzIGdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ6CisJLy8JKFZhbGlkSUQgIi4iKSs7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRFbGVtZW50cyBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vdGVybWluYWwgSUQ6CisJLy8JIl4iPyAoImEiLi4ieiIgfCAiQSIuLiJaIiB8ICIkIiB8ICJfIikgKCJhIi4uInoiIHwgIkEiLi4iWiIgfCAiJCIgfCAiXyIgfCAiMCIuLiI5IikqOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SURSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRJRFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBTVFJJTkc6CisJLy8JIlwiIiAoIlxcIiAuIC8gKiAoJ2InfCd0J3wnbid8J2YnfCdyJ3wndSd8JyInfCInInwnXFwnKSAqIC8gfCAhKCJcXCIgfCAiXCIiKSkqICJcIiI/IHwgIlwnIiAoIlxcIiAuCisJLy8JLyAqICgnYid8J3QnfCduJ3wnZid8J3InfCd1J3wnIid8IicifCdcXCcpICogLyB8ICEoIlxcIiB8ICJcJyIpKSogIlwnIj87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRTVFJJTkdSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTVFJJTkdSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgTUxfQ09NTUVOVDoKKwkvLwkiLyAqIi0+IiogLyI7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRNTF9DT01NRU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0TUxfQ09NTUVOVFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBTTF9DT01NRU5UOgorCS8vCSIvLyIgISgiXG4iIHwgIlxyIikqICgiXHIiPyAiXG4iKT87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRTTF9DT01NRU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0U0xfQ09NTUVOVFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBXUzoKKwkvLwkoIiAiIHwgIlx0IiB8ICJcciIgfCAiXG4iKSs7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRXU1J1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFdTUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIEFOWV9PVEhFUjoKKwkvLwkuOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0QU5ZX09USEVSUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0QU5ZX09USEVSUnVsZSgpOworCX0gCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWxpZGF0aW9uL0Fic3RyYWN0Q2hhcnREU0xWYWxpZGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3ZhbGlkYXRpb24vQWJzdHJhY3RDaGFydERTTFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjM1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWxpZGF0aW9uL0Fic3RyYWN0Q2hhcnREU0xWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RDaGFydERTTFZhbGlkYXRvciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnZhbGlkYXRpb24uWGJhc2VXaXRoQW5ub3RhdGlvbnNWYWxpZGF0b3IgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIExpc3Q8RVBhY2thZ2U+IGdldEVQYWNrYWdlcygpIHsKKwkgICAgTGlzdDxFUGFja2FnZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxFUGFja2FnZT4oc3VwZXIuZ2V0RVBhY2thZ2VzKCkpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9jaGFydC9DaGFydERTTCIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcvZHNsL2NvbW1vbi90eXBlcy92MSIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9YYmFzZS9YQW5ub3RhdGlvbnMiKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQveGJhc2UvWGJhc2UiKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQvY29tbW9uL0phdmFWTVR5cGVzIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3h0ZXh0L3hiYXNlL1h0eXBlIikpOworCQlyZXR1cm4gcmVzdWx0OworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0FjdGl2YXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MDZhMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5naXRpbmZvLkxvZ2luZm87CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworLy8gVE9ETzogQXV0by1nZW5lcmF0ZWQgSmF2YWRvYworLyoqCisgKiBUaGUgQ2xhc3MgQWN0aXZhdG9yLgorICovCitwdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKKworCS8qKiBUaGUgY29udGV4dC4gKi8KKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisKKwkvKioKKwkgKiBHZXRzIHRoZSBjb250ZXh0LgorCSAqCisJICogQHJldHVybiB0aGUgY29udGV4dAorCSAqLworCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7CisJCXJldHVybiBjb250ZXh0OworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7CisJCUxvZ2luZm8gbGkgPSBuZXcgTG9naW5mbygpOworCQlsaS5wcmludCggQWN0aXZhdG9yLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwgQWN0aXZhdG9yLmNsYXNzLmdldENsYXNzTG9hZGVyKCkpOworCX0KKworCS8qCisJICogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQorCSAqLworCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOworCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTC54dGV4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0wueHRleHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFkZThjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0wueHRleHQKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHLCA2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55IAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEluaXRpYWwgY29udHJpYnV0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIExvZXR6IEdtYkggJiBDby4gS0cKKyAqIAorICovCitncmFtbWFyIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0wgd2l0aCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5YYmFzZVdpdGhBbm5vdGF0aW9ucworCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMIiAKKworaW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy94dGV4dC9kYXRhbWFydGRzbC9EYXRhbWFydERTTCIgYXMgZGF0YW1hcnQKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvY3ViZWRzbC9DdWJlRFNMIiBhcyBjdWJlCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL2RzbC9jb21tb24vdHlwZXMvdjEiIGFzIHR5cGVzCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL2RzbC9lbnRpdHkvdjEiIGFzIGVudGl0eQoraW1wb3J0ICJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlIiBhcyBlY29yZQorCitDaGFydE1vZGVsOgorCXBhY2thZ2VzKz1DaGFydFBhY2thZ2UqOworCitDaGFydFBhY2thZ2U6CisJe0NoYXJ0UGFja2FnZX0gJ3BhY2thZ2UnIG5hbWU9UXVhbGlmaWVkTmFtZSAoJ3snIChpbXBvcnRzKz1DaGFydEltcG9ydCkqIChjaGFydHMrPUNoYXJ0KSogJ30nICk/OworCitDaGFydDoKKwl7Q2hhcnR9ICdjaGFydCcgbmFtZT1UUkFOU0xBVEFCTEVJRCAoZGVzY3JpcHRpb24/PSdkZXNjcmliZWQgYnknIGRlc2NyaXB0aW9uVmFsdWU9VFJBTlNMQVRBQkxFU1RSSU5HKT8gJ2FzJyBjaGFydHR5cGU9Q2hhcnRPcHRpb24gKHBvbGxpbmc/PSdwb2xsaW5nJyBwb2xsaW5nVGltZT1JTlQpPyAoJ3VzaW5nJyBzb3VyY2U9Q2hhcnREYXRhbWFydCk/OworCitDaGFydE9wdGlvbjoKKwlDaGFydEJhciB8IENoYXJ0TGluZSB8IENoYXJ0UGllIHwgQ2hhcnREb251dCB8IENoYXJ0QnViYmxlIHwgQ2hhcnRHYXVnZSB8IENoYXJ0VHJlZTsKKworQ2hhcnRCYXI6CisJe0NoYXJ0QmFyfSAnYmFyJyAoKHNoYWRvdz89J3NoYWRlZCcpPyAmIChhbmltYXRlZD89J2FuaW1hdGVkJyk/ICYgKHN3YXBwZWQ/PSdzd2FwcGVkJyk/ICYgKHN0YWNrZWQ/PSdzdGFja2VkJyk/KTsKKworQ2hhcnRMaW5lOgorCXtDaGFydExpbmV9ICdsaW5lJyAoKGFuaW1hdGVkPz0nYW5pbWF0ZWQnKT8gJiAoc2hvd01hcmtlcj89J3Nob3dNYXJrZXInKT8gJiAodHJlbmRMaW5lPz0ndHJlbmRMaW5lJyk/ICYgKGN1cnNvcj89J2N1cnNvcicgKHpvb20/PSd6b29tJyk/ICh0b29sdGlwPz0ndG9vbHRpcCcpPyk/ICYgKGZpbGxUb1plcm8/PSdmaWxsWmVybycpPyAmIChmaWxsQXJlYT89J2ZpbGxlZCcpPyk7CisKK0NoYXJ0UGllOgorCXtDaGFydFBpZX0gJ3BpZScgKGVtcHR5Pz0nZW1wdHknKT87CisKK0NoYXJ0RG9udXQ6CisJe0NoYXJ0RG9udXR9ICdkb251dCc7CisKK0NoYXJ0QnViYmxlOgorCXtDaGFydEJ1YmJsZX0gJ2J1YmJsZScgKChtdWx0aXBsaWVyPz0nbXVsdGlwbGllcicgbXVsdGlwbGllclZhbHVlPU51bWJlcik/ICYgKChncmFkaWVudD89J2dyYWRpZW50JykgfCAodHJhbnNwYXJlbnQ/PSd0cmFuc3BhcmVudCcpKSk/OworCitDaGFydEdhdWdlOgorCXtDaGFydEdhdWdlfSAnZ2F1Z2UnICgobGFiZWxlZD89J2xhYmVsJyBsYWJlbFZhbHVlPVNUUklORyk/ICYgKGhhc1RpY2tzPz0naGFzVGlja3MnICdtaW5pbXVtJyBtaW5WYWx1ZT1JTlQgJ21heGltdW0nIG1heFZhbHVlPUlOVCk/ICYgKGhhc0ludGVydmFscz89J2ludGVydmFscycgJ3snIChpbnRlcnZhbHMrPUNoYXJ0SW50ZXJ2YWwpKiAnfScpPyk7CisJCitDaGFydFRyZWU6CisJe0NoYXJ0VHJlZX0gJ3RyZWUnICgobWFwPz0nbWFwJykgfCAoY29sbGFwc2libGU/PSdjb2xsYXBzaWJsZScpKTsKKworQ2hhcnRJbnRlcnZhbDoKKwlDaGFydE51bWJlckludGVydmFsOworCQorQ2hhcnROdW1iZXJJbnRlcnZhbDoKKwl7Q2hhcnROdW1iZXJJbnRlcnZhbH0gJ3VwIHRvJyBudW1iZXJJbnRlcnZhbFZhbHVlPVNpZ25lZE51bWJlciBudW1iZXJSYW5nZT1DaGFydFJhbmdlRWxlbWVudDsKKwkKK0NoYXJ0RGF0YW1hcnQ6CisJJ2RhdGFtYXJ0JyBkYXRhbWFydFJlZj1bZGF0YW1hcnQ6OkRhdGFtYXJ0RGVmaW5pdGlvbl0gJ3snIGVsZW1lbnRzKz1DaGFydEVsZW1lbnQqICd9JzsKKworQ2hhcnRFbGVtZW50OgorCUNoYXJ0QXhpcyB8IENoYXJ0TGVnZW5kIHwgQ2hhcnRIaWdobGlnaHRlcjsKKwkKK0NoYXJ0TGVnZW5kOgorCSdsZWdlbmQnIHBsYWNlbWVudD1MZWdlbmRQbGFjZW1lbnRFbnVtICh0b2dnbGU/PSd0b2dnbGUnIHJlcGxvdD89J3JlcGxvdCcgdG9nZ2xlVHlwZT1Ub2dnbGVUeXBlRW51bSk/OworCQorQ2hhcnRIaWdobGlnaHRlcjoKKwkndG9vbHRpcCcgbG9jYXRpb249VG9vbHRpcExvY2F0aW9uRW51bSAoKHRvb2x0aXBBbHdheXM/PSdhbHdheXMnKT8gKGluc2lkZUNoYXJ0Pz0naW5zaWRlJyk/KTsKKwkKK0NoYXJ0QXhpczoKKwknYXhpcycgYXhpcz1bZGF0YW1hcnQ6OkRhdGFtYXJ0QXhpc10gJ3JlbmRlcnMnIHJlbmRlclR5cGU9UmVuZGVyVHlwZUVudW0gKHNob3J0TGFiZWw/PSdzaG9ydExhYmVsJyk/ICgndGlja2FuZ2xlJyBhbmdsZT1TaWduZWROdW1iZXIpPzsKKwkKK0NoYXJ0UmFuZ2VFbGVtZW50OgorCUNoYXJ0U2VnbWVudENvbG9yOworCQorQ2hhcnRTZWdtZW50Q29sb3I6IAorCSdzZWdtZW50Y29sb3InIHJnYj1TVFJJTkc7CisKK0NoYXJ0SW1wb3J0IHJldHVybnMgdHlwZXM6OkxJbXBvcnQ6CisJJ2ltcG9ydCcgaW1wb3J0ZWROYW1lc3BhY2U9Q2hhcnRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOworCQorLy9TaWduZWROdW1iZXIgcmV0dXJucyBlY29yZTo6RURvdWJsZToKKy8vCSctJz8gTnVtYmVyOworU2lnbmVkTnVtYmVyIHJldHVybnMgZWNvcmU6OkVJbnQ6CisJKCctJz8gSU5UKT87CisKKwkKK0NoYXJ0UXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDoKKwlRdWFsaWZpZWROYW1lICgnLicgJyonKT87CisKK1RSQU5TTEFUQUJMRVNUUklORzogU1RSSU5HOwkKKworVFJBTlNMQVRBQkxFSUQ6CisJSUQ7CisKK2VudW0gTGVnZW5kUGxhY2VtZW50RW51bToKKwkgSU5TSURFPSdpbnNpZGUnIHwgSU5TSURFX0dSSUQ9J2luc2lkZS1ncmlkJyB8IE9VVFNJREU9J291dHNpZGUnIHwgT1VUU0lERV9HUklEPSdvdXRzaWRlLWdyaWQnOworCitlbnVtIFRvZ2dsZVR5cGVFbnVtOgorCU5PUk1BTD0nbm9ybWFsJyB8IFNMT1c9J3Nsb3cnIHwgRkFTVD0nZmFzdCc7CisJCitlbnVtIFRvb2x0aXBMb2NhdGlvbkVudW06CisJTk9SVEg9J25vcnRoJyB8IE5PUlRIX0VBU1Q9J25vcnRoLWVhc3QnIHwgRUFTVD0nZWFzdCcgfCBTT1VUSF9FQVNUPSdzb3V0aC1lYXN0JyB8IFNPVVRIPSdzb3V0aCcgfCBTT1VUSF9XRVNUPSdzb3V0aC13ZXN0JyB8IFdFU1Q9J3dlc3QnIHwgTk9SVEhfV0VTVD0nbm9ydGgtd2VzdCc7CisJCitlbnVtIFJlbmRlclR5cGVFbnVtOgorCUNBVEVHT1JZPSdjYXRlZ29yeScgfCBMSU5FQVI9J2xpbmVhcicgfCBEQVRFPSdkYXRlJyB8IExPRz0nbG9nYXJpdGhtaWMnIHxQWVJBTUlEPSdweXJhbWlkJzsKKwkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUwNTZjMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5hcGkuSVR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpLklUeXBlTG9hZGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lLlR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIucnVudGltZS5UeXBlTG9hZGVyUHJvdmlkZXI7CisKKy8vIFRPRE86IEF1dG8tZ2VuZXJhdGVkIEphdmFkb2MKKy8qKgorICogVGhlIENsYXNzIENoYXJ0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIENoYXJ0RFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlIGV4dGVuZHMgQ2hhcnREU0xSdW50aW1lTW9kdWxlIHsKKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkFic3RyYWN0Q2hhcnREU0xSdW50aW1lTW9kdWxlI2JpbmRJSnZtVHlwZVByb3ZpZGVyJEZhY3RvcnkoKQorCSAqLworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLklKdm1UeXBlUHJvdmlkZXIuRmFjdG9yeT4gYmluZElKdm1UeXBlUHJvdmlkZXIkRmFjdG9yeSgpIHsKKwkJcmV0dXJuIEJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeS5jbGFzczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkFic3RyYWN0Q2hhcnREU0xSdW50aW1lTW9kdWxlI2JpbmRBYnN0cmFjdFR5cGVTY29wZVByb3ZpZGVyKCkKKwkgKi8KKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LkFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXI+IGJpbmRBYnN0cmFjdFR5cGVTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gQnVuZGxlU3BhY2VUeXBlU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBCaW5kIEkgdHlwZSBsb2FkZXIgZmFjdG9yeS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNsYXNzPD8gZXh0ZW5kcyBJIHR5cGUgbG9hZGVyIGZhY3Rvcnk+CisJICovCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVHlwZUxvYWRlckZhY3Rvcnk+IGJpbmRJVHlwZUxvYWRlckZhY3RvcnkoKSB7CisJCXJldHVybiBUeXBlTG9hZGVyRmFjdG9yeS5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBJIHR5cGUgbG9hZGVyIHByb3ZpZGVyLgorCSAqCisJICogQHJldHVybiB0aGUgY2xhc3M8PyBleHRlbmRzIEkgdHlwZSBsb2FkZXIgcHJvdmlkZXI+CisJICovCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVHlwZUxvYWRlclByb3ZpZGVyPiBJVHlwZUxvYWRlclByb3ZpZGVyKCkgeworCQlyZXR1cm4gVHlwZUxvYWRlclByb3ZpZGVyLmNsYXNzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE3YTg3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci54YmFzZS5zZXR1cHMuWGJhc2VCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cDsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lkd1aWNlOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCisvLyBUT0RPOiBBdXRvLWdlbmVyYXRlZCBKYXZhZG9jCisvKioKKyAqIFRoZSBDbGFzcyBDaGFydERTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIENoYXJ0RFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAgZXh0ZW5kcyBDaGFydERTTFN0YW5kYWxvbmVTZXR1cCB7CisJCisJLyoqCisJICogRG8gc2V0dXAuCisJICovCisJcHVibGljIHN0YXRpYyB2b2lkIGRvU2V0dXAoKSB7CisJCW5ldyBDaGFydERTTEJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwKCkuY3JlYXRlSW5qZWN0b3JBbmREb0VNRlJlZ2lzdHJhdGlvbigpOworCX0KKwkKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMU3RhbmRhbG9uZVNldHVwR2VuZXJhdGVkI2NyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCkgeworCQlYYmFzZUJ1bmRsZVNwYWNlU3RhbmRhbG9uZVNldHVwLmRvU2V0dXAoKTsKKworCQlJbmplY3RvciBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKCk7CisJCXJlZ2lzdGVyKGluamVjdG9yKTsKKwkJcmV0dXJuIGluamVjdG9yOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQjY3JlYXRlSW5qZWN0b3IoKQorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvcigpIHsKKwkJcmV0dXJuIEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBDaGFydERTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZSgpKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE1ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLklWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuTGF6eUp2bVR5cGVMaW5rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLlNlbWFudGljTG9hZGluZ1Jlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5saW5rZXIuTGF6eUp2bVR5cGVUcmFuc2llbnRWYWx1ZVNlcnZpY2U7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5CaW5kZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0Lmp2bW1vZGVsLkNoYXJ0TW9kZWxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zY29waW5nLkNoYXJ0U2NvcGVQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnZhbHVlY29udmVydGVyLkNoYXJ0UXVhbGlmaWVkTmFtZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudmFsdWVjb252ZXJ0ZXIuQ2hhcnRWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkRTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlcjsKKworLy8gVE9ETzogQXV0by1nZW5lcmF0ZWQgSmF2YWRvYworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgYXQgcnVudGltZSAvIHdpdGhvdXQgdGhlIEVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5LgorICovCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xSdW50aW1lTW9kdWxlIGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZSB7CisJCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZSNiaW5kSUdlbmVyYXRvcigpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJR2VuZXJhdG9yPiBiaW5kSUdlbmVyYXRvcigpIHsKKwkgICAgcmV0dXJuIENoYXJ0TW9kZWxHZW5lcmF0b3IuY2xhc3M7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZSNiaW5kSVNjb3BlUHJvdmlkZXIoKQorCSAqLworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIENoYXJ0U2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisJCisJLyoqCisJICogT25seSByZXF1aXJlZCwgaWYgZnFuIGNhbiBub3QgYmUgY3JlYXRlZCBieSBhcHBlbmRpbmcgdGhlIG5hbWVzIG9mIHRoZQorCSAqIHNlbWFudGljIGVsZW1lbnRzIHVwIHRoZSBoaWVyYXJjaHkuCisJICoKKwkgKiBAcmV0dXJuIHRoZSBjbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLiBJIHF1YWxpZmllZCBuYW1lIHByb3ZpZGVyPgorCSAqLworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI+IGJpbmRJUXVhbGlmaWVkTmFtZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gQ2hhcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLyogKG5vbi1KYXZhZG9jKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5BYnN0cmFjdENoYXJ0RFNMUnVudGltZU1vZHVsZSNiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlPiBiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpIHsKKwkJcmV0dXJuIENoYXJ0VmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmNsYXNzOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQWJzdHJhY3RDaGFydERTTFJ1bnRpbWVNb2R1bGUjY29uZmlndXJlKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcikKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBjb25maWd1cmUoQmluZGVyIGJpbmRlcikgeworCQlzdXBlci5jb25maWd1cmUoYmluZGVyKTsKKwkJYmluZGVyLmJpbmQoSU91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlci5jbGFzcykudG8oRFNMT3V0cHV0Q29uZmlndXJhdGlvblByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworCX0KKworCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQWJzdHJhY3RDaGFydERTTFJ1bnRpbWVNb2R1bGUjYmluZFh0ZXh0UmVzb3VyY2UoKQorCSAqLworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuWHRleHRSZXNvdXJjZT4gYmluZFh0ZXh0UmVzb3VyY2UoKSB7CisJCXJldHVybiBTZW1hbnRpY0xvYWRpbmdSZXNvdXJjZS5jbGFzczsKKwl9CisKKwkvKiAobm9uLUphdmFkb2MpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkFic3RyYWN0Q2hhcnREU0xSdW50aW1lTW9kdWxlI2JpbmRJTGlua2VyKCkKKwkgKi8KKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmxpbmtpbmcuSUxpbmtlcj4gYmluZElMaW5rZXIoKSB7CisJCXJldHVybiBMYXp5SnZtVHlwZUxpbmtlci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBCaW5kIHNlcmlhbGl6ZXIgSSB0cmFuc2llbnQgdmFsdWUgc2VydmljZS4KKwkgKgorCSAqIEByZXR1cm4gdGhlIGNsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci4gSSB0cmFuc2llbnQgdmFsdWUgc2VydmljZT4KKwkgKi8KKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklUcmFuc2llbnRWYWx1ZVNlcnZpY2U+IGJpbmRTZXJpYWxpemVySVRyYW5zaWVudFZhbHVlU2VydmljZSgpIHsKKwkJcmV0dXJuIExhenlKdm1UeXBlVHJhbnNpZW50VmFsdWVTZXJ2aWNlLmNsYXNzOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvQ2hhcnREU0xTdGFuZGFsb25lU2V0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmI5OGZkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9DaGFydERTTFN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ7CisKKy8vIFRPRE86IEF1dG8tZ2VuZXJhdGVkIEphdmFkb2MKKy8qKgorICogSW5pdGlhbGl6YXRpb24gc3VwcG9ydCBmb3IgcnVubmluZyBYdGV4dCBsYW5ndWFnZXMgCisgKiB3aXRob3V0IGVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5LgorICovCitwdWJsaWMgY2xhc3MgQ2hhcnREU0xTdGFuZGFsb25lU2V0dXAgZXh0ZW5kcyBDaGFydERTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZHsKKworCS8qKgorCSAqIERvIHNldHVwLgorCSAqLworCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1NldHVwKCkgeworCQluZXcgQ2hhcnREU0xTdGFuZGFsb25lU2V0dXAoKS5jcmVhdGVJbmplY3RvckFuZERvRU1GUmVnaXN0cmF0aW9uKCk7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0dlbmVyYXRlQ2hhcnREU0wubXdlMiBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvR2VuZXJhdGVDaGFydERTTC5td2UyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MTI5YmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0dlbmVyYXRlQ2hhcnREU0wubXdlMgpAQCAtMCwwICsxLDE3MSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworbW9kdWxlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuR2VuZXJhdGVDaGFydERTTAorCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm13ZS51dGlscy4qCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLioKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuKgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLm13ZS4qCisKK3ZhciBwcm9qZWN0TmFtZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0IgordmFyIGdyYW1tYXJVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlLyR7cHJvamVjdE5hbWV9L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L0NoYXJ0RFNMLnh0ZXh0IgordmFyIGZpbGVFeHRlbnNpb25zID0gImNoYXJ0IgordmFyIHJ1bnRpbWVQcm9qZWN0ID0gIi4uLyR7cHJvamVjdE5hbWV9IgordmFyIGdlbmVyYXRlWHRlbmRTdHViID0gdHJ1ZQordmFyIGVuY29kaW5nID0gIlVURi04IgorCitXb3JrZmxvdyB7CisJYmVhbiA9IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZS5YY29yZVN0YW5kYWxvbmVTZXR1cCA6IHhjb3JlIHt9CisJYmVhbiA9IG9yZy5lY2xpcHNlLnh0ZXh0Lm13ZS5SZWFkZXIgeworCQlyZWdpc3RlciA9IHhjb3JlCisJfQorICAgIGJlYW4gPSBNYXZlblN0YW5kYWxvbmVTZXR1cCB7CisgICAgCXNjYW5DbGFzc1BhdGggPSB0cnVlCisgICAgCXBsYXRmb3JtVXJpID0gIiR7cnVudGltZVByb2plY3R9Ly4uIgorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9tb2RlbC9DaGFydERTTC54Y29yZSIKKy8vCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9tb2RlbC9DaGFydERTTC54Y29yZSIKKwkJcmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZSIKKwkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wvbW9kZWwvRGF0YW1hcnREU0wueGNvcmUiCisvLwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wvbW9kZWwvRGF0YW1hcnREU0wueGNvcmUiCisJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydERTTFBhY2thZ2UiCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmN1YmVkc2wvbW9kZWwvQ3ViZURTTC54Y29yZSIKKy8vCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlZHNsL21vZGVsL0N1YmVEU0wueGNvcmUiCisJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlZHNsLkN1YmVEU0xQYWNrYWdlIgorCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0L21vZGVsL2VudGl0eS54Y29yZSIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAuZHNsLmVudGl0eS54dGV4dC9tb2RlbC9lbnRpdHkueGNvcmUiCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQvbW9kZWwvdHlwZXMueGNvcmUiCisJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQvbW9kZWwvdHlwZXMueGNvcmUiCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMvbW9kZWwvSmF2YVZNVHlwZXMuZ2VubW9kZWwiCisJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMvbW9kZWwvSmF2YVZNVHlwZXMuZWNvcmUiCisJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YYmFzZS5nZW5tb2RlbCIKKwkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlL21vZGVsL1h0eXBlLmVjb3JlIgorCQlyZWdpc3RlckVjb3JlRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQueGJhc2UvbW9kZWwvWGJhc2UuZWNvcmUiCisJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YQW5ub3RhdGlvbnMuZWNvcmUiCisgICAgfQorICAgIAorICAgIGNvbXBvbmVudCA9IERpcmVjdG9yeUNsZWFuZXIgeworICAgIAlkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0vc3JjLWdlbiIKKyAgICAJZXhjbHVkZSA9ICJSRUFETUUudHh0IgorICAgIH0KKyAgICAKKyAgICBjb21wb25lbnQgPSBEaXJlY3RvcnlDbGVhbmVyIHsKKyAgICAJZGlyZWN0b3J5ID0gIiR7cnVudGltZVByb2plY3R9LnVpL3NyYy1nZW4iCisgICAgCWV4Y2x1ZGUgPSAiUkVBRE1FLnR4dCIKKyAgICB9CisgICAgCisgICAgY29tcG9uZW50ID0gRGlyZWN0b3J5Q2xlYW5lciB7CisgICAgCWRpcmVjdG9yeSA9ICIke3J1bnRpbWVQcm9qZWN0fS50ZXN0cy9zcmMtZ2VuIgorICAgIAlleGNsdWRlID0gIlJFQURNRS50eHQiCisgICAgfQorICAgIAorICAgIGNvbXBvbmVudCA9IEdlbmVyYXRvciB7CisgICAgCXBhdGhSdFByb2plY3QgPSBydW50aW1lUHJvamVjdAorICAgIAlwYXRoVWlQcm9qZWN0ID0gIiR7cnVudGltZVByb2plY3R9LnVpIgorICAgIAlwYXRoVGVzdFByb2plY3QgPSAiJHtydW50aW1lUHJvamVjdH0udGVzdHMiCisgICAgCXByb2plY3ROYW1lUnQgPSBwcm9qZWN0TmFtZQorICAgIAlwcm9qZWN0TmFtZVVpID0gIiR7cHJvamVjdE5hbWV9LnVpIgorCQllbmNvZGluZyA9IGVuY29kaW5nCisgICAgCWxhbmd1YWdlID0gYXV0by1pbmplY3QgeworICAgIAkJdXJpID0gZ3JhbW1hclVSSQorICAgIAorICAgIAkJLy8gSmF2YSBBUEkgdG8gYWNjZXNzIGdyYW1tYXIgZWxlbWVudHMgKHJlcXVpcmVkIGJ5IHNldmVyYWwgb3RoZXIgZnJhZ21lbnRzKQorICAgIAkJZnJhZ21lbnQgPSBncmFtbWFyQWNjZXNzLkdyYW1tYXJBY2Nlc3NGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gZ2VuZXJhdGVzIEphdmEgQVBJIGZvciB0aGUgZ2VuZXJhdGVkIEVQYWNrYWdlcworICAgIAkJZnJhZ21lbnQgPSBlY29yZS5FTUZHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gdGhlIG9sZCBzZXJpYWxpemF0aW9uIGNvbXBvbmVudAorICAgIAkJLy8gZnJhZ21lbnQgPSBwYXJzZVRyZWVDb25zdHJ1Y3Rvci5QYXJzZVRyZWVDb25zdHJ1Y3RvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9ICAgIAorICAgIAorICAgIAkJLy8gc2VyaWFsaXplciAyLjAKKyAgICAJCWZyYWdtZW50ID0gc2VyaWFsaXplci5TZXJpYWxpemVyRnJhZ21lbnQgYXV0by1pbmplY3QgeworICAgIAkJCWdlbmVyYXRlU3R1YiA9IGZhbHNlCisgICAgCQl9CisgICAgCisgICAgCQkvLyBhIGN1c3RvbSBSZXNvdXJjZUZhY3RvcnkgZm9yIHVzZSB3aXRoIEVNRgorICAgIAkJZnJhZ21lbnQgPSByZXNvdXJjZUZhY3RvcnkuUmVzb3VyY2VGYWN0b3J5RnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIFRoZSBhbnRsciBwYXJzZXIgZ2VuZXJhdG9yIGZyYWdtZW50LgorICAgIAkJZnJhZ21lbnQgPSBwYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHsKKyAgICAJCS8vICBvcHRpb25zID0geworICAgIAkJLy8gICAgICBiYWNrdHJhY2sgPSB0cnVlCisgICAgCQkvLyAgfQorICAgIAkJfQorICAgIAorICAgIAkJLy8gWHRlbmQtYmFzZWQgQVBJIGZvciB2YWxpZGF0aW9uCisgICAgCQlmcmFnbWVudCA9IHZhbGlkYXRpb24uVmFsaWRhdG9yRnJhZ21lbnQgYXV0by1pbmplY3QgeworICAgIAkJLy8gICAgY29tcG9zZWRDaGVjayA9ICJvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkltcG9ydFVyaVZhbGlkYXRvciIKKyAgICAJCS8vICAgIGNvbXBvc2VkQ2hlY2sgPSAib3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5OYW1lc0FyZVVuaXF1ZVZhbGlkYXRvciIKKyAgICAJCX0KKyAgICAKKyAgICAJCS8vIG9sZCBzY29waW5nIGFuZCBleHBvcnRpbmcgQVBJCisgICAgCQkvLyBmcmFnbWVudCA9IHNjb3BpbmcuSW1wb3J0VVJJU2NvcGluZ0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCQkvLyBmcmFnbWVudCA9IGV4cG9ydGluZy5TaW1wbGVOYW1lc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBzY29waW5nIGFuZCBleHBvcnRpbmcgQVBJCisgICAgCQlmcmFnbWVudCA9IHNjb3BpbmcuSW1wb3J0TmFtZXNwYWNlc1Njb3BpbmdGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAkJZnJhZ21lbnQgPSBleHBvcnRpbmcuUXVhbGlmaWVkTmFtZXNGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAkJZnJhZ21lbnQgPSBidWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBnZW5lcmF0b3IgQVBJCisgICAgCQlmcmFnbWVudCA9IGdlbmVyYXRvci5HZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gZm9ybWF0dGVyIEFQSQorICAgIAkJZnJhZ21lbnQgPSBmb3JtYXR0aW5nLkZvcm1hdHRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBsYWJlbGluZyBBUEkKKyAgICAJCWZyYWdtZW50ID0gbGFiZWxpbmcuTGFiZWxQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBvdXRsaW5lIEFQSQorICAgIAkJZnJhZ21lbnQgPSBvdXRsaW5lLk91dGxpbmVUcmVlUHJvdmlkZXJGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAkJZnJhZ21lbnQgPSBvdXRsaW5lLlF1aWNrT3V0bGluZUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBxdWlja2ZpeCBBUEkKKyAgICAJCWZyYWdtZW50ID0gcXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBjb250ZW50IGFzc2lzdCBBUEkKKyAgICAJCWZyYWdtZW50ID0gY29udGVudEFzc2lzdC5Db250ZW50QXNzaXN0RnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGdlbmVyYXRlcyBhIG1vcmUgbGlnaHR3ZWlnaHQgQW50bHIgcGFyc2VyIGFuZCBsZXhlciB0YWlsb3JlZCBmb3IgY29udGVudCBhc3Npc3QKKyAgICAJCWZyYWdtZW50ID0gcGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBnZW5lcmF0ZXMganVuaXQgdGVzdCBzdXBwb3J0IGNsYXNzZXMgaW50byBHZW5lcmF0b3IjcGF0aFRlc3RQcm9qZWN0CisgICAgCQlmcmFnbWVudCA9IGp1bml0Lkp1bml0NEZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBwcm9qZWN0IHdpemFyZCAob3B0aW9uYWwpCisgICAgCQkvLyBmcmFnbWVudCA9IHByb2plY3RXaXphcmQuU2ltcGxlUHJvamVjdFdpemFyZEZyYWdtZW50IGF1dG8taW5qZWN0IHsKKyAgICAJCS8vICAgICAgZ2VuZXJhdG9yUHJvamVjdE5hbWUgPSAiJHtwcm9qZWN0TmFtZX0iCisgICAgCQkvLyB9CisgICAgCisgICAgCQkvLyByZW5hbWUgcmVmYWN0b3JpbmcKKyAgICAJCWZyYWdtZW50ID0gcmVmYWN0b3JpbmcuUmVmYWN0b3JFbGVtZW50TmFtZUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisgICAgCisgICAgCQkvLyBwcm92aWRlcyB0aGUgbmVjZXNzYXJ5IGJpbmRpbmdzIGZvciBqYXZhIHR5cGVzIGludGVncmF0aW9uCisgICAgCQlmcmFnbWVudCA9IHR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIGdlbmVyYXRlcyB0aGUgcmVxdWlyZWQgYmluZGluZ3Mgb25seSBpZiB0aGUgZ3JhbW1hciBpbmhlcml0cyBmcm9tIFhiYXNlCisgICAgCQlmcmFnbWVudCA9IHhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAKKyAgICAJCS8vIHByb3ZpZGVzIGEgcHJlZmVyZW5jZSBwYWdlIGZvciB0ZW1wbGF0ZSBwcm9wb3NhbHMKKyAgICAJCWZyYWdtZW50ID0gdGVtcGxhdGVzLkNvZGV0ZW1wbGF0ZXNHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorICAgIAorICAgIAkJLy8gcHJvdmlkZXMgYSBjb21wYXJlIHZpZXcKKyAgICAJCWZyYWdtZW50ID0gY29tcGFyZS5Db21wYXJlRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKyAgICAJCQorICAgIAkJLy8gcGFyc2UgZ3JhbW1hciBhbmQgZ2VuZXJhdGUgaTE4biBncmFtbWFyCisgICAgICAgICAgICBmcmFnbWVudCA9IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMuZ2VuZXJhdG9yLkJhc2ljRHNsR3JhbW1hckkxOG5HZW5lcmF0b3IgYXV0by1pbmplY3Qge30KKyAgICAJfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDUzOTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhjb3JlLnJlc291cmNlLlhjb3JlUmVzb3VyY2U7CisKKy8vIFRPRE86IEF1dG8tZ2VuZXJhdGVkIEphdmFkb2MKKy8qKgorICogQSBmYWN0b3J5IGZvciBjcmVhdGluZyBYY29yZVJlc291cmNlIG9iamVjdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBYY29yZVJlc291cmNlRmFjdG9yeSBpbXBsZW1lbnRzIFJlc291cmNlLkZhY3RvcnkgeworCQorCS8qIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZS5GYWN0b3J5I2NyZWF0ZVJlc291cmNlKG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkkpCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFVSSSB1cmkpIHsKKwkJWGNvcmVSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBYY29yZVJlc291cmNlKCk7CisJCXJlc291cmNlLnNldFVSSSh1cmkpOworCQlyZXR1cm4gcmVzb3VyY2U7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2Zvcm1hdHRpbmcvQ2hhcnREU0xGb3JtYXR0ZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2Zvcm1hdHRpbmcvQ2hhcnREU0xGb3JtYXR0ZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2NWYxZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvZm9ybWF0dGluZy9DaGFydERTTEZvcm1hdHRlci54dGVuZApAQCAtMCwwICsxLDQ5IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZm9ybWF0dGluZworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMueHRleHQuR2VuZXJpY0Zvcm1hdHRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmZvcm1hdHRpbmcuaW1wbC5BYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkZvcm1hdHRpbmdDb25maWcKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3MKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5HcmFtbWFyCisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuc2VydmljZXMuQ2hhcnREU0xHcmFtbWFyQWNjZXNzCisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjdXN0b20gZm9ybWF0dGluZyBkZXNjcmlwdGlvbi4KKyAqIAorICogc2VlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjZm9ybWF0dGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdCAKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitjbGFzcyBDaGFydERTTEZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXIgeworCisvLwlASW5qZWN0IGV4dGVuc2lvbiBDaGFydERTTEdyYW1tYXJBY2Nlc3MKKwlASW5qZWN0IFh0eXBlR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzCisKKwlvdmVycmlkZSBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVGb3JtYXR0aW5nKEZvcm1hdHRpbmdDb25maWcgYykgeworCQl2YWwgZ2VuZXJpY0Zvcm1hdHRlciA9IG5ldyBHZW5lcmljRm9ybWF0dGVyKCkKKyAKKwkJZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKCBjLCBncmFtbWFyLmdyYW1tYXIsICJDaGFydCIsICJDaGFydEltcG9ydCIgKQorCQlnZW5lcmljRm9ybWF0dGVyLmdlbmVyaWNGb3JtYXR0aW5nKCBjLCBncmFtbWFyLCBncmFtbWFyQWNjZXNzICkKKwl9Cit9CisgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMjRlMTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IueHRlbmQKQEAgLTAsMCArMSwxNTEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbAorCitpbXBvcnQgY29tLnZhYWRpbi5hbm5vdGF0aW9ucy5KYXZhU2NyaXB0CitpbXBvcnQgY29tLnZhYWRpbi5zaGFyZWQudWkuSmF2YVNjcmlwdENvbXBvbmVudFN0YXRlCitpbXBvcnQgY29tLnZhYWRpbi51aS5BYnN0cmFjdEphdmFTY3JpcHRDb21wb25lbnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0CitpbXBvcnQgamF2YS51dGlsLkxpc3QKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUFubm90YXRpb25SZWZlcmVuY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtQ29uc3RydWN0b3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtRGVjbGFyZWRUeXBlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVN0cmluZ0Fubm90YXRpb25WYWx1ZQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1WaXNpYmlsaXR5CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeQoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1EZWNsYXJlZFR5cGVBY2NlcHRvcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkp2bVR5cGVzQnVpbGRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY29uc3RhbnRzLkdlbmVyYXRvckNvbnN0YW50cworCitjbGFzcyBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yIHsKKwkJCisJCUBJbmplY3QgZXh0ZW5zaW9uIEp2bVR5cGVzQnVpbGRlcgorCQlASW5qZWN0IGV4dGVuc2lvbiBEM0pzSmF2YVV0aWwKKwkJQEluamVjdAorCQlwcml2YXRlIFR5cGVzRmFjdG9yeSB0eXBlc0ZhY3RvcnkKKwkJCisJCQorCQlkZWYgdm9pZCBjcmVhdGVKc0phdmFDb21wb25lbnQoQ2hhcnQgY2hhcnQsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvcil7CisJCQl2YWwgc3RhdGVDbGFzc05hbWUgPSBjaGFydC5jcmVhdGVTdGF0ZUZpbGVuYW1lCisJCQl2YXIgY2hhcnRfY2xzID0gY2hhcnQudG9DbGFzcyhjaGFydC5jcmVhdGVmdWxseVF1YWxpZmllZENoYXJ0RmlsZW5hbWUpCisJCQljaGFydF9jbHMuZG9jdW1lbnRhdGlvbiA9IEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OCisJCQkvLyBKYXZhU2NyaXB0LUphdmEtU3RhdGUtQ29tcG9uZW50IGNyZWF0aW9uCisJCQl2YXIgc3RhdGVfY2xzID0gY2hhcnQudG9DbGFzcyhjaGFydC5jcmVhdGVmdWxseVF1YWxpZmllZFN0YXRlRmlsZW5hbWUpCisJCQlzdGF0ZV9jbHMuZG9jdW1lbnRhdGlvbiA9IEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OCisJCQlpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKXsKKwkJCQl2YWwgQ2hhcnRUcmVlIGNoYXJ0VHJlZSA9IGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydFRyZWUKKwkJCQkvLyBKYXZhU2NyaXB0LUphdmEtQ29tcG9uZW50IGNyZWF0aW9uCisJCSAgIAkJYWNjZXB0b3IuYWNjZXB0KGNoYXJ0X2NscykKKwkJICAgCQkJLmluaXRpYWxpemVMYXRlcihbCisJCSAgIAkJCQlzdXBlclR5cGVzICs9IGNoYXJ0Lm5ld1R5cGVSZWYodHlwZW9mKEFic3RyYWN0SmF2YVNjcmlwdENvbXBvbmVudCkpCisJCQkJCQl2YXIgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBqc0Fubm90YXRpb25SZWYgPSBjaGFydFRyZWUudG9Bbm5vdGF0aW9uKHR5cGVvZihKYXZhU2NyaXB0KSkKKwkJCQkJCXZhciBqc0Fubm90YXRpb25MaXN0ID0gbmV3QXJyYXlMaXN0KCJkMy5taW4uanMiLCBjaGFydC5jcmVhdGVDaGFydEpzRmlsZW5hbWUpCisJCQkJCQlqc0Fubm90YXRpb25SZWYuYWRkU3RyaW5nVmFsdWVzVG9Bbm5vdGF0aW9uKGpzQW5ub3RhdGlvbkxpc3QpCisJCQkJCQlhbm5vdGF0aW9ucyArPSBqc0Fubm90YXRpb25SZWYKKwkJCQkJCWlmIChjaGFydFRyZWUubWFwKXsKKwkJICAgCQkJCQlpdC50b1RyZWVNYXBDb25zdHJ1Y3RvcihjaGFydCkKKwkJCQkJCX0gZWxzZSBpZiAoY2hhcnRUcmVlLmNvbGxhcHNpYmxlKSB7CisJCSAgIAkJCQkJaXQudG9DaGFydENvbnN0cnVjdG9yKGNoYXJ0KQorCQkJCQkJfQorCQkJCQkJaXQudG9DaGFydE9wZXJhdGlvbnMoY2hhcnQsIHN0YXRlQ2xhc3NOYW1lKQorCQkgICAJCQldKQorCQkJCS8vIEphdmFTY3JpcHQtSmF2YS1TdGF0ZS1Db21wb25lbnQgY3JlYXRpb24KKwkJICAgCQlhY2NlcHRvci5hY2NlcHQoc3RhdGVfY2xzKQorCQkgICAJCQkuaW5pdGlhbGl6ZUxhdGVyKFsKKwkJICAgCQkJCXN1cGVyVHlwZXMgKz0gY2hhcnQubmV3VHlwZVJlZih0eXBlb2YoSmF2YVNjcmlwdENvbXBvbmVudFN0YXRlKSkKKwkJCQkJCWlmIChjaGFydFRyZWUubWFwKXsKKwkJCQkJCQlpdC50b1RyZWVNYXBTdGF0ZUZpZWxkcyhjaGFydCkKKwkJCQkJCX0gZWxzZSBpZiAoY2hhcnRUcmVlLmNvbGxhcHNpYmxlKSB7CisJCSAgIAkJCQkJaXQudG9DaGFydFN0YXRlRmllbGRzKGNoYXJ0KQorCQkJCQkJfQorCQkgICAJCQldKQorCQkJfQorCQl9CisJCisJCisJZGVmIHZvaWQgdG9DaGFydE9wZXJhdGlvbnMoSnZtRGVjbGFyZWRUeXBlIHR5cGUsIENoYXJ0IGNoYXJ0LCBTdHJpbmcgc3RhdGVDbGFzc05hbWUpeworCQkvLyBjcmVhdGUgdmlldworICAgCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9NZXRob2QoImdldFN0YXRlIiwgY2hhcnQubmV3VHlwZVJlZihzdGF0ZUNsYXNzTmFtZSksIFsKKyAgIAkJCWJvZHkgPSBbIGFwcGVuZCgnJydyZXR1cm4gKMKrc3RhdGVDbGFzc05hbWXCuykgc3VwZXIuZ2V0U3RhdGUoKTsnJycpXQorICAgCQldKQorCQkKKwl9CisKKwlkZWYgZ2V0RDNTdGF0ZVZhcnMoKQorCQknJycKKwkJZ2V0U3RhdGUoKS5qc29uRGF0YSA9IF9qc29uRGF0YTsKKwkJZ2V0U3RhdGUoKS5odG1sVGFnSWQ9X2h0bWxUYWdJZDsnJycKKworCWRlZiBKdm1Db25zdHJ1Y3RvciBnZXRDaGFydENvbnN0cnVjdG9yKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBDaGFydCBjaGFydCkgeworCQlyZXR1cm4gY2hhcnQudG9Db25zdHJ1Y3RvcihbCisJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJfaHRtbFRhZ0lkIiwgY2hhcnQubmV3VHlwZVJlZih0eXBlb2YoU3RyaW5nKSkpCisJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJfanNvbkRhdGEiLCBjaGFydC5uZXdUeXBlUmVmKHR5cGVvZihTdHJpbmcpKSkKKwkJCWJvZHkgPSBbIGFwcGVuZChnZXREM1N0YXRlVmFycyldCisJCV0pCisJfQorCQkKKwlkZWYgdm9pZCB0b1RyZWVNYXBDb25zdHJ1Y3RvcihKdm1EZWNsYXJlZFR5cGUgdHlwZSwgQ2hhcnQgY2hhcnQpIHsKKwkJdmFyIEp2bUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdHlwZS5nZXRDaGFydENvbnN0cnVjdG9yKGNoYXJ0KQorCQljb25zdHJ1Y3Rvci5wYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJkYXRhQ29sdW1ucyIsIGNoYXJ0Lm5ld1R5cGVSZWYodHlwZW9mKExpc3QpLCBjaGFydC5uZXdUeXBlUmVmKHR5cGVvZihTdHJpbmcpKSkpCisJCWNvbnN0cnVjdG9yLmJvZHkgPSBbIGFwcGVuZCgKKwkJJycnCisJCcKrZDNTdGF0ZVZhcnPCuworCQlnZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0ID0gZGF0YUNvbHVtbnM7JycnKV0KKwkJdHlwZS5tZW1iZXJzICs9IGNvbnN0cnVjdG9yCisJfQorCQorCWRlZiB2b2lkIHRvQ2hhcnRDb25zdHJ1Y3RvcihKdm1EZWNsYXJlZFR5cGUgdHlwZSwgQ2hhcnQgY2hhcnQpIHsKKwkJdmFyIEp2bUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdHlwZS5nZXRDaGFydENvbnN0cnVjdG9yKGNoYXJ0KQorCQl0eXBlLm1lbWJlcnMgKz0gY29uc3RydWN0b3IKKwl9CisJCisJZGVmIHZvaWQgYWRkU3RyaW5nVmFsdWVzVG9Bbm5vdGF0aW9uKEp2bUFubm90YXRpb25SZWZlcmVuY2UgYW5ub3RhdGlvblJlZiwgQXJyYXlMaXN0PFN0cmluZz4gYW5ub3RhdGlvblN0cmluZ0xpc3QpeworCQl2YXIgSnZtU3RyaW5nQW5ub3RhdGlvblZhbHVlIHZhbHVlID0gdHlwZXNGYWN0b3J5LmNyZWF0ZUp2bVN0cmluZ0Fubm90YXRpb25WYWx1ZQorCQlmb3IgKGFubm90YXRpb25TdHJpbmcgOiBhbm5vdGF0aW9uU3RyaW5nTGlzdCl7CisJCQl2YWx1ZS52YWx1ZXMgKz0gYW5ub3RhdGlvblN0cmluZworCQl9CisJCWFubm90YXRpb25SZWYuZXhwbGljaXRWYWx1ZXMgKz0gdmFsdWUKKwl9CisJCQorCWRlZiB2b2lkIHRvVHJlZU1hcFN0YXRlRmllbGRzKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBDaGFydCBjaGFydCl7CisJCXR5cGUudG9DaGFydFN0YXRlRmllbGRzKGNoYXJ0KQorCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9GaWVsZCgiZGF0YUNvbHVtbkxpc3QiLCBjaGFydC5uZXdUeXBlUmVmKExpc3QsIGNoYXJ0Lm5ld1R5cGVSZWYoU3RyaW5nKSkpWworCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHk6OlBVQkxJQworCQkJc2V0SW5pdGlhbGl6ZXIoW2FwcGVuZCgnJyduZXcgQXJyYXlMaXN0PFN0cmluZz4oKScnJyldKV0KKwl9CisKKwlkZWYgdm9pZCB0b0NoYXJ0U3RhdGVGaWVsZHMoSnZtRGVjbGFyZWRUeXBlIHR5cGUsIENoYXJ0IGNoYXJ0KXsKKwkJdHlwZS5tZW1iZXJzICs9IGNoYXJ0LnRvRmllbGQoImpzb25EYXRhIiwgY2hhcnQubmV3VHlwZVJlZihTdHJpbmcpKVsKKwkJCXZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5OjpQVUJMSUMKKwkJCXNldEluaXRpYWxpemVyKFthcHBlbmQoJycnIiInJycpXSldCisJCXR5cGUubWVtYmVycyArPSBjaGFydC50b0ZpZWxkKCJodG1sVGFnSWQiLCBjaGFydC5uZXdUeXBlUmVmKFN0cmluZykpWworCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHk6OlBVQkxJQworCQkJc2V0SW5pdGlhbGl6ZXIoW2FwcGVuZCgnJyciIicnJyldKV0KKwkJdHlwZS5tZW1iZXJzICs9IGNoYXJ0LnRvRmllbGQoImlucHV0VmFsdWUiLCBjaGFydC5uZXdUeXBlUmVmKFN0cmluZykpWworCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHk6OlBVQkxJQworCQkJc2V0SW5pdGlhbGl6ZXIoW2FwcGVuZCgnJyciIicnJyldKV0KKwl9CisKKwlkZWYgY3JlYXRlRDNDaGFydChDaGFydCBjaGFydCkKKwkJJycnCisJCUNlbGxTZXRUb0QzSnNvbkNvbnZlcnRlciBqc29uQ29udmVydGVyID0gbmV3IENlbGxTZXRUb0QzSnNvbkNvbnZlcnRlcigpOworCQlyZXR1cm4gbmV3IMKrdmFsIGQzQ2hhcnRGaWxlTmFtZSA9IGNoYXJ0LmNyZWF0ZUNoYXJ0RmlsZW5hbWXCu8KrZDNDaGFydEZpbGVOYW1lwrsoIsKrZDNDaGFydEZpbGVOYW1lwrsiLCBqc29uQ29udmVydGVyLmdldEQzSnNvblN0cmluZyhjeENlbGxTZXQpwqtJRiBjaGFydC50cmVlTWFwwrssIGpzb25Db252ZXJ0ZXIuZ2V0RGF0YUNvbHVtbk5hbWVMaXN0KGN4Q2VsbFNldCnCq0VORElGwrspOycnJworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWQwYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEp2bU1vZGVsSW5mZXJyZXIueHRlbmQKQEAgLTAsMCArMSwxMTg3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbAorCitpbXBvcnQgY29tLmdpdGh1Yi53b2xmaWUucmVmcmVzaGVyLlJlZnJlc2hlcgoraW1wb3J0IGNvbS52YWFkaW4uZGF0YS5Qcm9wZXJ0eS5WYWx1ZUNoYW5nZUxpc3RlbmVyCitpbXBvcnQgY29tLnZhYWRpbi51aS5Db21wb25lbnQKK2ltcG9ydCBjb20udmFhZGluLnVpLlZlcnRpY2FsTGF5b3V0CitpbXBvcnQgZWxlbWVudGFsLmpzb24uSnNvbkV4Y2VwdGlvbgoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3QKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcAoraW1wb3J0IGphdmEudXRpbC5Mb2NhbGUKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3QKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3kKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5EQ2hhcnRzCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5jb250ZXh0cy5JRWNsaXBzZUNvbnRleHQKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi5NQXBwbGljYXRpb24KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEF0dHJpYnV0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAub3NnaS5oeWJyaWQuYXBpLkFic3RyYWN0SHlicmlkVmFhY2xpcHNlVmlldworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmRhdGFtYXJ0LkRlcml2ZWRPbGFwRXhjZXB0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQuSURhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkubWV0YWRhdGEuSURTTE1ldGFkYXRhU2VydmljZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLnVzZXIuSVVzZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmNvbnN0YW50cy5HZW5lcmF0b3JDb25zdGFudHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnRoZW1lLkVudW1Dc3NDbGFzcworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMudmFhZGluLlByb3BlcnR5TG9va3VwCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJhcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCdWJibGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RG9udXQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0R2F1Z2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TGVnZW5kCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0TnVtYmVySW50ZXJ2YWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQaWUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0U2VnbWVudENvbG9yCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmN1YmVkc2wuQ3ViZUxldmVsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkQ2VsbFNldAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRBeGlzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEN1YmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVyaXZlZE1lYXN1cmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RW50aXR5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydE1lYXN1cmUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0TWVtYmVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydE93bmVyCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0UHJvcGVydHkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLlZhbHVlU2NhbGVFbnVtCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5qdm1tb2RlbC5EYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtRGVjbGFyZWRUeXBlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZpZWxkCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bU9wZXJhdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1WaXNpYmlsaXR5CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5BYnN0cmFjdE1vZGVsSW5mZXJyZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5JSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1UeXBlc0J1aWxkZXIKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcgoraW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS5sYXlvdXQuSVZpZXdMYXlvdXRNYW5hZ2VyCisKKy8qKgorICogPHA+CisgKiBUaGlzIGluZmVycmVyIGluZmVycyBtb2RlbHMgb2YgZXh0ZW5zaW9uIC5jaGFydCBhbmQgZ2VuZXJhdGVzIGNvZGUgdG8gYmUgdXNlZCBieSBhIGU0IGFwcGxpY2F0aW9uIGFzIHZpZXcuIFVuZGVybHlpbmcgY29tcG9uZW50cworICogYXJlIGZyb20gdGhlIHZhYWRpbiBjb21wb25lbnQgcmVwb3NpdG9yeSBhbmQgZXNwZWNpYWxseSB0aGUgdmFhZGluIGFkZG9uIGRDaGFydC4KKyAqIDwvcD4KKyAqIAorICogQGF1dGhvciBKb2VyZyBSaWVnZWwKKyAqLworCisvKioKKyAqIDxwPkluZmVycyBhIEpWTSBtb2RlbCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwuPC9wPiAKKyAqCisgKiA8cD5UaGUgSlZNIG1vZGVsIHNob3VsZCBjb250YWluIGFsbCBlbGVtZW50cyB0aGF0IHdvdWxkIGFwcGVhciBpbiB0aGUgSmF2YSBjb2RlIAorICogd2hpY2ggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBtb2RlbC4gT3RoZXIgbW9kZWxzIGxpbmsgYWdhaW5zdCB0aGUgSlZNIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzb3VyY2UgbW9kZWwuPC9wPiAgICAgCisgKi8KKyBjbGFzcyBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSW5mZXJyZXIgeworCisJQEluamVjdCBleHRlbnNpb24gSnZtVHlwZXNCdWlsZGVyCisJQEluamVjdCBleHRlbnNpb24gSVF1YWxpZmllZE5hbWVQcm92aWRlcgorCUBJbmplY3QgZXh0ZW5zaW9uIERhdGFtYXJ0RFNMSnZtTW9kZWxJbmZlcnJlciBkYXRhbWFydEluZmVycmVyCisJQEluamVjdCBleHRlbnNpb24gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvcgorCQorCS8qKgorCSAqIDxwPmluZmVyIG1ldGhvZCBkaXNwYXRjaGVzIHRoZSBuZWNlc3Nhcnkgcm91dGluZXMgdG8gYnVpbGQgZmllbGRzLCBzZXR0ZXIsIGdldHRlciwgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzIG9mIHRoZSBnZW5lcmF0ZWQgY29kZS48L3A+IAorCSAqCisJICovCisJZGVmIGRpc3BhdGNoIHZvaWQgaW5mZXIoQ2hhcnRQYWNrYWdlIHBja2csIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKwkJZm9yIChjaGFydDpwY2tnLmNoYXJ0cykgeworCQkJdmFyIGNscyA9IGNoYXJ0LnRvQ2xhc3MocGNrZy5mdWxseVF1YWxpZmllZE5hbWUrIi4iK2NoYXJ0Lm5hbWUrIkNoYXJ0IikKKwkgICAgICAgIGNscy5zdXBlclR5cGVzLmFkZChfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihBYnN0cmFjdEh5YnJpZFZhYWNsaXBzZVZpZXcpKQorCQkJY2xzLnN1cGVyVHlwZXMuYWRkKF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElVc2VyLlVzZXJMb2NhbGVMaXN0ZW5lcikpCisJICAgCQlhY2NlcHRvci5hY2NlcHQoY2xzLAorCSAgIAkJCVsKKwkJCQkgCWRvY3VtZW50YXRpb24gPSBHZW5lcmF0b3JDb25zdGFudHMuR0VORVJBVEVEX0NMQVNTRVNfRE9DVU1FTlRBVElPTgorCSAgIAkJCQlpdC50b0ZpZWxkcyhjaGFydCkKKwkgICAJCQkJaXQudG9Db25zdHJ1Y3RvcihjaGFydCkKKwkJCQkJaXQudG9HZXR0ZXJTZXR0ZXIoY2hhcnQpCisJCQkJCWl0LnRvT3BlcmF0aW9ucyhjaGFydCkKKwkgICAJCQldKQorCSAgIAkJaWYgKChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSB7CisJICAgCQkJY2hhcnQuY3JlYXRlSnNKYXZhQ29tcG9uZW50KGFjY2VwdG9yKQorCSAgIAkJfQorCQl9CisgICAJfQorCisJLyoqCisJICogPHA+YnVpbGQgdGhlIGNvbnN0cnVjdG9ycyB0byBiZSB1c2VkIGJ5IGFuIGU0IGFwcGxpY2F0aW9uLjwvcD4gCisJICoKKwkgKi8KKwlkZWYgdm9pZCB0b0NvbnN0cnVjdG9yKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBDaGFydCBjaGFydCkgeworCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9Db25zdHJ1Y3RvcihbCisJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdCkKKyAgIAkJCXBhcmFtZXRlcnMgKz0gY2hhcnQudG9QYXJhbWV0ZXIoInBhcmVudCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0KSkKKyAgIAkJCXBhcmFtZXRlcnMgKz0gY2hhcnQudG9QYXJhbWV0ZXIoImNvbnRleHQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRWNsaXBzZUNvbnRleHQpKQorICAgCQkJcGFyYW1ldGVycyArPSBjaGFydC50b1BhcmFtZXRlcigiYXBwIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoTUFwcGxpY2F0aW9uKSkKKwkJCWJvZHkgPSBbIGFwcGVuZCgnJydzdXBlcihwYXJlbnQsY29udGV4dCxhcHApOycnJyldCisJCV0pCisJfQorCQorCS8qKgorCSAqIDxwPmJ1aWxkIHRoZSBjbGFzcyB2YXJpYWJsZXMuPC9wPiAKKwkgKgorCSAqLworCWRlZiB2b2lkIHRvRmllbGRzKEp2bURlY2xhcmVkVHlwZSB0eXBlLCBDaGFydCBjaGFydCkgeworICAgCQl2YXIgSnZtRmllbGQgZmllbGQgPSBudWxsCisgICAJCS8vIGNyZWF0ZSBsb2dnZXIKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJsb2ciLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihMb2dnZXIpKVtzZXRJbml0aWFsaXplcihbYXBwZW5kKCcnJ29yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcigiY2hhcnRzIiknJycpXSldCisgICAJCWZpZWxkLnN0YXRpYyA9IHRydWUKKyAgIAkJZmllbGQudmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHk6OlBSSVZBVEUKKwkJdHlwZS5tZW1iZXJzICs9IGZpZWxkCisJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgidXNlciIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElVc2VyKSkgW2Fubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoSW5qZWN0KV0KKwkJdHlwZS5tZW1iZXJzICs9IGZpZWxkCisJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgiZWNsaXBzZUNvbnRleHQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRWNsaXBzZUNvbnRleHQpKSBbYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QpXQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJjb29yZGluYXRlU3lzdGVtIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQXJyYXlMaXN0LCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJbnRlZ2VyKSkpCisJCXR5cGUubWVtYmVycyArPSBmaWVsZAorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImZpbHRlckdlbmVyYXRvciIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElEYXRhbWFydEZpbHRlckdlbmVyYXRvcikpCisJCXR5cGUubWVtYmVycyArPSBmaWVsZAorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImxheW91dE1hbmFnZXIiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJVmlld0xheW91dE1hbmFnZXIpKQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJLy8gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgcmVmZXJlbmNlZCBkYXRhbWFydAorCQlpZiAoZ2V0U291cmNlRGF0YU1hcnRSZWZOYW1lKGNoYXJ0KSAhPSBudWxsKSB7CisJCQl2YXIgcGFja2FnZU5hbWUgPSAoY2hhcnQuc291cmNlLmRhdGFtYXJ0UmVmLmVDb250YWluZXIgYXMgRGF0YW1hcnRQYWNrYWdlKS5mdWxseVF1YWxpZmllZE5hbWUudG9TdHJpbmcKKwkJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgiZGF0YW1hcnRDbGFzcyIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKCcnJ8KrcGFja2FnZU5hbWXCuy7Cq2NoYXJ0LnNvdXJjZS5kYXRhbWFydFJlZi5uYW1lLnRvU3RyaW5nwrtEYXRhbWFydCcnJykpCisJCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJfQorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImZpbHRlckNoYW5nZUxpc3RlbmVyIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoVmFsdWVDaGFuZ2VMaXN0ZW5lcikpCisJCXR5cGUubWVtYmVycyArPSBmaWVsZAorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImNoYXJ0UmVmcmVzaGVyIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoUmVmcmVzaGVyKSkKKwkJdHlwZS5tZW1iZXJzICs9IGZpZWxkCisJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgiY2hhcnRSZWZyZXNoZXJEb25lIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoYm9vbGVhbikpCisJCXR5cGUubWVtYmVycyArPSBmaWVsZAorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImNoYXJ0UmVuZGVyRGVsYXkiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihSZWZyZXNoZXIpKQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJkYXRhQ29tcG9uZW50IiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29tcG9uZW50KSkKKwkJdHlwZS5tZW1iZXJzICs9IGZpZWxkCisJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgicHJvcGVydHlMb29rdXBNYXAiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihIYXNoTWFwLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihTdHJpbmcpLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihQcm9wZXJ0eUxvb2t1cCkpKQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJjaGFydHMiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihBcnJheUxpc3QsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKERDaGFydHMpKSkKKwkJdHlwZS5tZW1iZXJzICs9IGZpZWxkCisJCWZpZWxkID0gY2hhcnQudG9GaWVsZCgiZXZlbnRCcm9rZXIiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRXZlbnRCcm9rZXIpKSBbYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QpXQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJyZWZyZXNoVmlldyIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEV2ZW50SGFuZGxlcikpCisJCXR5cGUubWVtYmVycyArPSBmaWVsZAorCQlmaWVsZCA9IGNoYXJ0LnRvRmllbGQoImRzbE1ldGFkYXRhU2VydmljZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElEU0xNZXRhZGF0YVNlcnZpY2UpKSBbYW5ub3RhdGlvbnMgKz0gX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QpXQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwkJZmllbGQgPSBjaGFydC50b0ZpZWxkKCJsb2NhbGUiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihMb2NhbGUpKQorCQl0eXBlLm1lbWJlcnMgKz0gZmllbGQKKwl9CisKKwkvKioKKwkgKiA8cD5idWlsZCB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycyBmcm9tIGNsYXNzIHZhcmlhYmxlcy48L3A+IAorCSAqCisJICovCisJZGVmIHZvaWQgdG9HZXR0ZXJTZXR0ZXIoSnZtRGVjbGFyZWRUeXBlIHR5cGUsIENoYXJ0IGNoYXJ0KSB7CisgIAkJdmFyIEp2bU9wZXJhdGlvbiBvcGVyYXRpb24gPSBudWxsIAorICAJCW9wZXJhdGlvbiA9IGNoYXJ0LnRvR2V0dGVyKCJjb29yZGluYXRlU3lzdGVtIiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQXJyYXlMaXN0LCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJbnRlZ2VyKSkpCisgIAkJb3BlcmF0aW9uLnZpc2liaWxpdHkgPSBKdm1WaXNpYmlsaXR5OjpQVUJMSUMKKyAgCQl0eXBlLm1lbWJlcnMgKz0gb3BlcmF0aW9uCisJfQorCQorCS8qKgorCSAqIDxwPmJ1aWxkIHRoZSBtZXRob2RzLjwvcD4gCisJICoKKwkgKi8KKwlkZWYgdm9pZCB0b09wZXJhdGlvbnMoSnZtRGVjbGFyZWRUeXBlIHR5cGUsIENoYXJ0IGNoYXJ0KSB7CisgICAJCS8vIGNyZWF0ZSB2aWV3CisgICAJCXR5cGUubWVtYmVycyArPSBjaGFydC50b01ldGhvZCgiY3JlYXRlVmlldyIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisgICAJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJwYXJlbnQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWZXJ0aWNhbExheW91dCkpCisgICAJCQlib2R5ID0gWyBhcHBlbmQoJycnwqtjaGFydC5jcmVhdGVWaWV3wrsnJycpXQorICAgCQldKQorICAgCQkvLyBjcmVhdGUgY29tcG9uZW50cworICAgCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9NZXRob2QoImNyZWF0ZUNvbXBvbmVudHMiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkOjpUWVBFKSwgWworICAgCQkJYm9keSA9IFsgYXBwZW5kKCcnJ8KrY2hhcnQuY3JlYXRlQ29tcG9uZW50c8K7JycnKV0KKyAgIAkJXSkKKyAgIAkJLy8gY3JlYXRlIHRhYgorICAgCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9NZXRob2QoImNyZWF0ZVRhYlNoZWV0IiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29tcG9uZW50KSwgWworICAgCQkJZXhjZXB0aW9ucyArPSBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihEZXJpdmVkT2xhcEV4Y2VwdGlvbikKKyAgIAkJCXBhcmFtZXRlcnMgKz0gY2hhcnQudG9QYXJhbWV0ZXIoImNlbGxTZXQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihEZXJpdmVkQ2VsbFNldCkpCisgICAJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJheGlzTm8iLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJbnRlZ2VyKSkKKyAgIAkJCWJvZHkgPSBbIGFwcGVuZCgnJyfCq2NoYXJ0LmNyZWF0ZVRhYlNoZWV0wrsnJycpXQorICAgCQldKQorICAgCQkvLyBjcmVhdGUgY2hhcnQKKyAgIAkJaWYgKCEoKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSkpKSB7CisJICAgCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9NZXRob2QoImNyZWF0ZUNoYXJ0IiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29tcG9uZW50KSwgWworCSAgIAkJCWV4Y2VwdGlvbnMgKz0gX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoRGVyaXZlZE9sYXBFeGNlcHRpb24pCisJICAgCQkJcGFyYW1ldGVycyArPSBjaGFydC50b1BhcmFtZXRlcigiY2VsbFNldCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKERlcml2ZWRDZWxsU2V0KSkKKwkgICAJCQlib2R5ID0gWyBhcHBlbmQoJycnwqtjaGFydC5jcmVhdGVDaGFydMK7JycnKV0KKwkgICAJCV0pCisgICAJCX0KKyAgIAkJLy8gY3JlYXRlIEQzIGNoYXJ0CisJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSkgeworCQkgICAJCXR5cGUubWVtYmVycyArPSBjaGFydC50b01ldGhvZCgiY3JlYXRlRDNDaGFydCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKENvbXBvbmVudCksIFsKKwkgICAJCQlleGNlcHRpb25zICs9IF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKERlcml2ZWRPbGFwRXhjZXB0aW9uKQorCSAgIAkJCWV4Y2VwdGlvbnMgKz0gX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSnNvbkV4Y2VwdGlvbikKKwkgICAJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJjeENlbGxTZXQiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihEZXJpdmVkQ2VsbFNldCkpCisJICAgCQkJYm9keSA9IFsgYXBwZW5kKCcnJ8KrY2hhcnQuY3JlYXRlRDNDaGFydMK7JycnKV0KKwkgICAJCV0pCisgICAJCX0KKwkJLy8gc2V0dXAtTWV0aG9kCisJCXR5cGUubWVtYmVycyArPSBjaGFydC50b01ldGhvZCgic2V0dXAiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkOjpUWVBFKSwKKwkJCVsKKwkJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKFBvc3RDb25zdHJ1Y3QpCisJCQkJYm9keSA9IFthcHBlbmQoJycnwqtjaGFydC5zZXR1cMK7JycnKV0KKwkJCV0pCisJCS8vIHN1YnNjcmliZSB0byBldmVudEJyb2tlcgorCQl0eXBlLm1lbWJlcnMgKz0gY2hhcnQudG9NZXRob2QoInN1YnNjcmliZSIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QUk9URUNURUQKKwkJCWJvZHkgPSBbYXBwZW5kKCcnJ8KrY2hhcnQuc3Vic2NyaWJlwrsnJycpXQorCQldKQorCQkvLyB1bnN1YnNjcmliZSBmcm9tIGV2ZW50QnJva2VyCisJCXR5cGUubWVtYmVycyArPSBjaGFydC50b01ldGhvZCgidW5zdWJzY3JpYmUiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkOjpUWVBFKSwgWworCQkJdmlzaWJpbGl0eSA9IEp2bVZpc2liaWxpdHkuUFJPVEVDVEVECisJCQlhbm5vdGF0aW9ucyArPSBfYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKFByZURlc3Ryb3kpCisJCQlib2R5ID0gW2FwcGVuZCgnJyfCq2NoYXJ0LnVuc3Vic2NyaWJlwrsnJycpXQorCQldKQorCQkvLyBsb2NhbGUgbm90aWZpY2F0aW9uCisJCXR5cGUubWVtYmVycyArPSBjaGFydC50b01ldGhvZCgibG9jYWxlQ2hhbmdlZCIsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQ6OlRZUEUpLCBbCisJCQl2aXNpYmlsaXR5ID0gSnZtVmlzaWJpbGl0eS5QVUJMSUMKKwkJCWFubm90YXRpb25zICs9IF9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoT3ZlcnJpZGUpCisJCQlwYXJhbWV0ZXJzICs9IGNoYXJ0LnRvUGFyYW1ldGVyKCJsb2NhbGUiLCBfdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihMb2NhbGUpKQorCQkJYm9keSA9IFthcHBlbmQoJycnwqtjaGFydC5sb2NhbGVDaGFuZ2VkwrsnJycpXQorCQldKQorCX0KKwkKKwkvLyBzdWJzY3JpYmUgdG8gdmlldyByZWZyZXNoCQorCWRlZiBzdWJzY3JpYmUoQ2hhcnQgY2hhcnQpCisJCScnJworCQlldmVudEJyb2tlci5zdWJzY3JpYmUoRXZlbnRCcm9rZXJNc2cuUkVGUkVTSF9WSUVXKyLCq2NoYXJ0Lm5hbWXCu0NoYXJ0IiwgcmVmcmVzaFZpZXcpOycnJworCisJZGVmIHVuc3Vic2NyaWJlKENoYXJ0IGNoYXJ0KQorCQknJycKKwkJZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUocmVmcmVzaFZpZXcpOycnJworCisJZGVmIFN0cmluZyBnZXRTb3VyY2VEYXRhTWFydFJlZk5hbWUoQ2hhcnQgY2hhcnQpIHsKKwkJaWYgKGNoYXJ0LnNvdXJjZSAhPSBudWxsICYmIGNoYXJ0LnNvdXJjZS5kYXRhbWFydFJlZiAhPSBudWxsICYmIGNoYXJ0LnNvdXJjZS5kYXRhbWFydFJlZi5uYW1lICE9IG51bGwpIHsKKwkJCXJldHVybiBjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYubmFtZS50b1N0cmluZworCQl9CisJCWVsc2UgeworCQkJcmV0dXJuIG51bGw7CisJCX0JCQorCX0KKwkKKwkvKioKKwkgKiA8cD5idWlsZCB0aGUgbWFpbiBtZXRob2QgdG8gYmUgY2FsbGVkIGZyb20gZTQuPC9wPiAKKwkgKgorCSAqLworCWRlZiBTdHJpbmcgY3JlYXRlVmlldyhDaGFydCBjaGFydCkgeworCQl2YXIgYm9keSA9IAorCQknJycKKwkJY2hhcnRSZWZyZXNoZXJEb25lID0gZmFsc2U7CisJCWNoYXJ0cyA9IG5ldyBBcnJheUxpc3Q8RENoYXJ0cz4oKTsKKwkJY29vcmRpbmF0ZVN5c3RlbSA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKKwkJZmlsdGVyR2VuZXJhdG9yID0gbmV3IERhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yKCk7CisJCWZpbHRlckdlbmVyYXRvci5zZXREc2xNZXRhZGF0YVNlcnZpY2UoZHNsTWV0YWRhdGFTZXJ2aWNlKTsKKwkJbGF5b3V0TWFuYWdlciA9IG5ldyBWaWV3TGF5b3V0TWFuYWdlcigpOworCQljaGFydFJlZnJlc2hlciA9IG5ldyBSZWZyZXNoZXIoKTsKKwkJY2hhcnRSZW5kZXJEZWxheSA9IG5ldyBSZWZyZXNoZXIoKTsKKwkJcHJvcGVydHlMb29rdXBNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsUHJvcGVydHlMb29rdXA+KCk7CisJCScnJworCQkvLyB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSByZWZlcmVuY2VkIGRhdGFtYXJ0CisJCWlmIChnZXRTb3VyY2VEYXRhTWFydFJlZk5hbWUoY2hhcnQpICE9IG51bGwpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CisJCQlkYXRhbWFydENsYXNzID0gbmV3IMKrZ2V0U291cmNlRGF0YU1hcnRSZWZOYW1lKGNoYXJ0KcK7RGF0YW1hcnQoKTsnJycKKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7CisJCXBhcmVudC5zZXRQcmltYXJ5U3R5bGVOYW1lKCJvc2JwIik7IC8vIDw9PSBpcyBUSElTIG5lY2Vzc2FyeSBhbnkgbW9yZT8/PworCQlwYXJlbnQuYWRkU3R5bGVOYW1lKCLCq0VudW1Dc3NDbGFzcy5WSUVXLnN0eWxlTmFtZcK7Iik7CisJCXBhcmVudC5hZGRTdHlsZU5hbWUoIsKrRW51bUNzc0NsYXNzLkNIQVJUX1ZJRVcuc3R5bGVOYW1lwrsiKTsKKwkJcGFyZW50LnNldFNpemVGdWxsKCk7CisJCWxheW91dE1hbmFnZXIuaW5pdChwYXJlbnQpOworCQlyZWZyZXNoVmlldyA9IMKrY2hhcnQucmVmcmVzaFZpZXfCuworCQknJycKKwkJLy8gaW5pdGlhbCByZWZyZXNoIGR1ZSB0byBhIGJ1ZyBpbiBEQ2hhcnQKKwkJYm9keSA9ICcnJworCQnCq2JvZHnCuworCQljaGFydFJlbmRlckRlbGF5LnNldFJlZnJlc2hJbnRlcnZhbCgxMDApOworCQljaGFydFJlbmRlckRlbGF5LmFkZExpc3RlbmVyKG5ldyBjb20uZ2l0aHViLndvbGZpZS5yZWZyZXNoZXIuUmVmcmVzaGVyLlJlZnJlc2hMaXN0ZW5lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBSZWZyZXNoZXIgc291cmNlKSB7CisJCQkJLy8gcmVmcmVzaCBvbmx5IG9uY2UKKwkJCQlsYXlvdXRNYW5hZ2VyLnJlbW92ZUV4dGVuc2lvbihzb3VyY2UpOworCQkJCWxvZy5kZWJ1ZygiaW5pdGlhbCAtIHNob3cgZGVsYXllZCIpOworCQkJCWZvcihEQ2hhcnRzIGNoYXJ0IDogY2hhcnRzKSB7CisJCQkJCWNoYXJ0LnNob3coKTsKKwkJCQl9CisJCQkJY2hhcnRSZWZyZXNoZXJEb25lID0gdHJ1ZTsKKwkJCX0KKwkJfSk7CisJCWxheW91dE1hbmFnZXIuYWRkRXh0ZW5zaW9uKGNoYXJ0UmVuZGVyRGVsYXkpOworCQl1c2VyLmFkZFVzZXJMb2NhbGVMaXN0ZW5lcih0aGlzKTsKKwkJJycnCisJCS8vdmFyIGlzVGFzayA9IGNoYXJ0LnNvdXJjZSBpbnN0YW5jZW9mIENoYXJ0RGF0YW1hcnQgJiYgKGNoYXJ0LnNvdXJjZSBhcyBDaGFydERhdGFtYXJ0KS5kYXRhbWFydFJlZi5zb3VyY2UgaW5zdGFuY2VvZiBEYXRhbWFydFRhc2sKKwkJaWYgKGNoYXJ0LnBvbGxpbmcpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CisJCQljaGFydFJlZnJlc2hlci5zZXRSZWZyZXNoSW50ZXJ2YWwowqtjaGFydC5wb2xsaW5nVGltZcK7KjEwMDApOworCQkJY2hhcnRSZWZyZXNoZXIuYWRkTGlzdGVuZXIobmV3IGNvbS5naXRodWIud29sZmllLnJlZnJlc2hlci5SZWZyZXNoZXIuUmVmcmVzaExpc3RlbmVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHJlZnJlc2goZmluYWwgUmVmcmVzaGVyIHNvdXJjZSkgeworCQkJCQlyZW5kZXJEYXRhKCk7CisJCQkJfQorCQkJfSk7CisJCQlsYXlvdXRNYW5hZ2VyLmFkZEV4dGVuc2lvbihjaGFydFJlZnJlc2hlcik7CisJCQknJycJCQkKKwkJfQorCQlpZiAoY2hhcnQuc291cmNlICE9IG51bGwpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CisJCQlmaWx0ZXJDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWYWx1ZUNoYW5nZUxpc3RlbmVyKCkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlKGNvbS52YWFkaW4uZGF0YS5Qcm9wZXJ0eS5WYWx1ZUNoYW5nZUV2ZW50IGV2ZW50KSB7CisJCQkJCXJlbmRlckRhdGEoKTsKKwkJCQl9CisJCQl9OworCQkJZmlsdGVyR2VuZXJhdG9yLmNyZWF0ZUZpbHRlcihkYXRhbWFydENsYXNzLCB1c2VyLCBmaWx0ZXJDaGFuZ2VMaXN0ZW5lciwgbGF5b3V0TWFuYWdlcik7CisJCQknJycKKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7Ly8gdG8gcmVzaXplIHRoZSBjaGFydCBhY2NvcmRpbmcgdG8gYnJvd3NlcgorCQlQYWdlLmdldEN1cnJlbnQoKS5hZGRCcm93c2VyV2luZG93UmVzaXplTGlzdGVuZXIobmV3IEJyb3dzZXJXaW5kb3dSZXNpemVMaXN0ZW5lcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgYnJvd3NlcldpbmRvd1Jlc2l6ZWQoQnJvd3NlcldpbmRvd1Jlc2l6ZUV2ZW50IGV2ZW50KSB7CisJCQkJbG9nLmRlYnVnKCJicm93c2VyV2luZG93UmVzaXplZCAtIG1hcmsgZGlydHkiKTsKKwkJCQlnZXRQYXJlbnQoKS5tYXJrQXNEaXJ0eVJlY3Vyc2l2ZSgpOworCQkJfQorCQl9KTsKKwkJLy8gdG8gcmVzaXplIHRoZSBjaGFydCBhY2NvcmRpbmcgdG8gc3BsaXQgcG9zaXRpb25zIG9mIHBhcnRzYXNoY29udGFpbmVyIC0gc2V0Q29udGFpbmVyRGF0YSBpcyB0cmFja2VkCisJCUVPYmplY3QgY29udGFpbmVyID0gKChFT2JqZWN0KWVjbGlwc2VDb250ZXh0LmdldChNVUlFbGVtZW50LmNsYXNzKSkuZUNvbnRhaW5lcigpOworCQlpZighKGNvbnRhaW5lciBpbnN0YW5jZW9mIE1QYXJ0U3RhY2spKSB7CisJCQljb250YWluZXIgPSAoRU9iamVjdCllY2xpcHNlQ29udGV4dC5nZXQoTVVJRWxlbWVudC5jbGFzcyk7CisJCX0KKwkJY29udGFpbmVyLmVBZGFwdGVycygpLmFkZChuZXcgQWRhcHRlckltcGwoKSB7CisJCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKKwkJCQlpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpPT1Ob3RpZmljYXRpb24uU0VUICYmIAorCQkJCQkJbm90aWZpY2F0aW9uLmdldEZlYXR1cmVJRChVSUVsZW1lbnRJbXBsLmNsYXNzKSA9PSBVaVBhY2thZ2VJbXBsLlVJX0VMRU1FTlRfX0NPTlRBSU5FUl9EQVRBKQorCQkJCXsKKwkJCQkJbG9nLmRlYnVnKCJzcGxpdCBwb3NpdGlvbiBjaGFuZ2VkIC0gbWFyayBkaXJ0eSIpOworCQkJCQlnZXRQYXJlbnQoKS5tYXJrQXNEaXJ0eVJlY3Vyc2l2ZSgpOworCQkJCX0KKwkJCX0KKwkJfSk7CisJCScnJworCQlyZXR1cm4gYm9keQorCX0KKwkKKwkvKioKKwkgKiA8cD5jcmVhdGUgYSBoYW5kbGVyIGZvciBleHRlcm5hbCB0cmlnZ2VyZWQgcmVmcmVzaCByZXF1ZXN0cy48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyByZWZyZXNoVmlldyhDaGFydCBjaGFydCkgeworCQl2YXIgYm9keSA9ICIiCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsKKwkJbmV3IEV2ZW50SGFuZGxlcigpIHsKKwkJCUBPdmVycmlkZQorCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKKwkJCQlyZW5kZXJEYXRhKCk7CisJCQl9CisJCX07CisJCScnJworCQlyZXR1cm4gYm9keQorCX0KKwkKKwkvKioKKwkgKiA8cD5idWlsZCB0aGUgZGF0YSBjb21wb25lbnRzLjwvcD4gCisJICoKKwkgKi8KKwlkZWYgU3RyaW5nIGNyZWF0ZUNvbXBvbmVudHMoQ2hhcnQgY2hhcnQpIHsKKwkJdmFyIGJvZHkgPSAiIgorCQlpZiAoY2hhcnQuc291cmNlICE9IG51bGwpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7Ly8gZ2V0IHRoZSByZXN1bHRzCisJCQl0cnkgeworCQkJCWZpbmFsIERlcml2ZWRDZWxsU2V0IGNlbGxTZXQgPSBkYXRhbWFydENsYXNzLmdldFJlc3VsdHModXNlciwgZmlsdGVyR2VuZXJhdG9yLmdldEZpbHRlcijCqyhjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYuc291cmNlIGluc3RhbmNlb2YgRGF0YW1hcnRDdWJlKS5ib29sZWFuVmFsdWUudG9TdHJpbmfCuyksIGdldFRhc2tPcGVyYXRpdmVEdG9DbGFzcygpLCBnZXRUYXNrSW5pdGlhbE9wZXJhdGl2ZUR0b3MoKSk7CisJCQkJZ2V0Q29vcmRpbmF0ZVN5c3RlbSgpLmNsZWFyKCk7CisJCQkJaWYgKGNlbGxTZXQgPT0gbnVsbCkgeworCQkJCQlwcm9tcHRTZWN1cml0eU1lc3NhZ2UoZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZShsb2NhbGUudG9MYW5ndWFnZVRhZygpLCAic2VjdXJpdHlNZXNzYWdlIiksIGxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKSk7CisJCQkJCXJldHVybjsKKwkJCQl9IGVsc2UgeworCQkJCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkucmVtb3ZlQWxsQ29tcG9uZW50cygpOworCQkJCX0KKwkJCQkvLyBnZW5lcmF0ZSBhIG5ldyByZXN1bHQgY29tcG9uZW50CisJCQkJaWYgKGNlbGxTZXQgIT0gbnVsbCkgeworCQkJCQkvLyBjcmVhdGUgYSBtdWx0aWRpbWVuc2lvbmFsIGNvb3JkaW5hdGUgc3lzdGVtIGFnYWluc3QgdGhlIGNlbGxTZXQKKwkJCQkJZm9yCShpbnQgYXhpcyA9IDA7IGF4aXMgPCBjZWxsU2V0LmdldEF4ZXMoKS5zaXplKCk7IGF4aXMrKykgeworCQkJCQkJZ2V0Q29vcmRpbmF0ZVN5c3RlbSgpLmFkZCgwKTsKKwkJCQkJfQorCQkJCQkvLyByZW1vdmUgYW55IHByZXZpb3VzIGNvbXBvbmVudAorCQkJCQlpZgkoZGF0YUNvbXBvbmVudCAhPSBudWxsKSB7CisJCQkJCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkucmVtb3ZlQ29tcG9uZW50KGRhdGFDb21wb25lbnQpOworCQkJCQkJZGF0YUNvbXBvbmVudCA9IG51bGw7CisJCQkJCX0KKwkJCQkJaWYgKGNlbGxTZXQuZ2V0QXhlcygpLnNpemUoKSA8IDIpIHsKKwkJCQkJCWxvZy5lcnJvcigiYXQgbGVhc3QgMiBheGVzIGZyb20gcmVmZXJlbmNlZCBkYXRhbWFydCDCq2NoYXJ0LnNvdXJjZS5kYXRhbWFydFJlZi5uYW1lwrsgYXJlIG5lZWRlZCB0byByZW5kZXIgwqtjaGFydC5uYW1lwrsiKTsKKwkJCQkJfQorCQkJCQlkYXRhQ29tcG9uZW50ID0gY3JlYXRlVGFiU2hlZXQoY2VsbFNldCwgY2VsbFNldC5nZXRBeGVzKCkuc2l6ZSgpKTsKKwkJCQkJZGF0YUNvbXBvbmVudC5zZXRTaXplRnVsbCgpOworCQkJCQlkYXRhQ29tcG9uZW50LnNldElkKCJkYXRhQ29tcG9uZW50Iik7CisJCQkJCWRhdGFDb21wb25lbnQuYWRkU3R5bGVOYW1lKCLCq0VudW1Dc3NDbGFzcy5EQVRBX0NPTVBPTkVOVC5zdHlsZU5hbWXCuyIpOworCQkJCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuYWRkQ29tcG9uZW50KGRhdGFDb21wb25lbnQpOworCQkJCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuc2V0RXhwYW5kUmF0aW8oZGF0YUNvbXBvbmVudCwgMSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQlsb2cuZXJyb3IoInJlZmVyZW5jZWQgZGF0YW1hcnQgwqtjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYubmFtZcK7IGdlbmVyYXRlcyBubyByZXN1bHRzIik7CisJCQkJfQorCQkJfSBjYXRjaCAoRGVyaXZlZE9sYXBFeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQl9CisJCQknJycKKwkJfSBlbHNlIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CisJCQkvLyBnZW5lcmF0ZSBhIG5ldyByZXN1bHQgY29tcG9uZW50CisJCQl0cnkgeworCQkJCS8vIHJlbW92ZSBhbnkgcHJldmlvdXMgY29tcG9uZW50CisJCQkJaWYJKGRhdGFDb21wb25lbnQgIT0gbnVsbCkgeworCQkJCQlsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkucmVtb3ZlQ29tcG9uZW50KGRhdGFDb21wb25lbnQpOworCQkJCQlkYXRhQ29tcG9uZW50ID0gbnVsbDsKKwkJCQl9CQkJCQorCQkJCWRhdGFDb21wb25lbnQgPSBjcmVhdGVUYWJTaGVldChudWxsLCAyKTsKKwkJCQlkYXRhQ29tcG9uZW50LnNldFNpemVGdWxsKCk7CisJCQkJZGF0YUNvbXBvbmVudC5zZXRJZCgiZGF0YUNvbXBvbmVudCIpOworCQkJCWRhdGFDb21wb25lbnQuYWRkU3R5bGVOYW1lKCLCq0VudW1Dc3NDbGFzcy5EQVRBX0NPTVBPTkVOVC5zdHlsZU5hbWXCuyIpOworCQkJCWxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5hZGRDb21wb25lbnQoZGF0YUNvbXBvbmVudCk7CisJCQkJbGF5b3V0TWFuYWdlci5nZXREYXRhQXJlYSgpLnNldEV4cGFuZFJhdGlvKGRhdGFDb21wb25lbnQsIDEpOworCQkJfSBjYXRjaCAoRGVyaXZlZE9sYXBFeGNlcHRpb24gZSkgeworCQkJCWxvZy5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQl9CisJCQknJycKKwkJfQorCQlyZXR1cm4gYm9keQorCX0KKworCS8qKgorCSAqIDxwPmlmIG1vcmUgdGhhbiAyIGF4ZXMgKGRpbWVuc2lvbnMpIGFyZSBmb3VuZCBpbiB0aGUgY2VsbFNldCwgYnVpbGQgcmVjdXJzaXZlIHRhYnNoZWV0cyBhcyBsb25nIGFzIHRoZSByZW1haW5pbmcgYXhlcyBhcmUgbW9yZSB0aGFuIDIuPC9wPiAKKwkgKgorCSAqLworCWRlZiBTdHJpbmcgY3JlYXRlVGFiU2hlZXQoQ2hhcnQgY2hhcnQpIHsKKwkJdmFyIGJvZHkgPSAKKwkJJycnCisJCWNoYXJ0cy5jbGVhcigpOworCQkvLyBlaXRoZXIgY3JlYXRlIGEgcmVjdXJzaXZlIHRhYnNoZWV0IG9yIGEgY2hhcnQKKwkJQ29tcG9uZW50IGNvbXBvbmVudCA9IG51bGw7CisJCWlmCShheGlzTm8gPT0gMikgeworCQknJycKKwkJaWYgKChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCuworCQkJCXRyeSB7CisJCQkJCWNvbXBvbmVudCA9IGNyZWF0ZUQzQ2hhcnQoY2VsbFNldCk7CisJCQkJfSBjYXRjaCAoSnNvbkV4Y2VwdGlvbiBlKSB7CisJCQkJCWxvZy5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisJCQkJfQorCQkJJycnCisJCX0KKwkJZWxzZSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCuworCQkJCWNvbXBvbmVudCA9IGNyZWF0ZUNoYXJ0KGNlbGxTZXQpOworCQkJJycnCisJCX0KKwkJYm9keSA9ICcnJworCQnCq2JvZHnCuworCQl9CisJCWVsc2UgewkJCisJCQlJbnRlZ2VyIGF4aXMgPSBheGlzTm8tMTsKKwkJCVRhYlNoZWV0IHRhYnNoZWV0ID0gbmV3IFRhYlNoZWV0KCk7CisJCQl0YWJzaGVldC5zZXRTaXplRnVsbCgpOworCQkJRGVyaXZlZEF4aXMgdGFiQXhpcyA9IGNlbGxTZXQuZ2V0QXhlcygpLmdldChheGlzKTsKKwkJCS8vIGNyZWF0ZSBhIHRhYiBwYWdlIGZvciBhbGwgdGFiIGF4aXMgbWVtYmVycworCQkJaW50IHRhYk5vID0gMDsKKwkJCWZvcgkoRGVyaXZlZFBvc2l0aW9uIGNvbHVtbiA6IHRhYkF4aXMuZ2V0UG9zaXRpb25zKCkpIHsKKwkJCQkvLyBjcmVhdGUgdGhlIHRpdGxlIGZvciB0aGUgYXhpcworCQkJCVN0cmluZyB0aXRsZSA9IG51bGw7CisJCQkJZm9yIChEZXJpdmVkTWVtYmVyIG1lbWJlciA6IGNvbHVtbi5nZXRNZW1iZXJzKCkpIHsKKwkJCQkJaWYJKHRpdGxlID09IG51bGwpIHsKKwkJCQkJCXRpdGxlID0gZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgbWVtYmVyLmdldENhcHRpb24oKSk7CisJCQkJCX0KKwkJCQkJZWxzZSB7CisJCQkJCQl0aXRsZSArPSAiIC8gIitkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKHVzZXIuZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLCBtZW1iZXIuZ2V0Q2FwdGlvbigpKTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvLyBwb3NpdGlvbiB0aGUgZGF0YSB0byB0aGlzIGNvb3JkaW5hdGUKKwkJCQlnZXRDb29yZGluYXRlU3lzdGVtKCkuc2V0KGF4aXMsIHRhYk5vKTsKKwkJCQljb21wb25lbnQgPSBjcmVhdGVUYWJTaGVldChjZWxsU2V0LCBheGlzKTsKKwkJCQkvLyBzZXQgdGhlIGNhcHRpb24KKwkJCQlpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKKwkJCQkJY29tcG9uZW50LnNldENhcHRpb24odGl0bGUpOworCQkJCQkvLyBhZGQgdGhlIGNvbXBvbmVudCBhcyBhIHRhYiBwYWdlCisJCQkJCXRhYnNoZWV0LmFkZENvbXBvbmVudChjb21wb25lbnQpOworCQkJCX0KKwkJCQl0YWJObysrOworCQkJfQorCQkJY29tcG9uZW50ID0gdGFic2hlZXQ7CisJCX0KKwkJcmV0dXJuIGNvbXBvbmVudDsnJycKKwkJcmV0dXJuIGJvZHkKKwl9CisKKwkvKioKKwkgKiA8cD5idWlsZCB0aGUgY2hhcnQgY29tcG9uZW50cy48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyBjcmVhdGVDaGFydChDaGFydCBjaGFydCkgeworCQl2YXIgYm9keSA9ICIiCisJCXZhciBwb3N0Zml4ID0gIiIKKwkJdmFyIGNoYXJ0VHlwZSA9ICIiCisJCXZhciBoYXNBeGlzID0gdHJ1ZQorCQl2YXIgbXVsdGlwbGVBeGVzID0gPFN0cmluZywgU3RyaW5nPm5ld0hhc2hNYXAKKwkJdmFyIENoYXJ0QXhpcyBjYXRlZ29yeV9heGlzID0gbnVsbCAKKwkJdmFyIENoYXJ0QXhpcyBkYXRhX2F4aXMgPSBudWxsIAorCQl2YXIgQ2hhcnRBeGlzIGlubmVyX2F4aXMgPSBudWxsCisJCXZhciBDaGFydEF4aXMgb3V0ZXJfYXhpcyA9IG51bGwgCisJCXZhciBheGlzU3dpdGNoID0gZmFsc2U7CisJCXZhciBheGlzUHJlZml4ID0gJ1hZJworCQlpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRCYXIpIHsKKwkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0QmFyKS5zd2FwcGVkKSB7CisJCQkJYXhpc1ByZWZpeCA9ICdZWCcKKwkJCQlheGlzU3dpdGNoID0gdHJ1ZTsgCisJCQl9CisJCX0KKwkJZm9yIChlbGVtZW50IDogY2hhcnQuc291cmNlLmVsZW1lbnRzKSB7CisJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENoYXJ0QXhpcykgeworCQkJCXZhciBheGlzID0gZWxlbWVudCBhcyBDaGFydEF4aXMKKwkJCQlpZiAoYXhpcy5heGlzLm5hbWUuZ2V0TmFtZS5lcXVhbHMoJ0NPTFVNTlMnKSB8fCBheGlzLmF4aXMubmFtZS5nZXROYW1lLmVxdWFscygnUk9XUycpKSB7CisJCQkJCWlmICgoYXhpcy5yZW5kZXJUeXBlLmdldE5hbWUuZXF1YWxzKCJMT0ciKSB8fCBheGlzLnJlbmRlclR5cGUuZ2V0TmFtZS5lcXVhbHMoIkxJTkVBUiIpIHx8IGF4aXMucmVuZGVyVHlwZS5nZXROYW1lLmVxdWFscygiUFlSQU1JRCIpKSkgeworCQkJCQkJZGF0YV9heGlzID0gYXhpcworCQkJCQl9CisJCQkJCWlmICgoYXhpcy5yZW5kZXJUeXBlLmdldE5hbWUuZXF1YWxzKCJDQVRFR09SWSIpIHx8IGF4aXMucmVuZGVyVHlwZS5nZXROYW1lLmVxdWFscygiREFURSIpKSkgeworCQkJCQkJY2F0ZWdvcnlfYXhpcyA9IGF4aXMKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRCYXIpIHsKKwkJCWNoYXJ0VHlwZSA9ICJCQVIiCQkJCisJCQlwb3N0Zml4ID0gJycnX8KrY2hhcnRUeXBlwrsnJycKKwkJCWlubmVyX2F4aXMgPSBjYXRlZ29yeV9heGlzCisJCQlvdXRlcl9heGlzID0gZGF0YV9heGlzIAorCQl9CisJCWVsc2UgaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0QnViYmxlKSB7CisJCQljaGFydFR5cGUgPSAiQlVCQkxFIgkJCQorCQkJcG9zdGZpeCA9ICcnJ1/Cq2NoYXJ0VHlwZcK7JycnCisJCQloYXNBeGlzID0gdHJ1ZQorCQkJaW5uZXJfYXhpcyA9IGRhdGFfYXhpcworCQkJb3V0ZXJfYXhpcyA9IGNhdGVnb3J5X2F4aXMgCisJCX0KKwkJZWxzZSBpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnREb251dCkgeworCQkJY2hhcnRUeXBlID0gIkRPTlVUIgkJCQorCQkJaGFzQXhpcyA9IGZhbHNlCisJCQlpbm5lcl9heGlzID0gY2F0ZWdvcnlfYXhpcworCQkJb3V0ZXJfYXhpcyA9IGRhdGFfYXhpcyAKKwkJfQorCQllbHNlIGlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydExpbmUpIHsKKwkJCWNoYXJ0VHlwZSA9ICJMSU5FIgkJCQorCQkJaW5uZXJfYXhpcyA9IGNhdGVnb3J5X2F4aXMKKwkJCW91dGVyX2F4aXMgPSBkYXRhX2F4aXMgCisJCX0KKwkJZWxzZSBpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRQaWUpIHsKKwkJCWNoYXJ0VHlwZSA9ICJQSUUiCQkJCisJCQloYXNBeGlzID0gZmFsc2UKKwkJCWlubmVyX2F4aXMgPSBkYXRhX2F4aXMKKwkJCW91dGVyX2F4aXMgPSBjYXRlZ29yeV9heGlzIAorCQl9CisJCWVsc2UgaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0R2F1Z2UpIHsKKwkJCWNoYXJ0VHlwZSA9ICJNRVRFUl9HQVVHRSIJCQkKKwkJCWhhc0F4aXMgPSBmYWxzZQorCQkJaW5uZXJfYXhpcyA9IGRhdGFfYXhpcworCQkJb3V0ZXJfYXhpcyA9IGNhdGVnb3J5X2F4aXMgCisJCX0KKworCQlib2R5ID0gCisJCScnJworCQlMaXN0PEludGVnZXI+IGNvb3JkaW5hdGUgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KGdldENvb3JkaW5hdGVTeXN0ZW0oKSk7CisJCScnJworCQlib2R5ID0gJycnCisJCcKrYm9kecK7Ly8gY3JlYXRlIGEgbGFiZWwgc2VyaWVzCisJCUxpc3Q8U3RyaW5nPiDCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKwkJZm9yCShEZXJpdmVkUG9zaXRpb24gcG9zIDogY2VsbFNldC5nZXRBeGVzKCkuZ2V0KMKrZGF0YV9heGlzLmF4aXMubmFtZS52YWx1ZcK7KS5nZXRQb3NpdGlvbnMoKSkgeworCQknJycKKwkJYm9keSA9ICcnJworCQnCq2JvZHnCuworCQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKKwkJCUJvb2xlYW4gdmFsdWVVc2VkID0gZmFsc2U7CisJCQlmb3IgKERlcml2ZWRNZW1iZXIgbWVtYmVyIDogcG9zLmdldE1lbWJlcnMoKSkgeworCQkJCWlmCSh0aXRsZSA9PSBudWxsKSB7CisJCQkJCXRpdGxlID0gZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgbWVtYmVyLmdldENhcHRpb24oKSk7CisJCQkJfQorCQkJCWVsc2UgeworCQkJCQl0aXRsZSArPSAiICIrZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgbWVtYmVyLmdldENhcHRpb24oKSk7CisJCQkJfQorCQkJfQorCQkJwqtkYXRhX2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpdGxlc0FycmF5LmFkZCh0aXRsZSk7CisJCX0KKwkJJycnCisJCWlmIChoYXNBeGlzKSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu1NlcmllcyDCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7U2VyaWVzID0gbmV3IFNlcmllcygpOworCQkJJycnCisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu2lmICjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuc2l6ZSgpID4gMCkgeworCQkJJycnCisJCQkvLyBldmFsdWF0ZSBtdWx0aXBsZSBzY2FsZXMKKwkJCXZhciBzaG93TWFya2VyID0gZmFsc2UKKwkJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydExpbmUpIHsKKwkJCQlzaG93TWFya2VyID0gKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydExpbmUpLnNob3dNYXJrZXIKKwkJCX0KKwkJCWJvZHkgPSAnJyfCq2JvZHnCu8KrY2hhcnQuY3JlYXRlTGFiZWxTZXJpZXMoZGF0YV9heGlzLCBtdWx0aXBsZUF4ZXMsIGF4aXNQcmVmaXgsIHNob3dNYXJrZXIpwrsnJycKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7fQorCQkJJycnCisJCX0JCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsvLyBjcmVhdGUgdGhlIGRhdGEgc2VyaWVzIHRpY2tzCisJCVN0cmluZyDCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu0F4aXNMYWJlbCA9ICIiOworCQlCb29sZWFuIMKrY2F0ZWdvcnlfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7QXhpc0xhYmVsU2V0ID0gZmFsc2U7CisJCUxpc3Q8U3RyaW5nPiDCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpdGxlc0FycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisJCWZvcgkoRGVyaXZlZFBvc2l0aW9uIHBvcyA6IGNlbGxTZXQuZ2V0QXhlcygpLmdldCjCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLnZhbHVlwrspLmdldFBvc2l0aW9ucygpKSB7CisJCQlTdHJpbmcgdGl0bGUgPSAiIjsKKwkJCWZvciAoRGVyaXZlZE1lbWJlciBtZW1iZXIgOiBwb3MuZ2V0TWVtYmVycygpKSB7CisJCSAgICAJU3RyaW5nW10gdG9rZW5zID0gbWVtYmVyLmdldFVuaXF1ZU5hbWUoKS5zcGxpdCgiXFxdXFwuXFxbIik7CisJCSAgICAJaWYgKCHCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu0F4aXNMYWJlbFNldCkgeworCQkgICAgCQlpZiAowqtjYXRlZ29yeV9heGlzLmF4aXMubmFtZS5saXRlcmFswrtBeGlzTGFiZWwubGVuZ3RoKCkgPiAwKSB7CisJCSAgICAJCQnCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu0F4aXNMYWJlbCArPSAiIC8gIjsKKwkJICAgIAkJfQorCQkgICAgCQnCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu0F4aXNMYWJlbCArPSBkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKHVzZXIuZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLCBtZW1iZXIuZ2V0TGV2ZWwoKS5nZXROYW1lKCkpOworCQkgICAgCX0KKwkJICAgIAlpbnQgc3RhcnQgPSAxOworCQkgICAgCS8vIGlmIHNob3J0bGFiZWwgaXMgY29uZmlndXJlZCwgdXNlIG9ubHkgbGFzdCBsZXZlbCBuYW1lCisJCSAgICAJaWYgKMKrY2F0ZWdvcnlfYXhpcy5zaG9ydExhYmVsLmJvb2xlYW5WYWx1ZcK7KSB7CisJCSAgICAJCXN0YXJ0ID0gdG9rZW5zLmxlbmd0aC0xOworCQkgICAgCX0KKwkJICAgIAlmb3IJKGludCB0b2tlbiA9IHN0YXJ0OyB0b2tlbiA8IHRva2Vucy5sZW5ndGg7IHRva2VuKyspIHsKKwkJICAgIAkJdGl0bGUgKz0gZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgdG9rZW5zW3Rva2VuXSkrIiAiOworCQkgICAgCX0KKwkJCX0KKwkJCcKrY2F0ZWdvcnlfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7QXhpc0xhYmVsU2V0ID0gdHJ1ZTsKKwkJCcKrY2F0ZWdvcnlfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuYWRkKHRpdGxlLnRyaW0oKS5yZXBsYWNlKCJbIiwgIiIpLnJlcGxhY2UoIl0iLCAiIikpOworCQl9CisJCScnJworCQlpZiAoaGFzQXhpcykgeworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrtUaWNrcyDCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpY2tzID0gbmV3IFRpY2tzKCk7CisJCQnCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpY2tzLmFkZCjCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpdGxlc0FycmF5LnRvQXJyYXkoKSk7CisJCQknJycKKwkJfQorCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsvLyBjb3B5IGNlbGxzZXQgZGF0YSB0byBkYXRhIHNlcmllcworCQlEYXRhU2VyaWVzIGRhdGFTZXJpZXMgPSBuZXcgRGF0YVNlcmllcygpOworCQknJycKKwkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0QnViYmxlKSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu2RhdGFTZXJpZXMubmV3U2VyaWVzKCk7CisJCQknJycKKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7aW50IMKrb3V0ZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7Tm8gPSAwOworCQknJycKKwkJYm9keSA9ICcnJworCQnCq2JvZHnCu2ZvcgkoRGVyaXZlZFBvc2l0aW9uIMKrb3V0ZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7UG9zIDogY2VsbFNldC5nZXRBeGVzKCkuZ2V0KMKrb3V0ZXJfYXhpcy5heGlzLm5hbWUudmFsdWXCuykuZ2V0UG9zaXRpb25zKCkpIHsKKwkJJycnCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsJY29vcmRpbmF0ZS5zZXQowqtvdXRlcl9heGlzLmF4aXMubmFtZS52YWx1ZcK7LCDCq291dGVyX2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu05vKTsKKwkJJycnCisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydERvbnV0KSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCuwlkYXRhU2VyaWVzLm5ld1NlcmllcygpOworCQkJJycnCisJCX0KKwkJaWYgKCEoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRQaWUpICYmICEoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnREb251dCkpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7CUFycmF5TGlzdDxPYmplY3Q+IMKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7RGF0YVNlcmllcyA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCQkJJycnCQkJCSAJCisJCX0KKwkJYm9keSA9ICcnJworCQnCq2JvZHnCuwlpbnQgwqtpbm5lcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtObyA9IDA7CisJCScnJworCQlib2R5ID0gJycnCisJCcKrYm9kecK7CWZvcgkoRGVyaXZlZFBvc2l0aW9uIMKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7UG9zIDogY2VsbFNldC5nZXRBeGVzKCkuZ2V0KMKraW5uZXJfYXhpcy5heGlzLm5hbWUudmFsdWXCuykuZ2V0UG9zaXRpb25zKCkpIHsKKwkJJycnCisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFBpZSkgeworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrsJCWRhdGFTZXJpZXMubmV3U2VyaWVzKCk7CisJCQknJycKKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7CQljb29yZGluYXRlLnNldCjCq2lubmVyX2F4aXMuYXhpcy5uYW1lLnZhbHVlwrssIMKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7Tm8pOworCQknJycKKwkJYm9keSA9ICcnJworCQnCq2JvZHnCuworCQkJCU9iamVjdCB2YWx1ZSA9IG51bGw7CisJCQkJRGVyaXZlZENlbGwgY2VsbCA9IGNlbGxTZXQuZ2V0Q2VsbChjb29yZGluYXRlKTsKKwkJCQlpZiAoY2VsbCAhPSBudWxsKSB7CisJCQkJCXZhbHVlID0gY2VsbC5nZXRWYWx1ZSgpOworCQkJCX0KKwkJJycnCisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFBpZSB8fCBjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydERvbnV0KSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCuwkJZGF0YVNlcmllcy5hZGQowqtvdXRlcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtUaXRsZXNBcnJheS5nZXQowqtvdXRlcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtObykrIiAiK8KraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuZ2V0KMKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7Tm8pLCh2YWx1ZSA9PSBudWxsID8gMC4wIDogdmFsdWUpKTsKKwkJCScnJworCQl9CisJCWVsc2UgeworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrsJCcKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7RGF0YVNlcmllcy5hZGQodmFsdWUgPT0gbnVsbCA/IDAuMCA6IHZhbHVlKTsKKwkJCScnJworCQl9CisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsJCcKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7Tm8gKys7CisJCQl9CisJCScnJworCQlpZiAoIShjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFBpZSkgJiYgIShjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydERvbnV0KSkgeworCQkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0QnViYmxlKSB7CisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7CcKraW5uZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7RGF0YVNlcmllcy5hZGQowqtvdXRlcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtUaXRsZXNBcnJheS5nZXQowqtvdXRlcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtObykpOworCQkJCScnJworCQkJfQorCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrsJZGF0YVNlcmllcy5hZGQowqtpbm5lcl9heGlzLmF4aXMubmFtZS5saXRlcmFswrtEYXRhU2VyaWVzLnRvQXJyYXkoKSk7CisJCQknJycKKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7CcKrb3V0ZXJfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7Tm8gKys7CisJCX0KKwkJJycnCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrtTZXJpZXNEZWZhdWx0cyBzZXJpZXNEZWZhdWx0cyA9IG5ldyBTZXJpZXNEZWZhdWx0cygpCisJCQkuc2V0UmVuZGVyZXIoU2VyaWVzUmVuZGVyZXJzLsKrY2hhcnRUeXBlwrspOworCQknJycKKwkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0TGluZSkgeworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrtzZXJpZXNEZWZhdWx0cy5zZXRGaWxsVG9aZXJvKMKrKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydExpbmUpLmZpbGxUb1plcm8uYm9vbGVhblZhbHVlLnRvU3RyaW5nwrspLnNldEZpbGwowqsoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0TGluZSkuZmlsbEFyZWEudG9TdHJpbmfCuyk7CisJCQknJycKKwkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0TGluZSkudHJlbmRMaW5lKSB7CisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7c2VyaWVzRGVmYXVsdHMuc2V0VHJlbmRsaW5lKAorCQkJCQluZXcgVHJlbmRsaW5lKCkuc2V0U2hvdyh0cnVlKS5zZXRMaW5lV2lkdGgoMSkpOworCQkJCScnJworCQkJfSAKKwkJfQorCQkvLyBvcHRpb25zCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrtPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpCisJCQkuc2V0U2VyaWVzRGVmYXVsdHMoc2VyaWVzRGVmYXVsdHMpOworCQknJycKKwkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0UGllKSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu3Nlcmllc0RlZmF1bHRzLnNldFJlbmRlcmVyT3B0aW9ucyhuZXcgUGllUmVuZGVyZXIoKQorCQkJCS5zZXRTaG93RGF0YUxhYmVscyh0cnVlKS5zZXRGaWxsKMKrKCEoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0UGllKS5lbXB0eSkudG9TdHJpbmfCuykpOworCQkJJycnCisJCX0KKwkJZWxzZSBpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnREb251dCkgeworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrtzZXJpZXNEZWZhdWx0cy5zZXRSZW5kZXJlck9wdGlvbnMobmV3IERvbnV0UmVuZGVyZXIoKQorCQkJCS5zZXRTaG93RGF0YUxhYmVscyh0cnVlKQorCQkJCS5zZXRTdGFydEFuZ2xlKC05MCkKKwkJCQkuc2V0U2xpY2VNYXJnaW4oMykpOworCQkJJycnCisJCX0KKwkJZWxzZSBpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRCdWJibGUpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7c2VyaWVzRGVmYXVsdHMuc2V0UmVuZGVyZXJPcHRpb25zKG5ldyBCdWJibGVSZW5kZXJlcigpCisJCQkJLnNldFZhcnlCdWJibGVDb2xvcnModHJ1ZSkKKwkJCQnCq0lGIChjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRCdWJibGUpLm11bHRpcGxpZXLCuy5zZXRBdXRvc2NhbGVNdWx0aXBsaWVyKMKrKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydEJ1YmJsZSkubXVsdGlwbGllclZhbHVlwrtmKcKrRU5ESUbCuworCQkJICAgIMKrSUYgKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydEJ1YmJsZSkudHJhbnNwYXJlbnTCuy5zZXRIaWdobGlnaHRBbHBoYSgwLjhmKS5zZXRCdWJibGVBbHBoYSgwLjZmKcKrRU5ESUbCuworCQkJCcKrSUYgKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydEJ1YmJsZSkuZ3JhZGllbnTCuy5zZXRCdWJibGVHcmFkaWVudHModHJ1ZSnCq0VORElGwrsKKwkJCQkuc2V0U2hvd0xhYmVscyhmYWxzZSkKKwkJCQkuc2V0QXV0b3NjYWxlQnViYmxlcyh0cnVlKSk7CisJCQknJycKKwkJfQorCQllbHNlIGlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydEdhdWdlKSB7CisJCQl2YXIgaW50ZXJ2YWxWYWx1ZXMgPSAiIgorCQkJdmFyIGludGVydmFsQ29sb3JzID0gIiIKKwkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmhhc0ludGVydmFscykgeworCQkJCWZvciAoaW50ZXJ2YWwgOiAoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmludGVydmFscykgeworCQkJCQlpZiAoaW50ZXJ2YWwgaW5zdGFuY2VvZiBDaGFydE51bWJlckludGVydmFsKSB7CisJCQkJCQlpbnRlcnZhbFZhbHVlcyA9ICcnJ8KraW50ZXJ2YWxWYWx1ZXPCu8KrSUYgaW50ZXJ2YWxWYWx1ZXMubGVuZ3RoPjDCuyzCq0VORElGwrvCqyhpbnRlcnZhbCBhcyBDaGFydE51bWJlckludGVydmFsKS5udW1iZXJJbnRlcnZhbFZhbHVlwrtmJycnCisJCQkJCQlpZiAoKGludGVydmFsIGFzIENoYXJ0TnVtYmVySW50ZXJ2YWwpLm51bWJlclJhbmdlIGluc3RhbmNlb2YgQ2hhcnRTZWdtZW50Q29sb3IpIHsKKwkJCQkJCQlpbnRlcnZhbENvbG9ycyA9ICcnJ8KraW50ZXJ2YWxDb2xvcnPCu8KrSUYgaW50ZXJ2YWxDb2xvcnMubGVuZ3RoPjDCuyzCq0VORElGwrsiwqsoKGludGVydmFsIGFzIENoYXJ0TnVtYmVySW50ZXJ2YWwpLm51bWJlclJhbmdlIGFzIENoYXJ0U2VnbWVudENvbG9yKS5yZ2IudG9IZXjCuyInJycKKwkJCQkJCX0gCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu3Nlcmllc0RlZmF1bHRzLnNldFJlbmRlcmVyT3B0aW9ucyhuZXcgTWV0ZXJHYXVnZVJlbmRlcmVyKCkKKwkJCQkuc2V0U2hvd1RpY2tMYWJlbHMowqsoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmhhc1RpY2tzLnRvU3RyaW5nwrspCisJCQkJwqtJRiAoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmxhYmVsZWTCuy5zZXRMYWJlbCgiwqsoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmxhYmVsVmFsdWXCuyIpwqtFTkRJRsK7CisJCQkJwqtJRiAoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmhhc0ludGVydmFsc8K7LnNldEludGVydmFscyjCq2ludGVydmFsVmFsdWVzwrspwqtFTkRJRsK7CisJCQkJwqtJRiAoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0R2F1Z2UpLmhhc0ludGVydmFsc8K7LnNldEludGVydmFsQ29sb3JzKMKraW50ZXJ2YWxDb2xvcnPCuynCq0VORElGwrspOworCQkJJycnCisJCX0KKwkJZWxzZSBpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRCYXIpIHsKKwkJCWJvZHkgPSAnJycKKwkJCcKrYm9kecK7c2VyaWVzRGVmYXVsdHMuc2V0RmlsbFRvWmVybyh0cnVlKTsKKwkJCXNlcmllc0RlZmF1bHRzLnNldFJlbmRlcmVyT3B0aW9ucyhuZXcgQmFyUmVuZGVyZXIoKQorCQkJICAgIMKrSUYgYXhpc1N3aXRjaMK7LnNldEJhckRpcmVjdGlvbihCYXJEaXJlY3Rpb25zLkhPVElaT05UQUwpKTvCq0VMU0XCuy5zZXRCYXJEaXJlY3Rpb24oQmFyRGlyZWN0aW9ucy5WRVJUSUNBTCkpO8KrRU5ESUbCuworCQkJJycnCisJCQlpZiAoKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydEJhcikuc3RhY2tlZCkgeworCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu29wdGlvbnMuc2V0U3RhY2tTZXJpZXModHJ1ZSk7CisJCQkJJycnCisJCQl9CisJCQlpZiAoKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydEJhcikuc2hhZG93KSB7CisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7c2VyaWVzRGVmYXVsdHMuc2V0U2hhZG93KHRydWUpLnNldFNoYWRvd0FscGhhKDAuMDVmKTsKKwkJCQknJycJCQkKKwkJCX0KKwkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0QmFyKS5hbmltYXRlZCkgeworCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu29wdGlvbnMuc2V0QW5pbWF0ZSh0cnVlKTsKKwkJCQknJycKKwkJCX0KKwkJfQorCQlib2R5ID0gJycnCisJCcKrYm9kecK7CisJCVN0cmluZ1tdIHNlcmllc0NvbG9ycyA9IHsiIzk4RTk1OCIsIiMzMDkwRjAiLCIjRUM2NDY0IiwiI0Y5REQ1MSIsIiMyNERDRDQiLCIjRUM2NEE1IiwiIzY4NUNCMCIsIiNGRjdENDIiLCIjQUE1MTREIiwiIzdGQjA1MyIsIiNCQkE4NUIiLCIjMjQ3OTgxIn07CivCq8KrwqsJCVN0cmluZ1tdIHNlcmllc0NvbG9ycyA9IHsiIzAwMDBGRiIsIiNGRjAwMDAiLCIjMDBGRjAwIiwiI0ZGRkYwMCIsIiNGRjAwRkYiLCIjMDBGRkZGIiwiI0ZGNDUwMCIsIiMwMDgwMDAiLCIjMDBCRkZGIiwiI0ZGNjlCNCIsIiNGRkQ3MDAiLCIjMDAwMDgwIn07CisJCW9wdGlvbnMuc2V0U2VyaWVzQ29sb3JzKHNlcmllc0NvbG9ycyk7CisJCScnJworCQlpZiAoaGFzQXhpcykgeworCQkJLy8gYXhlcworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrtBeGVzIGF4ZXMgPSBuZXcgQXhlcygpOworCQkJJycnCisJCQlpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRCdWJibGUpIHsKKwkJCQkvLyB4CisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7Q2FudmFzQXhpc1RpY2tSZW5kZXJlciBheGlzVGlja1JlbmRlcmVyID0gbmV3IENhbnZhc0F4aXNUaWNrUmVuZGVyZXIoKTsKKwkJCQlheGlzVGlja1JlbmRlcmVyLnNldFRleHRDb2xvcigiIzIwMjAyMCIpOworCQkJCWlmICjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuc2l6ZSgpID4gMCkgeworCQkJCQlheGVzLmFkZEF4aXMobmV3IFhZYXhpcyhYWWF4ZXMuwqtheGlzUHJlZml4LmNoYXJBdCgwKcK7KS5zZXRMYWJlbCjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuZ2V0KDApKS5zZXRUaWNrT3B0aW9ucyhheGlzVGlja1JlbmRlcmVywqtJRiBjYXRlZ29yeV9heGlzLmFuZ2xlIT0wwrsuc2V0QW5nbGUowqtkYXRhX2F4aXMuYW5nbGXCuynCq0VORElGwrspKTsKKwkJCQkJYXhlcy5hZGRBeGlzKG5ldyBYWWF4aXMoWFlheGVzLsKrYXhpc1ByZWZpeC5jaGFyQXQoMSnCuykuc2V0TGFiZWwowqtkYXRhX2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu1RpdGxlc0FycmF5LmdldCgxKSkuc2V0VGlja09wdGlvbnMoYXhpc1RpY2tSZW5kZXJlcsKrSUYgY2F0ZWdvcnlfYXhpcy5hbmdsZSE9MMK7LnNldEFuZ2xlKMKrZGF0YV9heGlzLmFuZ2xlwrspwqtFTkRJRsK7KSk7CisJCQkJCWF4ZXMuYWRkQXhpcyhuZXcgWFlheGlzKFhZYXhlcy7Cq2F4aXNQcmVmaXguY2hhckF0KDEpwrsyKS5zZXRMYWJlbCjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuZ2V0KDIpKS5zZXRUaWNrT3B0aW9ucyhheGlzVGlja1JlbmRlcmVywqtJRiBjYXRlZ29yeV9heGlzLmFuZ2xlIT0wwrsuc2V0QW5nbGUowqtkYXRhX2F4aXMuYW5nbGXCuynCq0VORElGwrspKTsKKwkJCQl9CisJCQkJJycnCQkJCQkJCQorCQkJfQorCQkJZWxzZSB7CisJCQkJLy8geAorCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu0NhbnZhc0F4aXNUaWNrUmVuZGVyZXIgdGlja1JlbmRlcmVyID0gbmV3IENhbnZhc0F4aXNUaWNrUmVuZGVyZXIoKTsKKwkJCQl0aWNrUmVuZGVyZXIuc2V0VGV4dENvbG9yKCIjMjAyMDIwIik7CisJCQkJYXhlcy5hZGRBeGlzKG5ldyBYWWF4aXMoWFlheGVzLsKrYXhpc1ByZWZpeC5jaGFyQXQoMCnCuykKKwkJCQkJLnNldFJlbmRlcmVyKEF4aXNSZW5kZXJlcnMuwqtjYXRlZ29yeV9heGlzLnJlbmRlclR5cGUubmFtZSgpLnRvU3RyaW5nwrspCisJCQkJCS5zZXRMYWJlbCjCq2NhdGVnb3J5X2F4aXMuYXhpcy5uYW1lLmxpdGVyYWzCu0F4aXNMYWJlbCkKKwkJCQkJLnNldFRpY2tzKMKrY2F0ZWdvcnlfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGlja3MpCisJCQkJCS5zZXRUaWNrT3B0aW9ucyh0aWNrUmVuZGVyZXLCq0lGIGNhdGVnb3J5X2F4aXMuYW5nbGUhPTDCuy5zZXRBbmdsZSjCq2NhdGVnb3J5X2F4aXMuYW5nbGXCuynCq0VORElGwrspKTsKKwkJCQknJycJCQkJCQkJCisJCQkJLy8geSAuLiB5OQorCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu0NhbnZhc0F4aXNUaWNrUmVuZGVyZXIgYXhpc1RpY2tSZW5kZXJlciA9IG5ldyBDYW52YXNBeGlzVGlja1JlbmRlcmVyKCk7CisJCQkJYXhpc1RpY2tSZW5kZXJlci5zZXRUZXh0Q29sb3IoIiMyMDIwMjAiKTsKKwkJCQlheGVzLmFkZEF4aXMobmV3IFhZYXhpcyhYWWF4ZXMuwqtheGlzUHJlZml4LmNoYXJBdCgxKcK7KQorCQkJCQkuc2V0UGFkKDEuMDVmKQorCQkJCQkuc2V0VGlja09wdGlvbnMoYXhpc1RpY2tSZW5kZXJlcsKrSUYgZGF0YV9heGlzLmFuZ2xlIT0wwrsuc2V0QW5nbGUowqtkYXRhX2F4aXMuYW5nbGXCuynCq0VORElGwrspKTsKKwkJCQknJycKKwkJCQkvLyBhZGRpdGlvbmFsIGF4ZXMKKwkJCQlmb3IgKGF4aXNLZXkgOiBtdWx0aXBsZUF4ZXMua2V5U2V0KSB7CisJCQkJCWlmICghYXhpc0tleS5lcXVhbHMoIjEiKSkgeworCQkJCQkJYm9keSA9ICcnJ8KrYm9kecK7wqttdWx0aXBsZUF4ZXMuZ2V0KGF4aXNLZXkpwrsnJycKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobXVsdGlwbGVBeGVzLmtleVNldC5zaXplID4gMCkgeworCQkJCQlib2R5ID0gJycnCisJCQkJCcKrYm9kecK7TGluZWFyQXhpc1JlbmRlcmVyIGxpbmVhckF4aXNSZW5kZXJlciA9IG5ldyBMaW5lYXJBeGlzUmVuZGVyZXIoKTsKKwkJCQkJbGluZWFyQXhpc1JlbmRlcmVyLnNldEFsaWduVGlja3ModHJ1ZSk7CisJCQkJCUF4ZXNEZWZhdWx0cyBheGVzRGVmYXVsdHMgPSBuZXcgQXhlc0RlZmF1bHRzKCkKKwkJCQkJCS5zZXRVc2VTZXJpZXNDb2xvcih0cnVlKQorCQkJCQkJLnNldEJvcmRlcldpZHRoKDMpCQorCQkJCQkJLnNldFJlbmRlcmVyT3B0aW9ucyhsaW5lYXJBeGlzUmVuZGVyZXIpOworCQkJCQlvcHRpb25zLnNldEF4ZXNEZWZhdWx0cyhheGVzRGVmYXVsdHMpOworCQkJCQknJycKKwkJCQl9CisJCQl9CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCu29wdGlvbnMuc2V0QXhlcyhheGVzKTsKKwkJCScnJworCQl9CQkKKwkJLy8gbGVnZW5kCisJCWZvciAoZWxlbWVudCA6IGNoYXJ0LnNvdXJjZS5lbGVtZW50cykgeworCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDaGFydExlZ2VuZCkgeworCQkJCXZhciBsZWdlbmQgPSBlbGVtZW50IGFzIENoYXJ0TGVnZW5kCisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7TGVnZW5kIGxlZ2VuZCA9IG5ldyBMZWdlbmQoKS5zZXRTaG93KMKrKGxlZ2VuZCAhPSBudWxsKS5ib29sZWFuVmFsdWUudG9TdHJpbmfCuyk7CisJCQkJJycnCisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7bGVnZW5kLnNldFBsYWNlbWVudChMZWdlbmRQbGFjZW1lbnRzLsKrbGVnZW5kLnBsYWNlbWVudC5uYW1lKCnCuyk7CisJCQkJJycnCisJCQkJaWYgKGxlZ2VuZC50b2dnbGUpIHsKKwkJCQkJYm9keSA9ICcnJworCQkJCQnCq2JvZHnCu0VuaGFuY2VkTGVnZW5kUmVuZGVyZXIgcmVuZGVyZXIgPSBuZXcgRW5oYW5jZWRMZWdlbmRSZW5kZXJlcigpOworCQkJCQlyZW5kZXJlci5zZXRTZXJpZXNUb2dnbGUoU2VyaWVzVG9nZ2xlcy7Cq2xlZ2VuZC50b2dnbGVUeXBlLmdldE5hbWXCuyk7CisJCQkJCXJlbmRlcmVyLnNldFNlcmllc1RvZ2dsZVJlcGxvdCjCq2xlZ2VuZC5yZXBsb3QuYm9vbGVhblZhbHVlLnRvU3RyaW5nwrspOworCQkJCQlsZWdlbmQuc2V0UmVuZGVyZXJPcHRpb25zKHJlbmRlcmVyKTsKKwkJCQkJJycnCisJCQkJfQorCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu29wdGlvbnMuc2V0TGVnZW5kKGxlZ2VuZCk7CisJCQkJJycnCisJCQl9CisJCX0KKwkJCQorCQkvLyBoaWdobGlnaHRlcgorCQlmb3IgKGVsZW1lbnQgOiBjaGFydC5zb3VyY2UuZWxlbWVudHMpIHsKKwkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2hhcnRIaWdobGlnaHRlcikgeworCQkJCXZhciBoaWdobGlnaHRlciA9IGVsZW1lbnQgYXMgQ2hhcnRIaWdobGlnaHRlcgorCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu0hpZ2hsaWdodGVyIGhpZ2hsaWdodGVyID0gbmV3IEhpZ2hsaWdodGVyKCkuc2V0U2hvdyjCqyhoaWdobGlnaHRlciAhPSBudWxsKS5ib29sZWFuVmFsdWUudG9TdHJpbmfCuyk7CisJCQkJJycnCisJCQkJYm9keSA9ICcnJworCQkJCcKrYm9kecK7aGlnaGxpZ2h0ZXIuc2V0U2hvd1Rvb2x0aXAodHJ1ZSkKKwkJCQkuc2V0VG9vbHRpcEFsd2F5c1Zpc2libGUowqtoaWdobGlnaHRlci50b29sdGlwQWx3YXlzLmJvb2xlYW5WYWx1ZS50b1N0cmluZ8K7KQorCQkJCS5zZXRLZWVwVG9vbHRpcEluc2lkZUNoYXJ0KMKraGlnaGxpZ2h0ZXIuaW5zaWRlQ2hhcnQuYm9vbGVhblZhbHVlLnRvU3RyaW5nwrspCisJCQkJLnNldFRvb2x0aXBMb2NhdGlvbihUb29sdGlwTG9jYXRpb25zLsKraGlnaGxpZ2h0ZXIubG9jYXRpb24ubmFtZSgpwrspCisJCQkJLnNldEJyaW5nU2VyaWVzVG9Gcm9udCh0cnVlKQorCQkJCS5zZXRGYWRlVG9vbHRpcCh0cnVlKQorCQkJCS5zZXRTaG93TWFya2VyKHRydWUpOworCQkJCScnJworCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu2hpZ2hsaWdodGVyLnNldFRvb2x0aXBBeGVzKFRvb2x0aXBBeGVzLsKrYXhpc1ByZWZpeMK7wqtwb3N0Zml4wrspOworCQkJCScnJworCQkJCWJvZHkgPSAnJycKKwkJCQnCq2JvZHnCu29wdGlvbnMuc2V0SGlnaGxpZ2h0ZXIoaGlnaGxpZ2h0ZXIpOworCQkJCScnJworCQkJfQorCQl9CisJCQorCQkvLyBjdXJzb3IKKwkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0TGluZSkgeworCQkJaWYgKChjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRMaW5lKS5jdXJzb3IpIHsKKwkJCQlib2R5ID0gJycnCisJCQkJwqtib2R5wrtDdXJzb3IgY3Vyc29yID0gbmV3IEN1cnNvcigpCisJCQkJCS5zZXRTaG93KHRydWUpCisJCQkJCS5zZXRab29tKMKrKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydExpbmUpLnpvb20udG9TdHJpbmfCuykKKwkJCQkJLnNldFNob3dUb29sdGlwKMKrKGNoYXJ0LmNoYXJ0dHlwZSBhcyBDaGFydExpbmUpLnRvb2x0aXAudG9TdHJpbmfCuyk7CisJCQkJb3B0aW9ucy5zZXRDdXJzb3IoY3Vyc29yKTsKKwkJCQknJycKKwkJCX0KKwkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0TGluZSkuYW5pbWF0ZWQpIHsKKwkJCQlib2R5ID0gJycnCisJCQkJwqtib2R5wrtvcHRpb25zLnNldEFuaW1hdGUodHJ1ZSk7CisJCQkJJycnCisJCQl9CisJCX0KKwkJaWYgKGhhc0F4aXMpIHsKKwkJCS8vIHNlcmllcworCQkJYm9keSA9ICcnJworCQkJwqtib2R5wrtvcHRpb25zLnNldFNlcmllcyjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7U2VyaWVzKTsKKwkJCScnJworCQl9CisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrtEQ2hhcnRzIGNoYXJ0ID0gbmV3IERDaGFydHMoKQorCQkJLnNldERhdGFTZXJpZXMoZGF0YVNlcmllcykKKwkJCS5zZXRPcHRpb25zKG9wdGlvbnMpCisJCQkuc2V0RW5hYmxlRG93bmxvYWQodHJ1ZSkKKwkJCS5zZXREb3dubG9hZEJ1dHRvbkNhcHRpb24oZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZShsb2NhbGUudG9MYW5ndWFnZVRhZygpLCAiZG93bmxvYWQiKSkKKwkJCS5zZXREb3dubG9hZEZpbGVuYW1lKCLCq2NoYXJ0Lm5hbWXCuyIpCisJCQkuc2V0RG93bmxvYWRCdXR0b25Mb2NhdGlvbihEb3dubG9hZEJ1dHRvbkxvY2F0aW9uLlRPUF9SSUdIVCk7CisJCScnJworCQlib2R5ID0gJycnCisJCcKrYm9kecK7Y2hhcnQuc2V0SWQoImNoYXJ0Iik7CisJCWNoYXJ0LnNldEltbWVkaWF0ZSh0cnVlKTsKKwkJaWYoY2hhcnRSZWZyZXNoZXJEb25lKSB7CisJCQljaGFydC5zaG93KCk7CisJCX0KKwkJY2hhcnRzLmFkZChjaGFydCk7CisJCXJldHVybiBjaGFydDsnJycJCQkKKwkJcmV0dXJuIGJvZHkKKwl9CisJCisJLyoqCisJICogPHA+aGVscGVyIG1ldGhvZCB0byBjb252ZXJ0IGEgcmdiIHN0cmluZyB0byBhIGhleCBzdHJpbmcuPC9wPiAKKwkgKgorCSAqLworCWRlZiBTdHJpbmcgdG9IZXgoU3RyaW5nIHJnYikgeworCQl2YXIgY29sb3JIZXggPSAiIyIKKwkJZm9yIChjb2xvciA6IHJnYi5zcGxpdCgiLCIpKSB7CisJCQl2YXIgaSA9IG5ldyBJbnRlZ2VyKGNvbG9yKTsKKwkJCWNvbG9ySGV4ID0gJycnwqtjb2xvckhleMK7wqtTdHJpbmc6OmZvcm1hdCgiJTAyeCIsIGkpwrsnJycKKwkJfQorCQlyZXR1cm4gY29sb3JIZXgKKwl9CisJCisJLyoqCisJICogPHA+YnVpbGQgdGhlIGxhYmVsIHNlcmllcy4gQ3JlYXRlIG11bHRpcGxlIHktYXhlcyB3aGVuIHRoZSB1bmRlcmx5aW5nIGRhdGFtYXJ0IHByZXNlbnRzIGRpZmZlcmVudCBzY2FsZXMuPC9wPiAKKwkgKgorCSAqIDxwPnNjYWxlcyBhcmUgdXNlZCB0byBkaXNwbGF5IGxpbmUgY2hhcnRzIHRvZ2V0aGVyIGZvciBjb21wYXJpc29uIHJlYXNvbiBidXQgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNjYWxpbmdzLjwvcD4gCisJICovCisJZGVmIFN0cmluZyBjcmVhdGVMYWJlbFNlcmllcyhDaGFydCBjaGFydCwgQ2hhcnRBeGlzIGRhdGFfYXhpcywgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPm11bHRpcGxlQXhlcywgU3RyaW5nIGF4aXNQcmVmaXgsIGJvb2xlYW4gc2hvd01hcmtlcikgeworCQl2YXIgYm9keSA9ICIiCisJCXZhciBtc3JDbnQgPSAwCisJCS8vIGZpbmQgbXVsdGlwbGUgYXhlcyBkZWZpbmVkIGluIGRhdGFtYXJ0CisJCWlmICgoY2hhcnQuc291cmNlIGFzIENoYXJ0RGF0YW1hcnQpLmRhdGFtYXJ0UmVmLnNvdXJjZSBpbnN0YW5jZW9mIERhdGFtYXJ0Q3ViZSkgeworCQkJZm9yIChheGlzT3JTbGljZXIgOiAoKGNoYXJ0LnNvdXJjZSBhcyBDaGFydERhdGFtYXJ0KS5kYXRhbWFydFJlZi5zb3VyY2UgYXMgRGF0YW1hcnRDdWJlKS5heGlzc2xpY2VyKSB7CisJCQkJaWYgKGF4aXNPclNsaWNlciBpbnN0YW5jZW9mIERhdGFtYXJ0QXhpcykgeworCQkJCQlmb3IgKGVsZW1lbnQgOiAoYXhpc09yU2xpY2VyIGFzIERhdGFtYXJ0QXhpcykuZWxlbWVudHMpIHsKKwkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRGF0YW1hcnREZXJpdmVkTWVhc3VyZSkgeworCQkJCQkJCWlmICgoZWxlbWVudCBhcyBEYXRhbWFydERlcml2ZWRNZWFzdXJlKS5zY2FsZWQpIHsKKwkJCQkJCQkJYm9keSA9ICcnJ8KrYm9kecK7wqsoZWxlbWVudCBhcyBEYXRhbWFydERlcml2ZWRNZWFzdXJlKS5zY2FsZS5jcmVhdGVTY2FsZShkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgbXNyQ250LCBheGlzUHJlZml4LCBzaG93TWFya2VyKcK7JycnCisJCQkJCQkJCW1zckNudCA9IG1zckNudCArIDEgCisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEYXRhbWFydE1lYXN1cmUpIHsKKwkJCQkJCQlpZiAoKGVsZW1lbnQgYXMgRGF0YW1hcnRNZWFzdXJlKS5zY2FsZWQpIHsKKwkJCQkJCQkJYm9keSA9ICcnJ8KrYm9kecK7wqsoZWxlbWVudCBhcyBEYXRhbWFydE1lYXN1cmUpLnNjYWxlLmNyZWF0ZVNjYWxlKGRhdGFfYXhpcywgbXVsdGlwbGVBeGVzLCBtc3JDbnQsIGF4aXNQcmVmaXgsIHNob3dNYXJrZXIpwrsnJycKKwkJCQkJCQkJbXNyQ250ID0gbXNyQ250ICsgMSAKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoKGNoYXJ0LnNvdXJjZSBhcyBDaGFydERhdGFtYXJ0KS5kYXRhbWFydFJlZi5zb3VyY2UgaW5zdGFuY2VvZiBEYXRhbWFydEVudGl0eSkgeworCQkJdmFyIGVudGl0eSA9ICgoY2hhcnQuc291cmNlIGFzIENoYXJ0RGF0YW1hcnQpLmRhdGFtYXJ0UmVmLnNvdXJjZSBhcyBEYXRhbWFydEVudGl0eSkKKwkJCWJvZHkgPSAnJyfCq2JvZHnCu8KrZW50aXR5LmVudGl0eVNjYWxlKGRhdGFfYXhpcywgbXVsdGlwbGVBeGVzLCBtc3JDbnQsIGF4aXNQcmVmaXgsIHNob3dNYXJrZXIpwrsnJycKKwkJfQorCQkvLyBubyBtdWx0aXBsZSBheGVzIGRlZmluZWQgaW4gZGF0YW1hcnQKKwkJaWYgKG11bHRpcGxlQXhlcy5rZXlTZXQuc2l6ZSA9PSAwKSB7CisJCQlib2R5ID0gJycnCisJCQnCq2JvZHnCuwlmb3IgKFN0cmluZyB0aXRsZSA6IMKrZGF0YV9heGlzLmF4aXMubmFtZS5saXRlcmFswrtUaXRsZXNBcnJheSkgeworCQkJCQnCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7U2VyaWVzLmFkZFNlcmllcyhuZXcgWFlzZXJpZXMoKS5zZXRMYWJlbCh0aXRsZSkuc2V0U2hvd01hcmtlcijCq3Nob3dNYXJrZXIudG9TdHJpbmfCuykpOworCQkJCX0KKwkJCScnJwkJCQorCQl9CisJCXJldHVybiBib2R5CisJfQorCQorCS8qKgorCSAqIDxwPmhlbHBlciBtZXRob2QgZm9yIHNjYWxlcyBjb21pbmcgZnJvbSBkYXRhbWFydCBlbnRpdGllcyBub3QgZnJvbSBjdWJlcy48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyBlbnRpdHlTY2FsZShEYXRhbWFydEVudGl0eSBlbnRpdHksIENoYXJ0QXhpcyBkYXRhX2F4aXMsIEhhc2hNYXA8U3RyaW5nLFN0cmluZz4gbXVsdGlwbGVBeGVzLCBpbnQgbXNyQ250LCBTdHJpbmcgYXhpc1ByZWZpeCwgYm9vbGVhbiBzaG93TWFya2VyKSB7CisJCXZhciBjb3VudGVyID0gbXNyQ250CisJCXZhciBib2R5ID0gIiIKKwkJZm9yIChwcm9wZXJ0eSA6IGVudGl0eS5wcm9wZXJ0aWVzKSB7CisJCQlpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBEYXRhbWFydFByb3BlcnR5KSB7CisJCQkJaWYgKHByb3BlcnR5LnNjYWxlZCkgeworCQkJCQlib2R5ID0gJycnwqtib2R5wrvCq3Byb3BlcnR5LnNjYWxlLmNyZWF0ZVNjYWxlKGRhdGFfYXhpcywgbXVsdGlwbGVBeGVzLCBjb3VudGVyLCBheGlzUHJlZml4LCBzaG93TWFya2VyKcK7JycnCisJCQkJCWNvdW50ZXIgPSBjb3VudGVyICsgMQorCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKG5hdmlnYXRpb24gOiBlbnRpdHkubmF2aWdhdGlvbnMpIHsKKwkJCWlmIChuYXZpZ2F0aW9uIGluc3RhbmNlb2YgRGF0YW1hcnRNZW1iZXIpIHsKKwkJCQlib2R5ID0gJycnwqtib2R5wrvCqyhuYXZpZ2F0aW9uIGFzIERhdGFtYXJ0TWVtYmVyKS5kYXRhbWFydEVudGl0eS5lbnRpdHlTY2FsZShkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgY291bnRlciwgYXhpc1ByZWZpeCwgc2hvd01hcmtlcinCuycnJworCQkJfQorCQkJaWYgKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE93bmVyKSB7CisJCQkJYm9keSA9ICcnJ8KrYm9kecK7wqsobmF2aWdhdGlvbiBhcyBEYXRhbWFydE93bmVyKS5kYXRhbWFydEVudGl0eS5lbnRpdHlTY2FsZShkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgY291bnRlciwgYXhpc1ByZWZpeCwgc2hvd01hcmtlcinCuycnJworCQkJfQorCQl9CisJCXJldHVybiBib2R5CisJfQorCQorCS8qKgorCSAqIDxwPmhlbHBlciBtZXRob2QgZm9yIHNjYWxlcy48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyBjcmVhdGVTY2FsZShWYWx1ZVNjYWxlRW51bSBzY2FsZSwgQ2hhcnRBeGlzIGRhdGFfYXhpcywgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPiBtdWx0aXBsZUF4ZXMsIGludCBtc3JDbnQsIFN0cmluZyBheGlzUHJlZml4LCBib29sZWFuIHNob3dNYXJrZXIpIHsKKwkJdmFyIG11bHRpcGxlQm9keSA9ICIiCisJCXZhciBib2R5ID0gIiIKKwkJdmFyIHNjYWxlT3JkaW5hbCA9IHNjYWxlLm9yZGluYWwKKwkJdmFyIHNjYWxlTmFtZSA9IHNjYWxlLnRvU3RyaW5nCisJCWJvZHkgPSAnJycKKwkJwqtib2R5wrsKKwkJCcKrZGF0YV9heGlzLmF4aXMubmFtZS5saXRlcmFswrtTZXJpZXMuYWRkU2VyaWVzKG5ldyBYWXNlcmllcyjCq2F4aXNQcmVmaXguY2hhckF0KDEpwrtheGVzLsKrYXhpc1ByZWZpeC5jaGFyQXQoMSnCu8KrSUYgc2NhbGVPcmRpbmFsICE9IDDCu8KrKHNjYWxlT3JkaW5hbCsxKcK7wqtFTkRJRsK7KS5zZXRMYWJlbCjCq2RhdGFfYXhpcy5heGlzLm5hbWUubGl0ZXJhbMK7VGl0bGVzQXJyYXkuZ2V0KMKrbXNyQ250wrspKS5zZXRTaG93TWFya2VyKMKrc2hvd01hcmtlci50b1N0cmluZ8K7KSk7CisJCScnJworCQlpZiAoIW11bHRpcGxlQXhlcy5rZXlTZXQuY29udGFpbnMoc2NhbGVOYW1lKSkgeworCQkJLy8gYXhpcyAxIGlzIG5ldmVyIGV4cHJlc3NlZCwgYnV0IDIuLjkKKwkJCW11bHRpcGxlQm9keSA9IAorCQkJJycnYXhlcy5hZGRBeGlzKG5ldyBYWWF4aXMoWFlheGVzLsKrYXhpc1ByZWZpeC5jaGFyQXQoMSnCu8KrSUYgc2NhbGVPcmRpbmFsICE9IDDCu8KrKHNjYWxlT3JkaW5hbCsxKcK7wqtFTkRJRsK7KS5zZXRUaWNrT3B0aW9ucyhheGlzVGlja1JlbmRlcmVywqtJRiBkYXRhX2F4aXMuYW5nbGUhPTDCuy5zZXRBbmdsZSjCq2RhdGFfYXhpcy5hbmdsZcK7KcKrRU5ESUbCuykpOworCQkJJycnCisJCQltdWx0aXBsZUF4ZXMucHV0KHNjYWxlTmFtZSwgbXVsdGlwbGVCb2R5KQorCQl9CisJCXJldHVybiBib2R5CisJfQorCQorCS8qKgorCSAqIDxwPmhlbHBlciBtZXRob2QgdG8gZ2V0IGEgcHJvcGVydHkgbmFtZSBvciBpdHMgYWxpYXMgaWYgcHJlc2VudCBvZiBhIGVudGl0eSdzIHByb3BlcnR5IG9iamVjdC48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoRGF0YW1hcnRQcm9wZXJ0eSBwcm9wZXJ0eSkgeworCQlyZXR1cm4gKHByb3BlcnR5LnByb3BlcnR5UmVmIGFzIExBdHRyaWJ1dGUpLm5hbWUudG9VcHBlckNhc2UgCisJfQorIAorCS8qKgorCSAqIDxwPmhlbHBlciBtZXRob2QgdG8gZ2V0IGEgbGV2ZWwgbmFtZSBvZiBhIGhpZXJhcmNoeSdzIGxldmVsIG9iamVjdC48L3A+IAorCSAqCisJICovCisJZGVmIFN0cmluZyBnZXRMZXZlbE5hbWUoQ3ViZUxldmVsIGxldmVsKSB7CisJCXJldHVybiBsZXZlbC5uYW1lCisJfQorCQorCWRlZiBTdHJpbmcgc2V0dXAoQ2hhcnQgY2hhcnQpIHsKKwkJdmFyIGJvZHkgPSAiIgorCQlib2R5ID0gJycnCisJCcKrYm9kecK7CisJCXN1YnNjcmliZSgpOycnJworCQl2YXIgZmlsdGVySWRNYXAgPSA8U3RyaW5nLFN0cmluZz5uZXdIYXNoTWFwCisJCWlmIChjaGFydC5zb3VyY2UgIT0gbnVsbCAmJiBjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYgIT0gbnVsbCAmJiBjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYubmFtZSAhPSBudWxsKSB7CisJCQlkYXRhbWFydEluZmVycmVyLmNyZWF0ZUZpbHRlck1hcChjaGFydC5zb3VyY2UuZGF0YW1hcnRSZWYsIGZpbHRlcklkTWFwKQorCQl9CisJCWZvciAoZmlsdGVyIDogZmlsdGVySWRNYXAua2V5U2V0KSB7CisJCQlib2R5ID0gJycnwqtib2R5wrvCq2ZpbHRlcklkTWFwLmdldChmaWx0ZXIpLnNldHVwRXZlbnQoZmlsdGVyKcK7JycnCisJCX0KKwkJcmV0dXJuIGJvZHkKKwl9CisJCisJZGVmIHNldHVwRXZlbnQoU3RyaW5nIGV2ZW50SWQsIFN0cmluZyBmaWx0ZXIpIHsKKwkJJycnCisJCWV2ZW50QnJva2VyLnN1YnNjcmliZSgiwqtldmVudElkwrsiLAorCQluZXcgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXIoKSB7CisJCQlAT3ZlcnJpZGUKKwkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsKKwkJCQlmaW5hbCBFdmVudEJyb2tlck1zZyBtc2cgPSAoRXZlbnRCcm9rZXJNc2cpZXZlbnQuZ2V0UHJvcGVydHkob3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VXRpbHMuREFUQSk7CisJCQkJZmlsdGVyR2VuZXJhdG9yLnNlbGVjdEl0ZW0oIsKrZmlsdGVywrsiLCBtc2cuZ2V0TmFtZSgpKTsKKwkJCX0KKwkJfSk7CisJCScnJworCX0KKworCWRlZiBsb2NhbGVDaGFuZ2VkKENoYXJ0IGNoYXJ0KQorCQknJycKKwkJdGhpcy5sb2NhbGUgPSBsb2NhbGU7CisJCWlmKGNoYXJ0cyAhPSBudWxsKSB7CisJCQlmb3IoRENoYXJ0cyBjaGFydDpjaGFydHMpIHsKKwkJCQljaGFydC5zZXRMb2NhbGUobG9jYWxlKTsKKwkJCQnCq0lGIGNoYXJ0LnNvdXJjZS5kYXRhbWFydFJlZi5kZXNjcmlwdGlvbiAmJiAKKwkJCQkJY2hhcnQuc291cmNlLmRhdGFtYXJ0UmVmLmRlc2NyaXB0aW9uVmFsdWUgIT0gbnVsbMK7CisJCQkJCWNoYXJ0LnNldERlc2NyaXB0aW9uKGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUobG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSwgIsKrY2hhcnQuc291cmNlLmRhdGFtYXJ0UmVmLmRlc2NyaXB0aW9uVmFsdWXCuyIpKTsKKwkJCQkJY2hhcnQuc2V0RG93bmxvYWRCdXR0b25DYXB0aW9uKGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUobG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSwgImRvd25sb2FkIikpOworCQkJCcKrRU5ESUbCuworCQkJfQorCQl9CisJCWlmKGZpbHRlckdlbmVyYXRvciAhPSBudWxsKSB7CisJCQlmaWx0ZXJHZW5lcmF0b3Iuc2V0TG9jYWxlKGxvY2FsZSk7CisJCX0KKwkJaWYobGF5b3V0TWFuYWdlciAhPSBudWxsKSB7CisJCQlsYXlvdXRNYW5hZ2VyLnNldExhYmVsVmFsdWUoZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZShsb2NhbGUudG9MYW5ndWFnZVRhZygpLCAiwqtjaGFydC5uYW1lwrsiKSk7CisJCX0KKwkJJycnCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydE1vZGVsR2VuZXJhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydE1vZGVsR2VuZXJhdG9yLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMmViNjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0TW9kZWxHZW5lcmF0b3IueHRlbmQKQEAgLTAsMCArMSw1MjUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbAorCitpbXBvcnQgY29tLnZhYWRpbi5kYXRhLlByb3BlcnR5LlZhbHVlQ2hhbmdlTGlzdGVuZXIKK2ltcG9ydCBjb20udmFhZGluLnNlcnZlci5QYWdlCitpbXBvcnQgY29tLnZhYWRpbi5zZXJ2ZXIuUGFnZS5TdHlsZXMKK2ltcG9ydCBjb20udmFhZGluLnVpLkhvcml6b250YWxMYXlvdXQKK2ltcG9ydCBjb20udmFhZGluLnVpLkphdmFTY3JpcHRGdW5jdGlvbgoraW1wb3J0IGNvbS52YWFkaW4udWkuTGFiZWwKK2ltcG9ydCBjb20udmFhZGluLnVpLlRhYlNoZWV0CitpbXBvcnQgY29tLnZhYWRpbi51aS5VSQoraW1wb3J0IGVsZW1lbnRhbC5qc29uLkpzb25BcnJheQoraW1wb3J0IGVsZW1lbnRhbC5qc29uLkpzb25FeGNlcHRpb24KK2ltcG9ydCBlbGVtZW50YWwuanNvbi5Kc29uT2JqZWN0CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdAoraW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uCitpbXBvcnQgamF2YS51dGlsLkRhdGUKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcAoraW1wb3J0IGphdmEudXRpbC5MaXN0CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZQoraW1wb3J0IGphdmEudXRpbC5NYXAKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGUKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5EQ2hhcnRzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5Eb3dubG9hZEJ1dHRvbkxvY2F0aW9uCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5iYXNlLmVsZW1lbnRzLlRyZW5kbGluZQoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMuYmFzZS5lbGVtZW50cy5YWWF4aXMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLmJhc2UuZWxlbWVudHMuWFlzZXJpZXMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLmRhdGEuRGF0YVNlcmllcworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMuZGF0YS5UaWNrcworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuTGVnZW5kUGxhY2VtZW50cworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuUHlyYW1pZFNpZGVzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5TZXJpZXNUb2dnbGVzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5Ub29sdGlwQXhlcworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuWFlheGVzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5YYXhlcworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuWWF4ZXMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm1ldGFkYXRhLmRpcmVjdGlvbnMuQmFyRGlyZWN0aW9ucworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEubG9jYXRpb25zLlRvb2x0aXBMb2NhdGlvbnMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm1ldGFkYXRhLnJlbmRlcmVycy5BeGlzUmVuZGVyZXJzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5yZW5kZXJlcnMuU2VyaWVzUmVuZGVyZXJzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5vcHRpb25zLkF4ZXMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuQXhlc0RlZmF1bHRzCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5vcHRpb25zLkN1cnNvcgoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5IaWdobGlnaHRlcgoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5MZWdlbmQKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuT3B0aW9ucworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5TZXJpZXMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuU2VyaWVzRGVmYXVsdHMKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuVGl0bGUKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy5heGlzLkxpbmVhckF4aXNSZW5kZXJlcgoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLmxlZ2VuZC5FbmhhbmNlZExlZ2VuZFJlbmRlcmVyCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLkJhclJlbmRlcmVyCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLkJ1YmJsZVJlbmRlcmVyCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLkRvbnV0UmVuZGVyZXIKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy5zZXJpZXMuTWV0ZXJHYXVnZVJlbmRlcmVyCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLlBpZVJlbmRlcmVyCitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLlB5cmFtaWRSZW5kZXJlcgoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLnRpY2suQXhpc1RpY2tSZW5kZXJlcgoraW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLnRpY2suQ2FudmFzQXhpc1RpY2tSZW5kZXJlcgoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LmNvcmUuZGkuZXh0ZW5zaW9ucy5FdmVudFV0aWxzCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyCitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuTVVJRWxlbWVudAoraW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLmJhc2ljLk1QYXJ0U3RhY2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5pbXBsLlVJRWxlbWVudEltcGwKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5pbXBsLlVpUGFja2FnZUltcGwKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVySW1wbAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5ldmVudGJyb2tlci5FdmVudEJyb2tlck1zZworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmRhdGFtYXJ0LkRlcml2ZWRPbGFwRXhjZXB0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb25zdGFudHMuRXh0ZW5kZWREYXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy52YWFkaW4uVmlld0xheW91dE1hbmFnZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLmdlbmVyYXRvci5CYXNpY0RzbEdlbmVyYXRvclV0aWxzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRNb2RlbAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRUcmVlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24uRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3IKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkNlbGxTZXRUb0QzSnNvbkNvbnZlcnRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQuY29tbW9uLm9sYXAuRGVyaXZlZEF4aXMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRDZWxsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkSGllcmFyY2h5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkTGV2ZWwKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRNZW1iZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRQb3NpdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bi5JMThOTW9kZWxHZW5lcmF0b3IKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuSUZpbGVTeXN0ZW1BY2Nlc3MKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkdlbmVyYXRvckNvbmZpZworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkltcG9ydE1hbmFnZXIKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXIKKworY2xhc3MgQ2hhcnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEkxOE5Nb2RlbEdlbmVyYXRvciB7CisJQEluamVjdCBleHRlbnNpb24gSVF1YWxpZmllZE5hbWVQcm92aWRlcgorCUBJbmplY3QgZXh0ZW5zaW9uIEQzSnNKYXZhVXRpbAorCUBJbmplY3QgZXh0ZW5zaW9uIEJhc2ljRHNsR2VuZXJhdG9yVXRpbHMKKwkKKwlvdmVycmlkZSBjcmVhdGVBcHBlbmRhYmxlKEVPYmplY3QgY29udGV4dCwgSW1wb3J0TWFuYWdlciBpbXBvcnRNYW5hZ2VyLCBHZW5lcmF0b3JDb25maWcgY29uZmlnKSB7CisJCS8vIHJlcXVpcmVkIHRvIGluaXRpYWxpemUgdGhlIG5lZWRlZCBidWlsZGVyIHRvIGF2b2lkIGRlcHJlY2F0ZWQgbWV0aG9kcworCQlidWlsZGVyID0gY29udGV4dC5lUmVzb3VyY2UKKwkJLy8gLS0tLS0tLS0tCisJCWltcG9ydE1hbmFnZXIuYWRkSW1wb3J0Rm9yKF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEhhc2hNYXAsIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZyksIF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZykpLnR5cGUpCisJCWltcG9ydE1hbmFnZXIuYWRkSW1wb3J0Rm9yKF90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKE1hcCwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nKSwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nKSkudHlwZSkKKwkJaW1wb3J0TWFuYWdlci5hZGRJbXBvcnRGb3IoX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29sbGVjdGlvbiwgX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nKSkudHlwZSkKKwkJYWRkSW1wb3J0Rm9yKGltcG9ydE1hbmFnZXIsIF90eXBlUmVmZXJlbmNlQnVpbGRlcgorCQkJLCBWYWx1ZUNoYW5nZUxpc3RlbmVyCisJCQksIERDaGFydHMKKwkJCSwgTGFiZWwKKwkJCSwgTGlzdAorCQkJLCBBcnJheUxpc3QKKwkJCSwgUGFnZQorCQkJLCBTdHlsZXMKKwkJCSwgRGVyaXZlZEF4aXMKKwkJCSwgRGVyaXZlZENlbGwKKwkJCSwgRGVyaXZlZFBvc2l0aW9uCisJCQksIERlcml2ZWRNZW1iZXIKKwkJCSwgSG9yaXpvbnRhbExheW91dAorCQkJLCBUYWJTaGVldAorCQkJLCBTZXJpZXMKKwkJCSwgWFlzZXJpZXMKKwkJCSwgVGlja3MKKwkJCSwgRGF0YVNlcmllcworCQkJLCBTZXJpZXNEZWZhdWx0cworCQkJLCBTZXJpZXNSZW5kZXJlcnMKKwkJCSwgQ2FudmFzQXhpc1RpY2tSZW5kZXJlcgorCQkJLCBEb251dFJlbmRlcmVyCisJCQksIFBpZVJlbmRlcmVyCisJCQksIEJ1YmJsZVJlbmRlcmVyCisJCQksIEJhclJlbmRlcmVyCisJCQksIEJhckRpcmVjdGlvbnMKKwkJCSwgTWV0ZXJHYXVnZVJlbmRlcmVyCisJCQksIFB5cmFtaWRSZW5kZXJlcgorCQkJLCBQeXJhbWlkU2lkZXMKKwkJCSwgVHJlbmRsaW5lCisJCQksIEN1cnNvcgorCQkJLCBMZWdlbmQKKwkJCSwgTGVnZW5kUGxhY2VtZW50cworCQkJLCBFbmhhbmNlZExlZ2VuZFJlbmRlcmVyCisJCQksIFNlcmllc1RvZ2dsZXMKKwkJCSwgSGlnaGxpZ2h0ZXIKKwkJCSwgVGl0bGUKKwkJCSwgVG9vbHRpcExvY2F0aW9ucworCQkJLCBUb29sdGlwQXhlcworCQkJLCBBeGVzCisJCQksIFhZYXhlcworCQkJLCBYWWF4aXMKKwkJCSwgWGF4ZXMKKwkJCSwgWWF4ZXMKKwkJCSwgQXhpc1RpY2tSZW5kZXJlcgorCQkJLCBBeGlzUmVuZGVyZXJzCisJCQksIExpbmVhckF4aXNSZW5kZXJlcgorCQkJLCBBeGVzRGVmYXVsdHMKKwkJCSwgRG93bmxvYWRCdXR0b25Mb2NhdGlvbgorCQkJLCBPcHRpb25zCisJCQksIERlcml2ZWRIaWVyYXJjaHkKKwkJCSwgRGVyaXZlZExldmVsCisJCQksIERlcml2ZWRPbGFwRXhjZXB0aW9uCisJCQksIElFdmVudEJyb2tlcgorCQkJLCBDZWxsU2V0VG9EM0pzb25Db252ZXJ0ZXIKKwkJCSwgRGF0ZQorCQkJLCBFeHRlbmRlZERhdGUKKwkJCSwgSmF2YVNjcmlwdEZ1bmN0aW9uCisJCQksIEpzb25BcnJheQorCQkJLCBKc29uT2JqZWN0CisJCQksIEpzb25FeGNlcHRpb24KKwkJCSwgRXZlbnRIYW5kbGVyCisJCQksIEV2ZW50CisJCQksIEV2ZW50VXRpbHMKKwkJCSwgRXZlbnRCcm9rZXJNc2cKKwkJCSwgRXhlY3V0b3JzCisJCQksIFBhZ2UuQnJvd3NlcldpbmRvd1Jlc2l6ZUV2ZW50CisJCQksIFBhZ2UuQnJvd3NlcldpbmRvd1Jlc2l6ZUxpc3RlbmVyCisJCQksIE5vdGlmaWNhdGlvbgorCQkJLCBBZGFwdGVyCisJCQksIEFkYXB0ZXJJbXBsCisJCQksIEVPYmplY3QKKwkJCSwgVUlFbGVtZW50SW1wbAorCQkJLCBVaVBhY2thZ2VJbXBsCisJCQksIE1VSUVsZW1lbnQKKwkJCSwgTVBhcnRTdGFjaworCQkJLCBVSQorCQkJLCBSZXNvdXJjZUJ1bmRsZQorCQkJLCBMb2NhbGUKKwkJCSwgRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3IKKwkJCSwgVmlld0xheW91dE1hbmFnZXIKKwkJCQorCQkpCisJCXN1cGVyLmNyZWF0ZUFwcGVuZGFibGUoY29udGV4dCwgaW1wb3J0TWFuYWdlciwgY29uZmlnKQorCX0KKwkKKwlvdmVycmlkZSB2b2lkIGRvR2VuZXJhdGUoUmVzb3VyY2UgaW5wdXQsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeworCQlzdXBlci5hZGRUcmFuc2xhdGFibGVzKCJkb3dubG9hZCIpCisJCXN1cGVyLmRvR2VuZXJhdGUoaW5wdXQsIGZzYSApCisJCWZvciAob2JqIDogaW5wdXQuY29udGVudHMpIHsKKwkJCW9iai5pbnRlcm5hbERvR2VuZXJhdGUoZnNhKQorCQl9CisJfQorCQorCWRlZiBkaXNwYXRjaCB2b2lkIGludGVybmFsRG9HZW5lcmF0ZShDaGFydE1vZGVsIGNoYXJ0TW9kZWwsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeyAKKyAgIAkJZm9yIChwa2cgOiBjaGFydE1vZGVsLnBhY2thZ2VzKSB7CisgICAJCQlmb3IgKGNoYXJ0IDogcGtnLmNoYXJ0cykgeworICAgCQkJCWlmICgoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSkgeworICAgCQkJCQl2YXIgcGNrZ05hbWUgPSBwa2cuZnVsbHlRdWFsaWZpZWROYW1lLnRvU3RyaW5nCisvLwkJCQkJcHJpbnRsbihwY2tnTmFtZSkKKwkJCQkJdmFyIHN0ckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcgorCQkJCQl2YXIgcGNrZ05hbWVQYXRoID0gcGNrZ05hbWUucmVwbGFjZUFsbCgiXFwuIiwiLyIpCisvLwkJCQkJdmFyIHByb3BPdXRwdXRGaWxlID0gJycnwqtwY2tnTmFtZVBhdGjCuy/Cq2NoYXJ0LmNyZWF0ZUNoYXJ0SnNGaWxlbmFtZShjaGFydFRyZWUpwrsnJycKKwkJCQkJdmFyIHByb3BPdXRwdXRGaWxlID0gJycnwqtwY2tnTmFtZVBhdGjCuy/Cq2NoYXJ0LmNyZWF0ZUNoYXJ0SnNGaWxlbmFtZcK7JycnCisvLwkJCQkJcHJpbnRsbigiKioqKioqKioqKioqKioqKioqKioqIFByb3BlcnR5LU91dHB1dCAqKioqKioqKioqKioqKioqKioqKioiKQorCQkJCQljaGFydC5nZW5lcmF0ZUpzRmlsZShzdHJCdWlsZGVyKQorCQkJCQlpZiAoc3RyQnVpbGRlci5sZW5ndGggPiAwKXsKKwkJCQkJCWZzYS5nZW5lcmF0ZUZpbGUocHJvcE91dHB1dEZpbGUsIHN0ckJ1aWxkZXIpCisvLwkJCQkJCXByaW50bG4oc3RyQnVpbGRlci50b1N0cmluZykKKwkJCQkJfQorICAgCQkJCX0KKyAgIAkJCX0KKyAgIAkJfQorICAgCX0KKwkKKwlkZWYgdm9pZCBnZW5lcmF0ZUpzRmlsZShDaGFydCBjaGFydCxTdHJpbmdCdWlsZGVyIHN0ckJ1aWxkZXIpeworCQl2YXIgY2hhcnRGaWxlUGF0aCA9IGNoYXJ0LmNyZWF0ZWZ1bGx5UXVhbGlmaWVkQ2hhcnRGaWxlbmFtZS5yZXBsYWNlQWxsKCJcXC4iLCJfIikKKyAgIAkJaWYgKGNoYXJ0LmNoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSl7CisgICAJCQl2YXIgY2hhcnRUcmVlID0gY2hhcnQuY2hhcnR0eXBlIGFzIENoYXJ0VHJlZQorCQkJaWYgKGNoYXJ0VHJlZS5tYXApeworCQkJCXN0ckJ1aWxkZXIuZ2VuZXJhdGVUcmVlTWFwSnNGaWxlKGNoYXJ0RmlsZVBhdGgpCisJCQl9IGVsc2UgaWYgKGNoYXJ0VHJlZS5jb2xsYXBzaWJsZSkgeworCQkJCXN0ckJ1aWxkZXIuZ2VuZXJhdGVDb2xsVHJlZUpzRmlsZShjaGFydEZpbGVQYXRoKQorCQkJfQorICAgCQl9CisJfQorCQorCWRlZiB2b2lkIGdlbmVyYXRlVHJlZU1hcEpzRmlsZShTdHJpbmdCdWlsZGVyIHN0ckJ1aWxkZXIsIFN0cmluZyBjaGFydEphdmFGaWxlTmFtZSl7CisJCXN0ckJ1aWxkZXIuYXBwZW5kKCcnJ8KrY2hhcnRKYXZhRmlsZU5hbWXCuyA9IGZ1bmN0aW9uKCkgeworCQorCQl2YXIgbWFyZ2luID0geworCQkgICAgdG9wOiA0MCwKKwkJICAgIHJpZ2h0OiAxMCwKKwkJICAgIGJvdHRvbTogMTAsCisJCSAgICBsZWZ0OiAxMAorCQl9LAorCQkgICAgd2lkdGggPSA5NjAgLSBtYXJnaW4ubGVmdCAtIG1hcmdpbi5yaWdodCwKKwkJICAgIGhlaWdodCA9IDUwMCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tOworCisJCXZhciBjb2xvciA9IGQzLnNjYWxlLmNhdGVnb3J5MjBjKCk7CisKKwkJZnVuY3Rpb24gcG9zaXRpb24oKSB7CisJCSAgICB0aGlzLnN0eWxlKCJsZWZ0IiwgZnVuY3Rpb24gKGQpIHsKKwkJICAgICAgICByZXR1cm4gZC54ICsgInB4IjsKKwkJICAgIH0pCisJCSAgICAgICAgLnN0eWxlKCJ0b3AiLCBmdW5jdGlvbiAoZCkgeworCQkgICAgICAgICAgICByZXR1cm4gZC55ICsgInB4IjsKKwkJICAgICAgICB9KQorCQkgICAgICAgIC5zdHlsZSgid2lkdGgiLCBmdW5jdGlvbiAoZCkgeworCQkgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZC5keCAtIDEpICsgInB4IjsKKwkJICAgICAgICB9KQorCQkgICAgICAgIC5zdHlsZSgiaGVpZ2h0IiwgZnVuY3Rpb24gKGQpIHsKKwkJICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGQuZHkgLSAxKSArICJweCI7CisJCSAgICAgICAgfSk7CisJCX0KKworCQl2YXIgY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50ID0gdGhpcy5nZXRFbGVtZW50KCk7CisJCXZhciBjeEQzVHJlZU1hcEpzQ29tcG9uZW50SHRtbFRhZ0lkID0gdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZDsKKwkJdmFyIGNoZWNrZWQgPSAiIjsKKwkJdmFyIGNvbm5lY3RvciA9IHRoaXM7CisJCXZhciBkYXRhQ29sdW1uID0gIiI7CisKKwkJdmFyIHByZVZhbHVlTGFiZWwgPSAiIjsKKworCQlmb3IgKHZhciBpPTA7aSA8IHRoaXMuZ2V0U3RhdGUoKS5kYXRhQ29sdW1uTGlzdC5sZW5ndGg7aSsrKSB7CisJCQlpZiAoaSA9PSAwKXsKKwkJCQljaGVja2VkID0gIiBjaGVja2VkIjsKKwkJCQlwcmVWYWx1ZUxhYmVsID0gdGhpcy5nZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0WzBdOworCQkJfSBlbHNlIHsKKwkJCQljaGVja2VkID0gIiI7CisJCQl9CisJCQlkYXRhQ29sdW1uID0gZGF0YUNvbHVtbiArICJcdDxsYWJlbD48aW5wdXQgaWQ9XCIiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrIl9pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgdmFsdWU9XCIiKyB0aGlzLmdldFN0YXRlKCkuZGF0YUNvbHVtbkxpc3RbaV0gKyAiXCIiICsgY2hlY2tlZCArICI+ICIrIHRoaXMuZ2V0U3RhdGUoKS5kYXRhQ29sdW1uTGlzdFtpXSArICI8L2xhYmVsPlxuIjsKKwkJfQorCQl2YXIgdHJlZW1hcCA9IGQzLmxheW91dC50cmVlbWFwKCkKKwkJLnNpemUoW3dpZHRoLCBoZWlnaHRdKQorCQkuc3RpY2t5KHRydWUpCisJCS52YWx1ZShmdW5jdGlvbiAoZCkgeworCQkJcmV0dXJuIGV2YWwoImQuIiArIHByZVZhbHVlTGFiZWwpOworCQl9KTsKKy8vCQlhbGVydCgiZGF0YUNvbHVtbjogIiArIGRhdGFDb2x1bW4pOworCQljeEQzVHJlZU1hcEpzSFRNTFJvb3RDb21wb25lbnQuaW5uZXJIVE1MID0gCSI8Zm9ybT5cbiIgKworCQkJCQkJZGF0YUNvbHVtbiArCisJCQkJCQkiPC9mb3JtPlxuIiArCisJCQkJCQkiPGRpdiBpZD1cIiIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCsiX2RpdlwiPiIgKyAiPC9kaXY+IjsKKwkJCXZhciBjeEQzVHJlZU1hcEpzSFRNTFJvb3RDb21wb25lbnRTZWxlY3Rpb24gPSBkMy5zZWxlY3QoY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50KS5zZWxlY3QoIiMiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrIl9kaXYiKTsKKy8vCQkJYWxlcnQoInNlbGVjdGlvbjogIiArIHNlbGVjdGlvbik7CisJCQl2YXIgY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50RGl2ID0gY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50U2VsZWN0aW9uLmFwcGVuZCgiZGl2IikKKwkJCQkJCQkgICAgLnN0eWxlKCJwb3NpdGlvbiIsICJyZWxhdGl2ZSIpCisJCQkJCQkJCS5zdHlsZSgid2lkdGgiLCAod2lkdGggKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCkgKyAicHgiKQorCQkJCQkJCQkuc3R5bGUoImhlaWdodCIsIChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkgKyAicHgiKQorCQkJCQkJCSAgICAuc3R5bGUoImxlZnQiLCBtYXJnaW4ubGVmdCArICJweCIpCisJCQkJCQkJICAgIC5zdHlsZSgidG9wIiwgbWFyZ2luLnRvcCArICJweCIpOworCQkJCisJCQlqc29uVHJlZU1hcEZ1bmN0aW9uID0gZnVuY3Rpb24oanNvbk9iaikgeworCQkJCXZhciBub2RlID0gY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50RGl2LmRhdHVtKGpzb25PYmopLnNlbGVjdEFsbCgiLm5vZGUiKQorCQkJCS5kYXRhKHRyZWVtYXAubm9kZXMpCisJCQkJLmVudGVyKCkuYXBwZW5kKCJkaXYiKQorCQkJCS5hdHRyKCJjbGFzcyIsICJub2RlIikKKwkJCQkuYXR0cigidGl0bGUiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuID8gIiIgOiBkLnRvb2x0aXBOYW1lICsgIlxuIiArIHByZVZhbHVlTGFiZWwgKyAiOiAiICsgZXZhbCgiZC4iICsgcHJlVmFsdWVMYWJlbCk7IH0pCisJCQkJLmNhbGwocG9zaXRpb24pCisJCQkJLnN0eWxlKCJiYWNrZ3JvdW5kIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/IGNvbG9yKGQubmFtZSkgOiBudWxsOyB9KQorLy8JCQkJCSAgICAgIC5zdHlsZSgiYmFja2dyb3VuZCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuY2hpbGRyZW4gPyBkMy5yZ2IoInJlZCIpIDogbnVsbDsgfSkKKwkJCQkudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuID8gbnVsbCA6IGQubmFtZTsgfSk7CisJCQkJCisJCQkJZDMuc2VsZWN0KGN4RDNUcmVlTWFwSnNIVE1MUm9vdENvbXBvbmVudCkuc2VsZWN0QWxsKCIjIitjeEQzVHJlZU1hcEpzQ29tcG9uZW50SHRtbFRhZ0lkKyJfaW5wdXQiKS5vbigiY2hhbmdlIiwgZnVuY3Rpb24gY2hhbmdlKCkgeworCQkJCQl2YXIgdmFsdWVMYWJlbCA9IHRoaXMudmFsdWU7CisvLwkJCQkgICAgYWxlcnQoInZhbHVlT3V0OiAiICsgdmFsdWVPdXQpOworCQkJCSAgICB2YXIgdmFsdWUgPSB0aGlzLnZhbHVlID09PSAiY291bnQiCisJCQkJICAgICAgICA/IGZ1bmN0aW9uKCkgeyByZXR1cm4gMTsgfQorCQkJCSAgICAgICAgOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZXZhbCgiZC4iICsgdmFsdWVMYWJlbCk7IH07CisJCS8vCQkJCSAgICAgICAgOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5zaXplOyB9OworCQkJCQkgIAorCQkJCQkgICAgbm9kZS5kYXRhKHRyZWVtYXAudmFsdWUodmFsdWUpLm5vZGVzKQorCQkJCQkgICAgICAJLmF0dHIoInRpdGxlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/ICIiIDogZC50b29sdGlwTmFtZSArICJcbiIgKyB2YWx1ZUxhYmVsICsgIjogIiArIGV2YWwoImQuIiArIHZhbHVlTGFiZWwpOyB9KQorCQkJCQkgICAgICAJLnRyYW5zaXRpb24oKQorCQkJCQkgICAgICAgIC5kdXJhdGlvbigxNTAwKQorCQkJCQkgICAgICAgIC5jYWxsKHBvc2l0aW9uKTsKKwkJCQkJICB9KTsKKwkJCX0KKwkJCQorCQkJdmFyIGpzb25TdHJpbmcgPSB0aGlzLmdldFN0YXRlKCkuanNvbkRhdGE7CisJCQlqc29uVHJlZU1hcEZ1bmN0aW9uKEpTT04ucGFyc2UoanNvblN0cmluZykpOworCX0KKwkJJycnKQorCX0KKwkKKwlkZWYgdm9pZCBnZW5lcmF0ZUNvbGxUcmVlSnNGaWxlKFN0cmluZ0J1aWxkZXIgc3RyQnVpbGRlciwgU3RyaW5nIGNoYXJ0SmF2YUZpbGVOYW1lKXsKKwkJc3RyQnVpbGRlci5hcHBlbmQoJycnwqtjaGFydEphdmFGaWxlTmFtZcK7ID0gZnVuY3Rpb24oKSB7CisJCisJdmFyIG1hcmdpbiA9IHt0b3A6IDIwLCByaWdodDogMTIwLCBib3R0b206IDIwLCBsZWZ0OiAxMjB9LAorICAgIHdpZHRoID0gMTQ2MCAtIG1hcmdpbi5yaWdodCAtIG1hcmdpbi5sZWZ0LAorICAgIGhlaWdodCA9IDEwMDAgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTsKKyAgICAKKwl2YXIgaSA9IDAsCisJICAgIGR1cmF0aW9uID0gNzUwLAorCSAgICBjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290OworCQorCXZhciB0cmVlID0gZDMubGF5b3V0LnRyZWUoKQorCSAgICAuc2l6ZShbaGVpZ2h0LCB3aWR0aF0pOworCQorCXZhciBkaWFnb25hbCA9IGQzLnN2Zy5kaWFnb25hbCgpCisJICAgIC5wcm9qZWN0aW9uKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFtkLnksIGQueF07IH0pOworCQorCXZhciBjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnQgPSB0aGlzLmdldEVsZW1lbnQoKTsKKwljeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnQuaW5uZXJIVE1MID0gCQorCQkJCQkiPGxhYmVsPjxpbnB1dCBpZD1cIiIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCsiX2lucHV0XCIgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm1vZGVcIiB2YWx1ZT1cImV4cGFuZFwiPkV4cGFuZDwvbGFiZWw+XG4iICsKKwkJCQkJIjxsYWJlbD48aW5wdXQgaWQ9XCIiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrIl9pbnB1dFwiIHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJtb2RlXCIgdmFsdWU9XCJjb2xsYXBzZVwiIGNoZWNrZWQ+Q29sbGFwc2U8L2xhYmVsPlxuIiArCisJCQkJCSI8ZGl2IGlkPVwiIit0aGlzLmdldFN0YXRlKCkuaHRtbFRhZ0lkKyJfZGl2XCI+IiArICI8L2Rpdj4iOwkKKwkKKwl2YXIgY3hEM1RyZWVKc0hUTUxSb290Q29tcG9uZW50U2VsZWN0aW9uID0gZDMuc2VsZWN0KGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudCkuc2VsZWN0KCIjIit0aGlzLmdldFN0YXRlKCkuaHRtbFRhZ0lkKyJfZGl2Iik7CisJCisJdmFyIGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudFN2ZyA9IGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudFNlbGVjdGlvbi5hcHBlbmQoInN2ZyIpCisJICAgIC5hdHRyKCJ3aWR0aCIsIHdpZHRoICsgbWFyZ2luLnJpZ2h0ICsgbWFyZ2luLmxlZnQpCisJICAgIC5hdHRyKCJoZWlnaHQiLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkKKwkgIC5hcHBlbmQoImciKQorCSAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgbWFyZ2luLmxlZnQgKyAiLCIgKyBtYXJnaW4udG9wICsgIikiKTsKKworCWZ1bmN0aW9uIGNvbGxhcHNlKGQpIHsKKwkJaWYgKGQuY2hpbGRyZW4pIHsKKwkJCWQuX2NoaWxkcmVuID0gZC5jaGlsZHJlbjsKKwkJCWQuX2NoaWxkcmVuLmZvckVhY2goY29sbGFwc2UpOworCQkJZC5jaGlsZHJlbiA9IG51bGw7CisJCX0KKwl9CisJCisJZnVuY3Rpb24gZXhwYW5kKGQpIHsKKwkJaWYgKGQuX2NoaWxkcmVuKSB7CisJCQlkLmNoaWxkcmVuID0gZC5fY2hpbGRyZW47CisJCQlkLmNoaWxkcmVuLmZvckVhY2goZXhwYW5kKTsKKwkJCWQuX2NoaWxkcmVuID0gbnVsbDsKKwkJfQorCX0KKwkKKwlqc29uVHJlZUZ1bmN0aW9uID0gZnVuY3Rpb24oanNvbkRhdGEpIHsKKwkJY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdCA9IGpzb25EYXRhOworCQljeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290LngwID0gaGVpZ2h0IC8gMjsKKwkJY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdC55MCA9IDA7CisJCQorCQkKKwkJICBjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290LmNoaWxkcmVuLmZvckVhY2goY29sbGFwc2UpOworCQkgIHVwZGF0ZShjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290KTsKKwkJfQorCQorCWpzb25UcmVlRnVuY3Rpb24oSlNPTi5wYXJzZSh0aGlzLmdldFN0YXRlKCkuanNvbkRhdGEpKTsKKworCWQzLnNlbGVjdChjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnQpLnNlbGVjdChzZWxmLmZyYW1lRWxlbWVudCkuc3R5bGUoImhlaWdodCIsICI4MDBweCIpOworCQorCWQzLnNlbGVjdChjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnQpLnNlbGVjdEFsbCgiIyIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCsiX2lucHV0Iikub24oImNoYW5nZSIsIGZ1bmN0aW9uIGNoYW5nZSgpIHsKKy8vCQlhbGVydCgidGhpcy52YWx1ZSA9ICIgKyB0aGlzLnZhbHVlKTsKKwkgICAgaWYgKHRoaXMudmFsdWUgPT09ICJleHBhbmQiKXsKKwkgICAgCWN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QuY2hpbGRyZW4uZm9yRWFjaChleHBhbmQpOworCSAgICB9IGVsc2UgeworCSAgICAJY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTsKKwkgICAgfQorCSAgICB1cGRhdGUoY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdCk7CisJfSk7CisKKwlmdW5jdGlvbiB1cGRhdGUoc291cmNlKSB7CisKKwkgIC8vIENvbXB1dGUgdGhlIG5ldyB0cmVlIGxheW91dC4KKwkgIHZhciBub2RlcyA9IHRyZWUubm9kZXMoY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdCkucmV2ZXJzZSgpLAorCSAgICAgIGxpbmtzID0gdHJlZS5saW5rcyhub2Rlcyk7CisKKwkgIC8vIE5vcm1hbGl6ZSBmb3IgZml4ZWQtZGVwdGguCisJICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsgZC55ID0gZC5kZXB0aCAqIDE4MDsgfSk7CisKKwkgIC8vIFVwZGF0ZSB0aGUgbm9kZXPigqzCpgorCSAgdmFyIG5vZGUgPSBjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnRTdmcuc2VsZWN0QWxsKCJnLm5vZGUiKQorCSAgICAgIC5kYXRhKG5vZGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmlkIHx8IChkLmlkID0gKytpKTsgfSk7CisKKwkgIC8vIEVudGVyIGFueSBuZXcgbm9kZXMgYXQgdGhlIHBhcmVudCdzIHByZXZpb3VzIHBvc2l0aW9uLgorCSAgdmFyIG5vZGVFbnRlciA9IG5vZGUuZW50ZXIoKS5hcHBlbmQoImciKQorCSAgICAgIC5hdHRyKCJjbGFzcyIsICJub2RlIikKKwkgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgc291cmNlLnkwICsgIiwiICsgc291cmNlLngwICsgIikiOyB9KQorCSAgICAgIC5vbigiY2xpY2siLCBjbGljayk7CisKKwkgIG5vZGVFbnRlci5hcHBlbmQoImNpcmNsZSIpCisJICAgICAgLmF0dHIoInIiLCAxZS02KQorCSAgICAgIC5zdHlsZSgiZmlsbCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuX2NoaWxkcmVuID8gImxpZ2h0c3RlZWxibHVlIiA6ICIjZmZmIjsgfSk7CisKKwkgIG5vZGVFbnRlci5hcHBlbmQoInRleHQiKQorCSAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiB8fCBkLl9jaGlsZHJlbiA/IC0xMCA6IDEwOyB9KQorCSAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCisJICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiB8fCBkLl9jaGlsZHJlbiA/ICJlbmQiIDogInN0YXJ0IjsgfSkKKwkgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLm5hbWU7IH0pCisJICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCAxZS02KTsKKworCSAgLy8gVHJhbnNpdGlvbiBub2RlcyB0byB0aGVpciBuZXcgcG9zaXRpb24uCisJICB2YXIgbm9kZVVwZGF0ZSA9IG5vZGUudHJhbnNpdGlvbigpCisJICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQorCSAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiAidHJhbnNsYXRlKCIgKyBkLnkgKyAiLCIgKyBkLnggKyAiKSI7IH0pOworCisJICBub2RlVXBkYXRlLnNlbGVjdCgiY2lyY2xlIikKKwkgICAgICAuYXR0cigiciIsIDQuNSkKKwkgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLl9jaGlsZHJlbiA/ICJsaWdodHN0ZWVsYmx1ZSIgOiAiI2ZmZiI7IH0pOworCisJICBub2RlVXBkYXRlLnNlbGVjdCgidGV4dCIpCisJICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCAxKTsKKworCSAgLy8gVHJhbnNpdGlvbiBleGl0aW5nIG5vZGVzIHRvIHRoZSBwYXJlbnQncyBuZXcgcG9zaXRpb24uCisJICB2YXIgbm9kZUV4aXQgPSBub2RlLmV4aXQoKS50cmFuc2l0aW9uKCkKKwkgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCisJICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHNvdXJjZS55ICsgIiwiICsgc291cmNlLnggKyAiKSI7IH0pCisJICAgICAgLnJlbW92ZSgpOworCisJICBub2RlRXhpdC5zZWxlY3QoImNpcmNsZSIpCisJICAgICAgLmF0dHIoInIiLCAxZS02KTsKKworCSAgbm9kZUV4aXQuc2VsZWN0KCJ0ZXh0IikKKwkgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDFlLTYpOworCisJICAvLyBVcGRhdGUgdGhlIGxpbmtz4oKswqYKKwkgIHZhciBsaW5rID0gY3hEM1RyZWVKc0hUTUxSb290Q29tcG9uZW50U3ZnLnNlbGVjdEFsbCgicGF0aC5saW5rIikKKwkgICAgICAuZGF0YShsaW5rcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50YXJnZXQuaWQ7IH0pOworCisJICAvLyBFbnRlciBhbnkgbmV3IGxpbmtzIGF0IHRoZSBwYXJlbnQncyBwcmV2aW91cyBwb3NpdGlvbi4KKwkgIGxpbmsuZW50ZXIoKS5pbnNlcnQoInBhdGgiLCAiZyIpCisJICAgICAgLmF0dHIoImNsYXNzIiwgImxpbmsiKQorCSAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24oZCkgeworCSAgICAgICAgdmFyIG8gPSB7eDogc291cmNlLngwLCB5OiBzb3VyY2UueTB9OworCSAgICAgICAgcmV0dXJuIGRpYWdvbmFsKHtzb3VyY2U6IG8sIHRhcmdldDogb30pOworCSAgICAgIH0pOworCisJICAvLyBUcmFuc2l0aW9uIGxpbmtzIHRvIHRoZWlyIG5ldyBwb3NpdGlvbi4KKwkgIGxpbmsudHJhbnNpdGlvbigpCisJICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQorCSAgICAgIC5hdHRyKCJkIiwgZGlhZ29uYWwpOworCisJICAvLyBUcmFuc2l0aW9uIGV4aXRpbmcgbm9kZXMgdG8gdGhlIHBhcmVudCdzIG5ldyBwb3NpdGlvbi4KKwkgIGxpbmsuZXhpdCgpLnRyYW5zaXRpb24oKQorCSAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKKwkgICAgICAuYXR0cigiZCIsIGZ1bmN0aW9uKGQpIHsKKwkgICAgICAgIHZhciBvID0ge3g6IHNvdXJjZS54LCB5OiBzb3VyY2UueX07CisJICAgICAgICByZXR1cm4gZGlhZ29uYWwoe3NvdXJjZTogbywgdGFyZ2V0OiBvfSk7CisJICAgICAgfSkKKwkgICAgICAucmVtb3ZlKCk7CisKKwkgIC8vIFN0YXNoIHRoZSBvbGQgcG9zaXRpb25zIGZvciB0cmFuc2l0aW9uLgorCSAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CisJICAgIGQueDAgPSBkLng7CisJICAgIGQueTAgPSBkLnk7CisJICB9KTsKKwl9CisKKwkvLyBUb2dnbGUgY2hpbGRyZW4gb24gY2xpY2suCisJZnVuY3Rpb24gY2xpY2soZCkgeworCSAgaWYgKGQuY2hpbGRyZW4pIHsKKwkgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuOworCSAgICBkLmNoaWxkcmVuID0gbnVsbDsKKwkgIH0gZWxzZSB7CisJICAgIGQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjsKKwkgICAgZC5fY2hpbGRyZW4gPSBudWxsOworCSAgfQorCSAgdXBkYXRlKGQpOworCX0KKworfQorJycnKQorCX0KKwkJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0QzSnNKYXZhVXRpbC54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvanZtbW9kZWwvRDNKc0phdmFVdGlsLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYmIwM2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0QzSnNKYXZhVXRpbC54dGVuZApAQCAtMCwwICsxLDk4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuanZtbW9kZWwKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZQoraW1wb3J0IGphdmF4LmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuSVF1YWxpZmllZE5hbWVQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRQYWNrYWdlCisKK2NsYXNzIEQzSnNKYXZhVXRpbCB7CisJCisJQEluamVjdCBleHRlbnNpb24gSVF1YWxpZmllZE5hbWVQcm92aWRlcgorCisJZGVmIENoYXJ0VHJlZSBnZXRDaGFydFRyZWVNYXAoQ2hhcnQgY2hhcnQpeworCQlpZiAoY2hhcnQuY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKXsKKwkJCXJldHVybiBjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRUcmVlCisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQkKKwkKKwlkZWYgU3RyaW5nIGNyZWF0ZUZpbGVuYW1lUG9zdEZpeChDaGFydCBjaGFydCl7CisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpeworCQkJdmFsIENoYXJ0VHJlZSBjaGFydFRyZWUgPSBjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRUcmVlCisJCQlpZiAoY2hhcnRUcmVlLm1hcCl7CisJCQkJcmV0dXJuICJUcmVlTWFwIgorCQkJfSBlbHNlIGlmIChjaGFydFRyZWUuY29sbGFwc2libGUpIHsKKwkJCQlyZXR1cm4gIkNvbGxhcHNpYmxlVHJlZSIKKwkJCX0KKwkJfQorCQlyZXR1cm4gIiIKKwl9CisJCQorCWRlZiBib29sZWFuIGlzVHJlZU1hcChDaGFydCBjaGFydCl7CisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpeworCQkJdmFsIENoYXJ0VHJlZSBjaGFydFRyZWUgPSBjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRUcmVlCisJCQlpZiAoY2hhcnRUcmVlLm1hcCl7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKwkKKwlkZWYgYm9vbGVhbiBpc0NvbGxhcHNpYmxlVHJlZShDaGFydCBjaGFydCl7CisJCWlmIChjaGFydC5jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpeworCQkJdmFsIENoYXJ0VHJlZSBjaGFydFRyZWUgPSBjaGFydC5jaGFydHR5cGUgYXMgQ2hhcnRUcmVlCisJCQlpZiAoY2hhcnRUcmVlLmNvbGxhcHNpYmxlKXsKKwkJCQlyZXR1cm4gdHJ1ZTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXByaXZhdGUgZGVmIFN0cmluZyBjcmVhdGVmdWxseVF1YWxpZmllZEZpbGVuYW1lKENoYXJ0IGNoYXJ0KXsKKwkJdmFyIHBja2cgPSBjaGFydC5lQ29udGFpbmVyIGFzIENoYXJ0UGFja2FnZQorCQlyZXR1cm4gcGNrZy5uYW1lLnRvU3RyaW5nLmNvbmNhdCgiLiIpLmNvbmNhdChjaGFydC5uYW1lLnRvU3RyaW5nKS5jb25jYXQoY2hhcnQuY3JlYXRlRmlsZW5hbWVQb3N0Rml4KQorCX0KKwkKKwlwcml2YXRlIGRlZiBTdHJpbmcgY3JlYXRlRmlsZW5hbWUoQ2hhcnQgY2hhcnQpeworCQlyZXR1cm4gY2hhcnQubmFtZS50b1N0cmluZy5jb25jYXQoY2hhcnQuY3JlYXRlRmlsZW5hbWVQb3N0Rml4KQorCX0KKwkKKwlkZWYgU3RyaW5nIGNyZWF0ZUNoYXJ0RmlsZW5hbWUoQ2hhcnQgY2hhcnQpeworCQlyZXR1cm4gY2hhcnQuY3JlYXRlRmlsZW5hbWUuY29uY2F0KCJKc0NoYXJ0IikKKwl9CisJCisJZGVmIFN0cmluZyBjcmVhdGVmdWxseVF1YWxpZmllZENoYXJ0RmlsZW5hbWUoQ2hhcnQgY2hhcnQpeworCQlyZXR1cm4gY2hhcnQuY3JlYXRlZnVsbHlRdWFsaWZpZWRGaWxlbmFtZS5jb25jYXQoIkpzQ2hhcnQiKQorCX0KKwkKKwlkZWYgU3RyaW5nIGNyZWF0ZUNoYXJ0SnNGaWxlbmFtZShDaGFydCBjaGFydCl7CisJCXJldHVybiBjaGFydC5jcmVhdGVGaWxlbmFtZS5jb25jYXQoIi5qcyIpCisJfQorCQorCWRlZiBTdHJpbmcgY3JlYXRlZnVsbHlRdWFsaWZpZWRTdGF0ZUZpbGVuYW1lKENoYXJ0IGNoYXJ0KXsKKwkJcmV0dXJuIGNoYXJ0LmNyZWF0ZWZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUuY29uY2F0KCJKc1N0YXRlIikKKwl9CisJCisJZGVmIFN0cmluZyBjcmVhdGVTdGF0ZUZpbGVuYW1lKENoYXJ0IGNoYXJ0KXsKKwkJcmV0dXJuIGNoYXJ0LmNyZWF0ZUZpbGVuYW1lLmNvbmNhdCgiSnNTdGF0ZSIpCisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9zY29waW5nL0NoYXJ0U2NvcGVQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2NvcGluZy9DaGFydFNjb3BlUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM1N2Y5OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2NvcGluZy9DaGFydFNjb3BlUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5zY29waW5nCisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuQXhpc0VudW0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0QXhpcworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRDdWJlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEVudGl0eQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRNZW1iZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0T3duZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0VGFzaworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuanZtbW9kZWwuRGF0YW1hcnREU0xKdm1Nb2RlbEluZmVycmVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuRU9iamVjdERlc2NyaXB0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUVPYmplY3REZXNjcmlwdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5pbXBsLk1hcEJhc2VkU2NvcGUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyCisKK2NsYXNzIENoYXJ0U2NvcGVQcm92aWRlciBleHRlbmRzIFhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyIHsKKwkKKwlASW5qZWN0IGV4dGVuc2lvbiBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgZGF0YW1hcnRJbmZlcnJlcgorCQorCUBPdmVycmlkZQorCW92ZXJyaWRlIElTY29wZSBnZXRTY29wZShFT2JqZWN0IGNvbnRleHQsIEVSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisJCWlmIChyZWZlcmVuY2UgPT0gQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0FYSVNfX0FYSVMpIHsKKwkJCXJldHVybiBnZXRTY29wZV9DaGFydF9BeGlzX2F4aXMoY29udGV4dCkKKwkJfQorCQlyZXR1cm4gc3VwZXIuZ2V0U2NvcGUoY29udGV4dCwgcmVmZXJlbmNlKQorCX0KKwkKKwlkZWYgSVNjb3BlIGdldFNjb3BlX0NoYXJ0X0F4aXNfYXhpcyhFT2JqZWN0IG9iamVjdCkgeworCQl2YXIgcmVzdWx0ID0gPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0CisJCXZhciBlT2JqID0gb2JqZWN0CisJCXdoaWxlICghKGVPYmogaW5zdGFuY2VvZiBDaGFydERhdGFtYXJ0KSkgeworCQkJZU9iaiA9IGVPYmouZUNvbnRhaW5lcgorCQl9CisJCWlmIChlT2JqICE9IG51bGwpIHsKKwkJCXZhciBkYXRhbWFydCA9IChlT2JqIGFzIENoYXJ0RGF0YW1hcnQpLmRhdGFtYXJ0UmVmCisJCQlpZiAoZGF0YW1hcnQgIT0gbnVsbCAmJiBkYXRhbWFydC5zb3VyY2UgIT0gbnVsbCkgeworCQkJCWlmIChkYXRhbWFydC5zb3VyY2UgaW5zdGFuY2VvZiBEYXRhbWFydEN1YmUpIHsKKwkJCQkJZm9yIChheGlzIDogKGRhdGFtYXJ0LnNvdXJjZSBhcyBEYXRhbWFydEN1YmUpLmF4aXNzbGljZXIpIHsKKwkJCQkJCWlmIChheGlzIGluc3RhbmNlb2YgRGF0YW1hcnRBeGlzKSB7CisJCQkJCQkJdmFyIGxpdGVyYWwgPSAoYXhpcyBhcyBEYXRhbWFydEF4aXMpLm5hbWUubGl0ZXJhbAorCQkJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShsaXRlcmFsLCAoYXhpcyBhcyBEYXRhbWFydEF4aXMpKSkKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZGF0YW1hcnQuc291cmNlIGluc3RhbmNlb2YgRGF0YW1hcnRFbnRpdHkpIHsKKwkJCQkJZ2V0RW50aXR5QXhlcyhkYXRhbWFydC5zb3VyY2UgYXMgRGF0YW1hcnRFbnRpdHksIHJlc3VsdCkKKwkJCQl9IGVsc2UgaWYgKGRhdGFtYXJ0LnNvdXJjZSBpbnN0YW5jZW9mIERhdGFtYXJ0VGFzaykgeworCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoQXhpc0VudW0uQ09MVU1OUy5saXRlcmFsLCAoZGF0YW1hcnQuc291cmNlIGFzIERhdGFtYXJ0VGFzaykpKQorCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoQXhpc0VudW0uUk9XUy5saXRlcmFsLCAoZGF0YW1hcnQuc291cmNlIGFzIERhdGFtYXJ0VGFzaykpKQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpCisJfQorCQorCWRlZiB2b2lkIGdldEVudGl0eUF4ZXMoRGF0YW1hcnRFbnRpdHkgZW50aXR5LCBBcnJheUxpc3Q8SUVPYmplY3REZXNjcmlwdGlvbj4gcmVzdWx0KSB7CisJCWZvciAobmF2aWdhdGlvbiA6IGVudGl0eS5uYXZpZ2F0aW9ucykgeworCQkJaWYgKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE1lbWJlcikgeworCQkJCShuYXZpZ2F0aW9uIGFzIERhdGFtYXJ0TWVtYmVyKS5kYXRhbWFydEVudGl0eS5nZXRFbnRpdHlBeGVzKHJlc3VsdCkKKwkJCQlmb3IgKHByb3BlcnR5IDogKG5hdmlnYXRpb24gYXMgRGF0YW1hcnRNZW1iZXIpLmRhdGFtYXJ0RW50aXR5LnByb3BlcnRpZXMpIHsKKwkJCQkJcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKHByb3BlcnR5LmF4aXMubGl0ZXJhbCwgcHJvcGVydHkpKQorCQkJCX0KKwkJCX0KKwkJCWlmIChuYXZpZ2F0aW9uIGluc3RhbmNlb2YgRGF0YW1hcnRPd25lcikgeworCQkJCShuYXZpZ2F0aW9uIGFzIERhdGFtYXJ0T3duZXIpLmRhdGFtYXJ0RW50aXR5LmdldEVudGl0eUF4ZXMocmVzdWx0KQorCQkJCWZvciAocHJvcGVydHkgOiAobmF2aWdhdGlvbiBhcyBEYXRhbWFydE93bmVyKS5kYXRhbWFydEVudGl0eS5wcm9wZXJ0aWVzKSB7CisJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShwcm9wZXJ0eS5heGlzLmxpdGVyYWwsIHByb3BlcnR5KSkKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChwcm9wZXJ0eSA6IGVudGl0eS5wcm9wZXJ0aWVzKSB7CisJCQlpZiAocHJvcGVydHkuYXhpcyAhPSBudWxsKSB7CisJCQkJcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKHByb3BlcnR5LmF4aXMubGl0ZXJhbCwgcHJvcGVydHkpKQorCQkJfSBlbHNlIHsKKwkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUocHJvcGVydHkuYXhpcy5saXRlcmFsLCBwcm9wZXJ0eSkpCisJCQl9CisJCX0KKwl9CisKKwlkZWYgdm9pZCBnZXRFbnRpdHlQcm9wZXJ0aWVzKERhdGFtYXJ0RW50aXR5IGVudGl0eSwgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCwgU3RyaW5nIHJlcXVlc3RlZEF4aXNOYW1lKSB7CisJCWZvciAobmF2aWdhdGlvbiA6IGVudGl0eS5uYXZpZ2F0aW9ucykgeworCQkJaWYgKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE1lbWJlcikgeworCQkJCShuYXZpZ2F0aW9uIGFzIERhdGFtYXJ0TWVtYmVyKS5kYXRhbWFydEVudGl0eS5nZXRFbnRpdHlQcm9wZXJ0aWVzKHJlc3VsdCxyZXF1ZXN0ZWRBeGlzTmFtZSkKKwkJCQlmb3IgKHByb3BlcnR5IDogKG5hdmlnYXRpb24gYXMgRGF0YW1hcnRNZW1iZXIpLmRhdGFtYXJ0RW50aXR5LnByb3BlcnRpZXMpIHsKKwkJCQkJaWYgKHByb3BlcnR5LmF4aXMubGl0ZXJhbC5lcXVhbHMocmVxdWVzdGVkQXhpc05hbWUpKSB7CisJCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKG51bGwpLCBwcm9wZXJ0eS5wcm9wZXJ0eVJlZikpCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlpZiAobmF2aWdhdGlvbiBpbnN0YW5jZW9mIERhdGFtYXJ0T3duZXIpIHsKKwkJCQkobmF2aWdhdGlvbiBhcyBEYXRhbWFydE93bmVyKS5kYXRhbWFydEVudGl0eS5nZXRFbnRpdHlQcm9wZXJ0aWVzKHJlc3VsdCxyZXF1ZXN0ZWRBeGlzTmFtZSkKKwkJCQlmb3IgKHByb3BlcnR5IDogKG5hdmlnYXRpb24gYXMgRGF0YW1hcnRPd25lcikuZGF0YW1hcnRFbnRpdHkucHJvcGVydGllcykgeworCQkJCQlpZiAocHJvcGVydHkuYXhpcy5saXRlcmFsLmVxdWFscyhyZXF1ZXN0ZWRBeGlzTmFtZSkpIHsKKwkJCQkJCXJlc3VsdC5hZGQoRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUobnVsbCksIHByb3BlcnR5LnByb3BlcnR5UmVmKSkKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKHByb3BlcnR5IDogZW50aXR5LnByb3BlcnRpZXMpIHsKKwkJCWlmIChwcm9wZXJ0eS5heGlzICE9IG51bGwpIHsKKwkJCQlpZiAocHJvcGVydHkuYXhpcy5saXRlcmFsLmVxdWFscyhyZXF1ZXN0ZWRBeGlzTmFtZSkpIHsKKwkJCQkJcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZShudWxsKSwgcHJvcGVydHkucHJvcGVydHlSZWYpKQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmVzdWx0LmFkZChFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZShudWxsKSwgcHJvcGVydHkucHJvcGVydHlSZWYpKQorCQkJfQorCQl9CisJfQorfQorCQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWxpZGF0aW9uL0NoYXJ0RFNMVmFsaWRhdG9yLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWxpZGF0aW9uL0NoYXJ0RFNMVmFsaWRhdG9yLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ODFlOGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3ZhbGlkYXRpb24vQ2hhcnREU0xWYWxpZGF0b3IueHRlbmQKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnZhbGlkYXRpb24KKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnREU0xQYWNrYWdlCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5DaGVjaworCisvL2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkNoZWNrCisKKy8qKgorICogQ3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuIAorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCN2YWxpZGF0aW9uCisgKi8KK2NsYXNzIENoYXJ0RFNMVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFydERTTFZhbGlkYXRvciB7CisKKy8vICBwdWJsaWMgc3RhdGljIHZhbCBJTlZBTElEX05BTUUgPSAnaW52YWxpZE5hbWUnCisvLworLy8JQENoZWNrCisvLwlkZWYgY2hlY2tHcmVldGluZ1N0YXJ0c1dpdGhDYXBpdGFsKEdyZWV0aW5nIGdyZWV0aW5nKSB7CisvLwkJaWYgKCFDaGFyYWN0ZXIuaXNVcHBlckNhc2UoZ3JlZXRpbmcubmFtZS5jaGFyQXQoMCkpKSB7CisvLwkJCXdhcm5pbmcoJ05hbWUgc2hvdWxkIHN0YXJ0IHdpdGggYSBjYXBpdGFsJywgCisvLwkJCQkJTXlEc2xQYWNrYWdlLkxpdGVyYWxzLkdSRUVUSU5HX19OQU1FLAorLy8JCQkJCUlOVkFMSURfTkFNRSkKKy8vCQl9CisvLwl9CisKKwlAQ2hlY2sKKwlkZWYgdm9pZCBjaGVja0R1cGxpY2F0ZUNoYXJ0TmFtZXMoQ2hhcnQgY2hhcnQpeyAKKwkJdmFyIGVPYmogPSBjaGFydC5lQ29udGFpbmVyKCkKKwkJd2hpbGUgKCEoZU9iaiBpbnN0YW5jZW9mIENoYXJ0UGFja2FnZSkpIHsKKwkJCWVPYmogPSBlT2JqLmVDb250YWluZXIKKwkJfQorCQlpZiAoZU9iaiE9bnVsbCl7CisJCQl2YXIgY2hhcnRQYWNrYWdlID0gZU9iaiBhcyBDaGFydFBhY2thZ2U7CisJCQlpZiAoZmluZER1cGxpY2F0ZUNoYXJ0TmFtZXMoY2hhcnRQYWNrYWdlLmNoYXJ0cywgY2hhcnQuZ2V0TmFtZSgpKSAhPSBudWxsKXsKKwkJCQllcnJvcigiRHVwbGljYXRlIGNoYXJ0IG5hbWUgJyIuY29uY2F0KGNoYXJ0LmdldE5hbWUoKSkuY29uY2F0KCInISIpLCBDaGFydERTTFBhY2thZ2UuTGl0ZXJhbHMuQ0hBUlRfQkFTRV9fTkFNRSkKKwkJCX0KKwkJfQorCX0KKwkJCisJZGVmIHByaXZhdGUgQ2hhcnQgZmluZER1cGxpY2F0ZUNoYXJ0TmFtZXMoCisJCQlFTGlzdDxDaGFydD4gY2hhcnRzLCBTdHJpbmcgY2hhcnROYW1lKSB7CisJCXZhciB0ZW1wU2V0ID0gPFN0cmluZz5uZXdIYXNoU2V0KCkKKwkJZm9yIChDaGFydCBjaGFydCA6IGNoYXJ0cyl7CisJCSAgIGlmICghdGVtcFNldC5hZGQoY2hhcnQubmFtZSkgJiYgKGNoYXJ0Lm5hbWUuZXF1YWxzKGNoYXJ0TmFtZSkpKXsKKwkJCSAgIHJldHVybiBjaGFydAorCQkgICB9CisJCX0KKwkJcmV0dXJuIG51bGwKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdmFsdWVjb252ZXJ0ZXIvQ2hhcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdmFsdWVjb252ZXJ0ZXIvQ2hhcnRRdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDZjMjA2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWx1ZWNvbnZlcnRlci9DaGFydFF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudmFsdWVjb252ZXJ0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lQ29udmVydGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5vZGVtb2RlbC5JTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5ub2RlbW9kZWwudXRpbC5Ob2RlTW9kZWxVdGlsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLlhiYXNlUXVhbGlmaWVkTmFtZVByb3ZpZGVyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBDaGFydFF1YWxpZmllZE5hbWVQcm92aWRlciBleHRlbmRzIFhiYXNlUXVhbGlmaWVkTmFtZVByb3ZpZGVyIHsKKworCUBJbmplY3QKKwlwcml2YXRlIElRdWFsaWZpZWROYW1lQ29udmVydGVyIHF1YWxpZmllZE5hbWVDb252ZXJ0ZXI7CisKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUXVhbGlmaWVkTmFtZSBnZXRGdWxseVF1YWxpZmllZE5hbWUoRU9iamVjdCBvYmopIHsKKwkJaWYgKG9iaiA9PSBudWxsKSB7CisJCQlyZXR1cm4gUXVhbGlmaWVkTmFtZS5jcmVhdGUoIiIpOworCQl9CisJCWlmIChvYmogaW5zdGFuY2VvZiBDaGFydCkgeworCQkJQ2hhcnQgY2hhcnQgPSAoQ2hhcnQpIG9iajsKKyAgICAgICAgICAgIGlmIChjaGFydC5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgCXJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZE5hbWVDb252ZXJ0ZXIudG9RdWFsaWZpZWROYW1lKGNoYXJ0LmdldE5hbWUoKSk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShvYmopOworCX0KKworCS8vIHRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgY3Jvc3MgcmVmZXJlbmNlZCBuYW1lIG9mIGFuIG9iamVjdCB3aXRob3V0IGNhdXNpbmcgY3ljbGljIGxhenkgbGlua2luZyBlcnJvcnMKKwlwcml2YXRlIFN0cmluZyBnZXRDcm9zc1JlZmVyZW5jZU5hbWUoRU9iamVjdCBvYmosIEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7CisJCUxpc3Q8SU5vZGU+IG5vZGVzID0gTm9kZU1vZGVsVXRpbHMuZmluZE5vZGVzRm9yRmVhdHVyZShvYmosIGZlYXR1cmUpOworCQlpZiAobm9kZXMuc2l6ZSgpID09IDApIHsKKwkJCXJldHVybiBudWxsOworCQl9CisJCXJldHVybiBOb2RlTW9kZWxVdGlscy5nZXRUb2tlblRleHQobm9kZXMuZ2V0KDApKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3ZhbHVlY29udmVydGVyL0NoYXJ0VmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L3ZhbHVlY29udmVydGVyL0NoYXJ0VmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmMmFjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdmFsdWVjb252ZXJ0ZXIvQ2hhcnRWYWx1ZUNvbnZlcnRlclNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiAJCUNocmlzdG9waGUgTG9ldHogLSBJbml0aWFsIGltcGxlbWVudGF0aW9uCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC52YWx1ZWNvbnZlcnRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudmFsdWVjb252ZXJ0ZXIuVFJBTlNMQVRBQkxFU1RSSU5HVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5WYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb252ZXJzaW9uLlhiYXNlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBBZGRzIGEgdmFsdWUgY29udmVyc2lvbiBmb3IgdGhlIFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcnVsZS4KKyAqIAorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIENoYXJ0VmFsdWVDb252ZXJ0ZXJTZXJ2aWNlIGV4dGVuZHMgWGJhc2VWYWx1ZUNvbnZlcnRlclNlcnZpY2UgeworCUBJbmplY3QKKwlwcml2YXRlIFRSQU5TTEFUQUJMRVNUUklOR1ZhbHVlQ29udmVydGVyIGNvbnZlcnRlcjsKKworCUBWYWx1ZUNvbnZlcnRlcihydWxlID0gIlF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKQorCXB1YmxpYyBJVmFsdWVDb252ZXJ0ZXI8U3RyaW5nPiBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVZhbHVlQ29udmVydGVyKCk7CisJfQorCisJQFZhbHVlQ29udmVydGVyKHJ1bGUgPSAiVFJBTlNMQVRBQkxFU1RSSU5HIikKKwlwdWJsaWMgSVZhbHVlQ29udmVydGVyPFN0cmluZz4gZ2V0VHJhbnNsYXRhYmxlU3RyaW5nVmFsdWVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBjb252ZXJ0ZXI7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2Zvcm1hdHRpbmcvQ2hhcnREU0xGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvZm9ybWF0dGluZy9DaGFydERTTEZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZmZkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2Zvcm1hdHRpbmcvQ2hhcnREU0xGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmZvcm1hdHRpbmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy54dGV4dC5HZW5lcmljRm9ybWF0dGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkdyYW1tYXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkZvcm1hdHRpbmdDb25maWc7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2VydmljZXMuWHR5cGVHcmFtbWFyQWNjZXNzOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgY3VzdG9tIGZvcm1hdHRpbmcgZGVzY3JpcHRpb24uCisgKiAKKyAqIHNlZSA6IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2Zvcm1hdHRpbmcKKyAqIG9uIGhvdyBhbmQgd2hlbiB0byB1c2UgaXQKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBDaGFydERTTEZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXIgeworICBASW5qZWN0CisgIHByaXZhdGUgWHR5cGVHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgIAorICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVGb3JtYXR0aW5nKGZpbmFsIEZvcm1hdHRpbmdDb25maWcgYykgeworICAgIGZpbmFsIEdlbmVyaWNGb3JtYXR0ZXIgZ2VuZXJpY0Zvcm1hdHRlciA9IG5ldyBHZW5lcmljRm9ybWF0dGVyKCk7CisgICAgR3JhbW1hciBfZ3JhbW1hciA9IHRoaXMuZ3JhbW1hci5nZXRHcmFtbWFyKCk7CisgICAgZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKGMsIF9ncmFtbWFyLCAiQ2hhcnQiLCAiQ2hhcnRJbXBvcnQiKTsKKyAgICBnZW5lcmljRm9ybWF0dGVyLmdlbmVyaWNGb3JtYXR0aW5nKGMsIHRoaXMuZ3JhbW1hciwgdGhpcy5ncmFtbWFyQWNjZXNzKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjQxNDJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLmphdmEKQEAgLTAsMCArMSwzMDYgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuanZtbW9kZWw7CisKK2ltcG9ydCBjb20udmFhZGluLmFubm90YXRpb25zLkphdmFTY3JpcHQ7CitpbXBvcnQgY29tLnZhYWRpbi5zaGFyZWQudWkuSmF2YVNjcmlwdENvbXBvbmVudFN0YXRlOworaW1wb3J0IGNvbS52YWFkaW4udWkuQWJzdHJhY3RKYXZhU2NyaXB0Q29tcG9uZW50OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb25zdGFudHMuR2VuZXJhdG9yQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE9wdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0Lmp2bW1vZGVsLkQzSnNKYXZhVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUFubm90YXRpb25SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUFubm90YXRpb25WYWx1ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bURlY2xhcmVkVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZvcm1hbFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1TdHJpbmdBbm5vdGF0aW9uVmFsdWU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVZpc2liaWxpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb21waWxlci5vdXRwdXQuSVRyZWVBcHBlbmRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1EZWNsYXJlZFR5cGVBY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1UeXBlc0J1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IgeworICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBKdm1UeXBlc0J1aWxkZXIgX2p2bVR5cGVzQnVpbGRlcjsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIEQzSnNKYXZhVXRpbCBfZDNKc0phdmFVdGlsOworICAKKyAgQEluamVjdAorICBwcml2YXRlIFR5cGVzRmFjdG9yeSB0eXBlc0ZhY3Rvcnk7CisgIAorICBwdWJsaWMgdm9pZCBjcmVhdGVKc0phdmFDb21wb25lbnQoZmluYWwgQ2hhcnQgY2hhcnQsIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvcikgeworICAgIGZpbmFsIFN0cmluZyBzdGF0ZUNsYXNzTmFtZSA9IHRoaXMuX2QzSnNKYXZhVXRpbC5jcmVhdGVTdGF0ZUZpbGVuYW1lKGNoYXJ0KTsKKyAgICBTdHJpbmcgX2NyZWF0ZWZ1bGx5UXVhbGlmaWVkQ2hhcnRGaWxlbmFtZSA9IHRoaXMuX2QzSnNKYXZhVXRpbC5jcmVhdGVmdWxseVF1YWxpZmllZENoYXJ0RmlsZW5hbWUoY2hhcnQpOworICAgIEp2bUdlbmVyaWNUeXBlIGNoYXJ0X2NscyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0NsYXNzKGNoYXJ0LCBfY3JlYXRlZnVsbHlRdWFsaWZpZWRDaGFydEZpbGVuYW1lKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0RG9jdW1lbnRhdGlvbihjaGFydF9jbHMsIEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OKTsKKyAgICBTdHJpbmcgX2NyZWF0ZWZ1bGx5UXVhbGlmaWVkU3RhdGVGaWxlbmFtZSA9IHRoaXMuX2QzSnNKYXZhVXRpbC5jcmVhdGVmdWxseVF1YWxpZmllZFN0YXRlRmlsZW5hbWUoY2hhcnQpOworICAgIEp2bUdlbmVyaWNUeXBlIHN0YXRlX2NscyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0NsYXNzKGNoYXJ0LCBfY3JlYXRlZnVsbHlRdWFsaWZpZWRTdGF0ZUZpbGVuYW1lKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0RG9jdW1lbnRhdGlvbihzdGF0ZV9jbHMsIEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OKTsKKyAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKChfY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSkgeworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBmaW5hbCBDaGFydFRyZWUgY2hhcnRUcmVlID0gKChDaGFydFRyZWUpIF9jaGFydHR5cGVfMSk7CisgICAgICBJSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3IuSVBvc3RJbmRleGluZ0luaXRpYWxpemluZzxKdm1HZW5lcmljVHlwZT4gX2FjY2VwdCA9IGFjY2VwdG9yLjxKdm1HZW5lcmljVHlwZT5hY2NlcHQoY2hhcnRfY2xzKTsKKyAgICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtR2VuZXJpY1R5cGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPEp2bUdlbmVyaWNUeXBlPigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtR2VuZXJpY1R5cGUgaXQpIHsKKyAgICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfc3VwZXJUeXBlcyA9IGl0LmdldFN1cGVyVHlwZXMoKTsKKyAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgQWJzdHJhY3RKYXZhU2NyaXB0Q29tcG9uZW50LmNsYXNzKTsKKyAgICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtVHlwZVJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX3N1cGVyVHlwZXMsIF9uZXdUeXBlUmVmKTsKKyAgICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIGpzQW5ub3RhdGlvblJlZiA9IENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvQW5ub3RhdGlvbihjaGFydFRyZWUsIEphdmFTY3JpcHQuY2xhc3MpOworICAgICAgICAgIFN0cmluZyBfY3JlYXRlQ2hhcnRKc0ZpbGVuYW1lID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9kM0pzSmF2YVV0aWwuY3JlYXRlQ2hhcnRKc0ZpbGVuYW1lKGNoYXJ0KTsKKyAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBqc0Fubm90YXRpb25MaXN0ID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxTdHJpbmc+bmV3QXJyYXlMaXN0KCJkMy5taW4uanMiLCBfY3JlYXRlQ2hhcnRKc0ZpbGVuYW1lKTsKKyAgICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuYWRkU3RyaW5nVmFsdWVzVG9Bbm5vdGF0aW9uKGpzQW5ub3RhdGlvblJlZiwganNBbm5vdGF0aW9uTGlzdCk7CisgICAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBqc0Fubm90YXRpb25SZWYpOworICAgICAgICAgIGJvb2xlYW4gX2lzTWFwID0gY2hhcnRUcmVlLmlzTWFwKCk7CisgICAgICAgICAgaWYgKF9pc01hcCkgeworICAgICAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLnRvVHJlZU1hcENvbnN0cnVjdG9yKGl0LCBjaGFydCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2xlYW4gX2lzQ29sbGFwc2libGUgPSBjaGFydFRyZWUuaXNDb2xsYXBzaWJsZSgpOworICAgICAgICAgICAgaWYgKF9pc0NvbGxhcHNpYmxlKSB7CisgICAgICAgICAgICAgIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IudGhpcy50b0NoYXJ0Q29uc3RydWN0b3IoaXQsIGNoYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLnRvQ2hhcnRPcGVyYXRpb25zKGl0LCBjaGFydCwgc3RhdGVDbGFzc05hbWUpOworICAgICAgICB9CisgICAgICB9OworICAgICAgX2FjY2VwdC5pbml0aWFsaXplTGF0ZXIoX2Z1bmN0aW9uKTsKKyAgICAgIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvci5JUG9zdEluZGV4aW5nSW5pdGlhbGl6aW5nPEp2bUdlbmVyaWNUeXBlPiBfYWNjZXB0XzEgPSBhY2NlcHRvci48SnZtR2VuZXJpY1R5cGU+YWNjZXB0KHN0YXRlX2Nscyk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUdlbmVyaWNUeXBlPiBfZnVuY3Rpb25fMSA9IG5ldyBQcm9jZWR1cmUxPEp2bUdlbmVyaWNUeXBlPigpIHsKKyAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtR2VuZXJpY1R5cGUgaXQpIHsKKyAgICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfc3VwZXJUeXBlcyA9IGl0LmdldFN1cGVyVHlwZXMoKTsKKyAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgSmF2YVNjcmlwdENvbXBvbmVudFN0YXRlLmNsYXNzKTsKKyAgICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtVHlwZVJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX3N1cGVyVHlwZXMsIF9uZXdUeXBlUmVmKTsKKyAgICAgICAgICBib29sZWFuIF9pc01hcCA9IGNoYXJ0VHJlZS5pc01hcCgpOworICAgICAgICAgIGlmIChfaXNNYXApIHsKKyAgICAgICAgICAgIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IudGhpcy50b1RyZWVNYXBTdGF0ZUZpZWxkcyhpdCwgY2hhcnQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sZWFuIF9pc0NvbGxhcHNpYmxlID0gY2hhcnRUcmVlLmlzQ29sbGFwc2libGUoKTsKKyAgICAgICAgICAgIGlmIChfaXNDb2xsYXBzaWJsZSkgeworICAgICAgICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMudG9DaGFydFN0YXRlRmllbGRzKGl0LCBjaGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9OworICAgICAgX2FjY2VwdF8xLmluaXRpYWxpemVMYXRlcihfZnVuY3Rpb25fMSk7CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCB0b0NoYXJ0T3BlcmF0aW9ucyhmaW5hbCBKdm1EZWNsYXJlZFR5cGUgdHlwZSwgZmluYWwgQ2hhcnQgY2hhcnQsIGZpbmFsIFN0cmluZyBzdGF0ZUNsYXNzTmFtZSkgeworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnMgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLm5ld1R5cGVSZWYoY2hhcnQsIHN0YXRlQ2xhc3NOYW1lKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gKCIpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKHN0YXRlQ2xhc3NOYW1lLCAiIik7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIikgc3VwZXIuZ2V0U3RhdGUoKTsiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2QgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QoY2hhcnQsICJnZXRTdGF0ZSIsIF9uZXdUeXBlUmVmLCBfZnVuY3Rpb24pOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVycywgX21ldGhvZCk7CisgIH0KKyAgCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0RDNTdGF0ZVZhcnMoKSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJnZXRTdGF0ZSgpLmpzb25EYXRhID0gX2pzb25EYXRhOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImdldFN0YXRlKCkuaHRtbFRhZ0lkPV9odG1sVGFnSWQ7Iik7CisgICAgcmV0dXJuIF9idWlsZGVyOworICB9CisgIAorICBwdWJsaWMgSnZtQ29uc3RydWN0b3IgZ2V0Q2hhcnRDb25zdHJ1Y3RvcihmaW5hbCBKdm1EZWNsYXJlZFR5cGUgdHlwZSwgZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUNvbnN0cnVjdG9yPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxKdm1Db25zdHJ1Y3Rvcj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1Db25zdHJ1Y3RvciBpdCkgeworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihjaGFydCwgIl9odG1sVGFnSWQiLCBfbmV3VHlwZVJlZik7CisgICAgICAgIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVyc18xID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmXzEgPSBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5uZXdUeXBlUmVmKGNoYXJ0LCBTdHJpbmcuY2xhc3MpOworICAgICAgICBKdm1Gb3JtYWxQYXJhbWV0ZXIgX3BhcmFtZXRlcl8xID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9QYXJhbWV0ZXIoY2hhcnQsICJfanNvbkRhdGEiLCBfbmV3VHlwZVJlZl8xKTsKKyAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnNfMSwgX3BhcmFtZXRlcl8xKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX2QzU3RhdGVWYXJzID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLmdldEQzU3RhdGVWYXJzKCk7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2QzU3RhdGVWYXJzKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICByZXR1cm4gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvQ29uc3RydWN0b3IoY2hhcnQsIF9mdW5jdGlvbik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRvVHJlZU1hcENvbnN0cnVjdG9yKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBDaGFydCBjaGFydCkgeworICAgIEp2bUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGhpcy5nZXRDaGFydENvbnN0cnVjdG9yKHR5cGUsIGNoYXJ0KTsKKyAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX25ld1R5cGVSZWYgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgU3RyaW5nLmNsYXNzKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmXzEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgTGlzdC5jbGFzcywgX25ld1R5cGVSZWYpOworICAgIEp2bUZvcm1hbFBhcmFtZXRlciBfcGFyYW1ldGVyID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAiZGF0YUNvbHVtbnMiLCBfbmV3VHlwZVJlZl8xKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnMsIF9wYXJhbWV0ZXIpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBDaGFyU2VxdWVuY2UgX2QzU3RhdGVWYXJzID0gQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLmdldEQzU3RhdGVWYXJzKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChfZDNTdGF0ZVZhcnMsICIiKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJnZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0ID0gZGF0YUNvbHVtbnM7Iik7CisgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICB9CisgICAgfTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShjb25zdHJ1Y3RvciwgX2Z1bmN0aW9uKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Db25zdHJ1Y3Rvcj5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIGNvbnN0cnVjdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdG9DaGFydENvbnN0cnVjdG9yKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBDaGFydCBjaGFydCkgeworICAgIEp2bUNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yID0gdGhpcy5nZXRDaGFydENvbnN0cnVjdG9yKHR5cGUsIGNoYXJ0KTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Db25zdHJ1Y3Rvcj5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIGNvbnN0cnVjdG9yKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgYWRkU3RyaW5nVmFsdWVzVG9Bbm5vdGF0aW9uKGZpbmFsIEp2bUFubm90YXRpb25SZWZlcmVuY2UgYW5ub3RhdGlvblJlZiwgZmluYWwgQXJyYXlMaXN0PFN0cmluZz4gYW5ub3RhdGlvblN0cmluZ0xpc3QpIHsKKyAgICBKdm1TdHJpbmdBbm5vdGF0aW9uVmFsdWUgdmFsdWUgPSB0aGlzLnR5cGVzRmFjdG9yeS5jcmVhdGVKdm1TdHJpbmdBbm5vdGF0aW9uVmFsdWUoKTsKKyAgICBmb3IgKGZpbmFsIFN0cmluZyBhbm5vdGF0aW9uU3RyaW5nIDogYW5ub3RhdGlvblN0cmluZ0xpc3QpIHsKKyAgICAgIEVMaXN0PFN0cmluZz4gX3ZhbHVlcyA9IHZhbHVlLmdldFZhbHVlcygpOworICAgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxTdHJpbmc+b3BlcmF0b3JfYWRkKF92YWx1ZXMsIGFubm90YXRpb25TdHJpbmcpOworICAgIH0KKyAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uVmFsdWU+IF9leHBsaWNpdFZhbHVlcyA9IGFubm90YXRpb25SZWYuZ2V0RXhwbGljaXRWYWx1ZXMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bVN0cmluZ0Fubm90YXRpb25WYWx1ZT5vcGVyYXRvcl9hZGQoX2V4cGxpY2l0VmFsdWVzLCB2YWx1ZSk7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIHRvVHJlZU1hcFN0YXRlRmllbGRzKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBDaGFydCBjaGFydCkgeworICAgIHRoaXMudG9DaGFydFN0YXRlRmllbGRzKHR5cGUsIGNoYXJ0KTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfbmV3VHlwZVJlZiA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci5uZXdUeXBlUmVmKGNoYXJ0LCBTdHJpbmcuY2xhc3MpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX25ld1R5cGVSZWZfMSA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci5uZXdUeXBlUmVmKGNoYXJ0LCBMaXN0LmNsYXNzLCBfbmV3VHlwZVJlZik7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1GaWVsZD4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBVQkxJQyk7CisgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIm5ldyBBcnJheUxpc3Q8U3RyaW5nPigpIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0SW5pdGlhbGl6ZXIoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1GaWVsZCBfZmllbGQgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImRhdGFDb2x1bW5MaXN0IiwgX25ld1R5cGVSZWZfMSwgX2Z1bmN0aW9uKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVycywgX2ZpZWxkKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgdG9DaGFydFN0YXRlRmllbGRzKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBDaGFydCBjaGFydCkgeworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnMgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLm5ld1R5cGVSZWYoY2hhcnQsIFN0cmluZy5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1GaWVsZD4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBVQkxJQyk7CisgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiXCIiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRJbml0aWFsaXplcihpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bUZpZWxkIF9maWVsZCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAianNvbkRhdGEiLCBfbmV3VHlwZVJlZiwgX2Z1bmN0aW9uKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVycywgX2ZpZWxkKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzEgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmXzEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgU3RyaW5nLmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUZpZWxkPiBfZnVuY3Rpb25fMSA9IG5ldyBQcm9jZWR1cmUxPEp2bUZpZWxkPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUZpZWxkIGl0KSB7CisgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QVUJMSUMpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIlwiIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0SW5pdGlhbGl6ZXIoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMSA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAiaHRtbFRhZ0lkIiwgX25ld1R5cGVSZWZfMSwgX2Z1bmN0aW9uXzEpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRmllbGQ+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzEsIF9maWVsZF8xKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzIgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF9uZXdUeXBlUmVmXzIgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIubmV3VHlwZVJlZihjaGFydCwgU3RyaW5nLmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUZpZWxkPiBfZnVuY3Rpb25fMiA9IG5ldyBQcm9jZWR1cmUxPEp2bUZpZWxkPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUZpZWxkIGl0KSB7CisgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QVUJMSUMpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIlwiIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0SW5pdGlhbGl6ZXIoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMiA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAiaW5wdXRWYWx1ZSIsIF9uZXdUeXBlUmVmXzIsIF9mdW5jdGlvbl8yKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18yLCBfZmllbGRfMik7CisgIH0KKyAgCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgY3JlYXRlRDNDaGFydChmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiQ2VsbFNldFRvRDNKc29uQ29udmVydGVyIGpzb25Db252ZXJ0ZXIgPSBuZXcgQ2VsbFNldFRvRDNKc29uQ29udmVydGVyKCk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIG5ldyAiKTsKKyAgICBmaW5hbCBTdHJpbmcgZDNDaGFydEZpbGVOYW1lID0gdGhpcy5fZDNKc0phdmFVdGlsLmNyZWF0ZUNoYXJ0RmlsZW5hbWUoY2hhcnQpOworICAgIF9idWlsZGVyLmFwcGVuZChkM0NoYXJ0RmlsZU5hbWUsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIihcIiIpOworICAgIF9idWlsZGVyLmFwcGVuZChkM0NoYXJ0RmlsZU5hbWUsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiLCBqc29uQ29udmVydGVyLmdldEQzSnNvblN0cmluZyhjeENlbGxTZXQpIik7CisgICAgeworICAgICAgYm9vbGVhbiBfaXNUcmVlTWFwID0gdGhpcy5fZDNKc0phdmFVdGlsLmlzVHJlZU1hcChjaGFydCk7CisgICAgICBpZiAoX2lzVHJlZU1hcCkgeworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIiwganNvbkNvbnZlcnRlci5nZXREYXRhQ29sdW1uTmFtZUxpc3QoY3hDZWxsU2V0KSIpOworICAgICAgfQorICAgIH0KKyAgICBfYnVpbGRlci5hcHBlbmQoIik7Iik7CisgICAgcmV0dXJuIF9idWlsZGVyOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEp2bU1vZGVsSW5mZXJyZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE4YWU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9qdm1tb2RlbC9DaGFydERTTEp2bU1vZGVsSW5mZXJyZXIuamF2YQpAQCAtMCwwICsxLDI5OTggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuanZtbW9kZWw7CisKK2ltcG9ydCBjb20uZ2l0aHViLndvbGZpZS5yZWZyZXNoZXIuUmVmcmVzaGVyOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBjb20udmFhZGluLmRhdGEuUHJvcGVydHk7CitpbXBvcnQgY29tLnZhYWRpbi51aS5Db21wb25lbnQ7CitpbXBvcnQgY29tLnZhYWRpbi51aS5WZXJ0aWNhbExheW91dDsKK2ltcG9ydCBlbGVtZW50YWwuanNvbi5Kc29uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMuRENoYXJ0czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLmNvbnRleHRzLklFY2xpcHNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC5jb3JlLnNlcnZpY2VzLmV2ZW50cy5JRXZlbnRCcm9rZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24uTUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLm9zZ2kuaHlicmlkLmFwaS5BYnN0cmFjdEh5YnJpZFZhYWNsaXBzZVZpZXc7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQuRGVyaXZlZE9sYXBFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkuZGF0YW1hcnQuSURhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmxheW91dC5JVmlld0xheW91dE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51aS5hcGkubWV0YWRhdGEuSURTTE1ldGFkYXRhU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS51c2VyLklVc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY29uc3RhbnRzLkdlbmVyYXRvckNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnRoZW1lLkVudW1Dc3NDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5Qcm9wZXJ0eUxvb2t1cDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRBeGlzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRCYXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEJ1YmJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydERvbnV0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRHYXVnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0SGlnaGxpZ2h0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydEludGVydmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRMZWdlbmQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydExpbmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE51bWJlckludGVydmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBpZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UmFuZ2VFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRTZWdtZW50Q29sb3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5MZWdlbmRQbGFjZW1lbnRFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuUmVuZGVyVHlwZUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5Ub2dnbGVUeXBlRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LlRvb2x0aXBMb2NhdGlvbkVudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbC5DaGFydERTTEQzSmF2YUNvbXBvbmVudHNDcmVhdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY3ViZWRzbC5DdWJlTGV2ZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkQ2VsbFNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkF4aXNFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRBeGlzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRDdWJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRDdWJlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0RGVyaXZlZE1lYXN1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0TWVhc3VyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnROYXZpZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRPd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0UHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLlZhbHVlU2NhbGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuanZtbW9kZWwuRGF0YW1hcnREU0xKdm1Nb2RlbEluZmVycmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZW5kMi5saWIuU3RyaW5nQ29uY2F0ZW5hdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtQW5ub3RhdGlvblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bURlY2xhcmVkVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtRmllbGQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUZvcm1hbFBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtR2VuZXJpY1R5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bU1lbWJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtT3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1UeXBlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1WaXNpYmlsaXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5RdWFsaWZpZWROYW1lOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLm91dHB1dC5JVHJlZUFwcGVuZGFibGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuQWJzdHJhY3RNb2RlbEluZmVycmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLklKdm1EZWNsYXJlZFR5cGVBY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5Kdm1UeXBlc0J1aWxkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWIuRXh0ZW5zaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Qcm9jZWR1cmVzLlByb2NlZHVyZTE7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKKworLyoqCisgKiA8cD5JbmZlcnMgYSBKVk0gbW9kZWwgZnJvbSB0aGUgc291cmNlIG1vZGVsLjwvcD4KKyAqIAorICogPHA+VGhlIEpWTSBtb2RlbCBzaG91bGQgY29udGFpbiBhbGwgZWxlbWVudHMgdGhhdCB3b3VsZCBhcHBlYXIgaW4gdGhlIEphdmEgY29kZQorICogd2hpY2ggaXMgZ2VuZXJhdGVkIGZyb20gdGhlIHNvdXJjZSBtb2RlbC4gT3RoZXIgbW9kZWxzIGxpbmsgYWdhaW5zdCB0aGUgSlZNIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzb3VyY2UgbW9kZWwuPC9wPgorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSW5mZXJyZXIgeworICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBKdm1UeXBlc0J1aWxkZXIgX2p2bVR5cGVzQnVpbGRlcjsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIElRdWFsaWZpZWROYW1lUHJvdmlkZXIgX2lRdWFsaWZpZWROYW1lUHJvdmlkZXI7CisgIAorICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgZGF0YW1hcnRJbmZlcnJlcjsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIENoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3IgX2NoYXJ0RFNMRDNKYXZhQ29tcG9uZW50c0NyZWF0b3I7CisgIAorICAvKioKKyAgICogPHA+aW5mZXIgbWV0aG9kIGRpc3BhdGNoZXMgdGhlIG5lY2Vzc2FyeSByb3V0aW5lcyB0byBidWlsZCBmaWVsZHMsIHNldHRlciwgZ2V0dGVyLCBjb25zdHJ1Y3RvcnMgYW5kIG1ldGhvZHMgb2YgdGhlIGdlbmVyYXRlZCBjb2RlLjwvcD4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIF9pbmZlcihmaW5hbCBDaGFydFBhY2thZ2UgcGNrZywgZmluYWwgSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yIGFjY2VwdG9yLCBmaW5hbCBib29sZWFuIGlzUHJlSW5kZXhpbmdQaGFzZSkgeworICAgIEVMaXN0PENoYXJ0PiBfY2hhcnRzID0gcGNrZy5nZXRDaGFydHMoKTsKKyAgICBmb3IgKGZpbmFsIENoYXJ0IGNoYXJ0IDogX2NoYXJ0cykgeworICAgICAgeworICAgICAgICBRdWFsaWZpZWROYW1lIF9mdWxseVF1YWxpZmllZE5hbWUgPSB0aGlzLl9pUXVhbGlmaWVkTmFtZVByb3ZpZGVyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShwY2tnKTsKKyAgICAgICAgU3RyaW5nIF9wbHVzID0gKF9mdWxseVF1YWxpZmllZE5hbWUgKyAiLiIpOworICAgICAgICBTdHJpbmcgX25hbWUgPSBjaGFydC5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfcGx1c18xID0gKF9wbHVzICsgX25hbWUpOworICAgICAgICBTdHJpbmcgX3BsdXNfMiA9IChfcGx1c18xICsgIkNoYXJ0Iik7CisgICAgICAgIEp2bUdlbmVyaWNUeXBlIGNscyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0NsYXNzKGNoYXJ0LCBfcGx1c18yKTsKKyAgICAgICAgRUxpc3Q8SnZtVHlwZVJlZmVyZW5jZT4gX3N1cGVyVHlwZXMgPSBjbHMuZ2V0U3VwZXJUeXBlcygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihBYnN0cmFjdEh5YnJpZFZhYWNsaXBzZVZpZXcuY2xhc3MpOworICAgICAgICBfc3VwZXJUeXBlcy5hZGQoX3R5cGVSZWYpOworICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfc3VwZXJUeXBlc18xID0gY2xzLmdldFN1cGVyVHlwZXMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJVXNlci5Vc2VyTG9jYWxlTGlzdGVuZXIuY2xhc3MpOworICAgICAgICBfc3VwZXJUeXBlc18xLmFkZChfdHlwZVJlZl8xKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1HZW5lcmljVHlwZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtR2VuZXJpY1R5cGU+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUdlbmVyaWNUeXBlIGl0KSB7CisgICAgICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldERvY3VtZW50YXRpb24oaXQsIEdlbmVyYXRvckNvbnN0YW50cy5HRU5FUkFURURfQ0xBU1NFU19ET0NVTUVOVEFUSU9OKTsKKyAgICAgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLnRvRmllbGRzKGl0LCBjaGFydCk7CisgICAgICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy50b0NvbnN0cnVjdG9yKGl0LCBjaGFydCk7CisgICAgICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy50b0dldHRlclNldHRlcihpdCwgY2hhcnQpOworICAgICAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMudG9PcGVyYXRpb25zKGl0LCBjaGFydCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBhY2NlcHRvci48SnZtR2VuZXJpY1R5cGU+YWNjZXB0KGNscywgX2Z1bmN0aW9uKTsKKyAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICBpZiAoKF9jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSB7CisgICAgICAgICAgdGhpcy5fY2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci5jcmVhdGVKc0phdmFDb21wb25lbnQoY2hhcnQsIGFjY2VwdG9yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgLyoqCisgICAqIDxwPmJ1aWxkIHRoZSBjb25zdHJ1Y3RvcnMgdG8gYmUgdXNlZCBieSBhbiBlNCBhcHBsaWNhdGlvbi48L3A+CisgICAqLworICBwdWJsaWMgdm9pZCB0b0NvbnN0cnVjdG9yKGZpbmFsIEp2bURlY2xhcmVkVHlwZSB0eXBlLCBmaW5hbCBDaGFydCBjaGFydCkgeworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnMgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUNvbnN0cnVjdG9yPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxKdm1Db25zdHJ1Y3Rvcj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1Db25zdHJ1Y3RvciBpdCkgeworICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QuY2xhc3MpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVycyA9IGl0LmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAicGFyZW50IiwgX3R5cGVSZWYpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVyc18xID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRWNsaXBzZUNvbnRleHQuY2xhc3MpOworICAgICAgICBKdm1Gb3JtYWxQYXJhbWV0ZXIgX3BhcmFtZXRlcl8xID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihjaGFydCwgImNvbnRleHQiLCBfdHlwZVJlZl8xKTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRm9ybWFsUGFyYW1ldGVyPm9wZXJhdG9yX2FkZChfcGFyYW1ldGVyc18xLCBfcGFyYW1ldGVyXzEpOworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzXzIgPSBpdC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKE1BcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgICAgIEp2bUZvcm1hbFBhcmFtZXRlciBfcGFyYW1ldGVyXzIgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAiYXBwIiwgX3R5cGVSZWZfMik7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnNfMiwgX3BhcmFtZXRlcl8yKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgic3VwZXIocGFyZW50LGNvbnRleHQsYXBwKTsiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1Db25zdHJ1Y3RvciBfY29uc3RydWN0b3IgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9Db25zdHJ1Y3RvcihjaGFydCwgX2Z1bmN0aW9uKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUNvbnN0cnVjdG9yPm9wZXJhdG9yX2FkZChfbWVtYmVycywgX2NvbnN0cnVjdG9yKTsKKyAgfQorICAKKyAgLyoqCisgICAqIDxwPmJ1aWxkIHRoZSBjbGFzcyB2YXJpYWJsZXMuPC9wPgorICAgKi8KKyAgcHVibGljIHZvaWQgdG9GaWVsZHMoZmluYWwgSnZtRGVjbGFyZWRUeXBlIHR5cGUsIGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgSnZtRmllbGQgZmllbGQgPSBudWxsOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKExvZ2dlci5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1GaWVsZD4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZCgib3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFwiY2hhcnRzXCIpIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRJbml0aWFsaXplcihpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bUZpZWxkIF9maWVsZCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAibG9nIiwgX3R5cGVSZWYsIF9mdW5jdGlvbik7CisgICAgZmllbGQgPSBfZmllbGQ7CisgICAgZmllbGQuc2V0U3RhdGljKHRydWUpOworICAgIGZpZWxkLnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QUklWQVRFKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIGZpZWxkKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElVc2VyLmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUZpZWxkPiBfZnVuY3Rpb25fMSA9IG5ldyBQcm9jZWR1cmUxPEp2bUZpZWxkPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUZpZWxkIGl0KSB7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdC5jbGFzcyk7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgfQorICAgIH07CisgICAgSnZtRmllbGQgX2ZpZWxkXzEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgInVzZXIiLCBfdHlwZVJlZl8xLCBfZnVuY3Rpb25fMSk7CisgICAgZmllbGQgPSBfZmllbGRfMTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzEgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xLCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8yID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRWNsaXBzZUNvbnRleHQuY2xhc3MpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtRmllbGQ+IF9mdW5jdGlvbl8yID0gbmV3IFByb2NlZHVyZTE8SnZtRmllbGQ+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtRmllbGQgaXQpIHsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoSW5qZWN0LmNsYXNzKTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtQW5ub3RhdGlvblJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2Fubm90YXRpb25zLCBfYW5ub3RhdGlvblJlZik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMiA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAiZWNsaXBzZUNvbnRleHQiLCBfdHlwZVJlZl8yLCBfZnVuY3Rpb25fMik7CisgICAgZmllbGQgPSBfZmllbGRfMjsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzIgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18yLCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8zID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJbnRlZ2VyLmNsYXNzKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzQgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEFycmF5TGlzdC5jbGFzcywgX3R5cGVSZWZfMyk7CisgICAgSnZtRmllbGQgX2ZpZWxkXzMgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImNvb3JkaW5hdGVTeXN0ZW0iLCBfdHlwZVJlZl80KTsKKyAgICBmaWVsZCA9IF9maWVsZF8zOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRmllbGQ+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzMsIGZpZWxkKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzUgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElEYXRhbWFydEZpbHRlckdlbmVyYXRvci5jbGFzcyk7CisgICAgSnZtRmllbGQgX2ZpZWxkXzQgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImZpbHRlckdlbmVyYXRvciIsIF90eXBlUmVmXzUpOworICAgIGZpZWxkID0gX2ZpZWxkXzQ7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc180ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfNCwgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSVZpZXdMYXlvdXRNYW5hZ2VyLmNsYXNzKTsKKyAgICBKdm1GaWVsZCBfZmllbGRfNSA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAibGF5b3V0TWFuYWdlciIsIF90eXBlUmVmXzYpOworICAgIGZpZWxkID0gX2ZpZWxkXzU7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc181ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfNSwgZmllbGQpOworICAgIFN0cmluZyBfc291cmNlRGF0YU1hcnRSZWZOYW1lID0gdGhpcy5nZXRTb3VyY2VEYXRhTWFydFJlZk5hbWUoY2hhcnQpOworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfc291cmNlRGF0YU1hcnRSZWZOYW1lLCBudWxsKSk7CisgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZSA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZiA9IF9zb3VyY2UuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIEVPYmplY3QgX2VDb250YWluZXIgPSBfZGF0YW1hcnRSZWYuZUNvbnRhaW5lcigpOworICAgICAgUXVhbGlmaWVkTmFtZSBfZnVsbHlRdWFsaWZpZWROYW1lID0gdGhpcy5faVF1YWxpZmllZE5hbWVQcm92aWRlci5nZXRGdWxseVF1YWxpZmllZE5hbWUoKChEYXRhbWFydFBhY2thZ2UpIF9lQ29udGFpbmVyKSk7CisgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBfZnVsbHlRdWFsaWZpZWROYW1lLnRvU3RyaW5nKCk7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChwYWNrYWdlTmFtZSwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIuIik7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMSA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8xID0gX3NvdXJjZV8xLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBTdHJpbmcgX25hbWUgPSBfZGF0YW1hcnRSZWZfMS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX3N0cmluZyA9IF9uYW1lLnRvU3RyaW5nKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX3N0cmluZywgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJEYXRhbWFydCIpOworICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl83ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihfYnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgIEp2bUZpZWxkIF9maWVsZF82ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJkYXRhbWFydENsYXNzIiwgX3R5cGVSZWZfNyk7CisgICAgICBmaWVsZCA9IF9maWVsZF82OworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc182ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc182LCBmaWVsZCk7CisgICAgfQorICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfOCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoUHJvcGVydHkuVmFsdWVDaGFuZ2VMaXN0ZW5lci5jbGFzcyk7CisgICAgSnZtRmllbGQgX2ZpZWxkXzcgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImZpbHRlckNoYW5nZUxpc3RlbmVyIiwgX3R5cGVSZWZfOCk7CisgICAgZmllbGQgPSBfZmllbGRfNzsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzcgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc183LCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl85ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihSZWZyZXNoZXIuY2xhc3MpOworICAgIEp2bUZpZWxkIF9maWVsZF84ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJjaGFydFJlZnJlc2hlciIsIF90eXBlUmVmXzkpOworICAgIGZpZWxkID0gX2ZpZWxkXzg7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc184ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfOCwgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTAgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKGJvb2xlYW4uY2xhc3MpOworICAgIEp2bUZpZWxkIF9maWVsZF85ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJjaGFydFJlZnJlc2hlckRvbmUiLCBfdHlwZVJlZl8xMCk7CisgICAgZmllbGQgPSBfZmllbGRfOTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzkgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc185LCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMSA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoUmVmcmVzaGVyLmNsYXNzKTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMTAgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImNoYXJ0UmVuZGVyRGVsYXkiLCBfdHlwZVJlZl8xMSk7CisgICAgZmllbGQgPSBfZmllbGRfMTA7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xMCA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRmllbGQ+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzEwLCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMiA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29tcG9uZW50LmNsYXNzKTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMTEgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgImRhdGFDb21wb25lbnQiLCBfdHlwZVJlZl8xMik7CisgICAgZmllbGQgPSBfZmllbGRfMTE7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xMSA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRmllbGQ+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzExLCBmaWVsZCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xMyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzE0ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihQcm9wZXJ0eUxvb2t1cC5jbGFzcyk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xNSA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoSGFzaE1hcC5jbGFzcywgX3R5cGVSZWZfMTMsIF90eXBlUmVmXzE0KTsKKyAgICBKdm1GaWVsZCBfZmllbGRfMTIgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9GaWVsZChjaGFydCwgInByb3BlcnR5TG9va3VwTWFwIiwgX3R5cGVSZWZfMTUpOworICAgIGZpZWxkID0gX2ZpZWxkXzEyOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTIgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xMiwgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKERDaGFydHMuY2xhc3MpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTcgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEFycmF5TGlzdC5jbGFzcywgX3R5cGVSZWZfMTYpOworICAgIEp2bUZpZWxkIF9maWVsZF8xMyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAiY2hhcnRzIiwgX3R5cGVSZWZfMTcpOworICAgIGZpZWxkID0gX2ZpZWxkXzEzOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTMgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xMywgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTggPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKElFdmVudEJyb2tlci5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1GaWVsZD4gX2Z1bmN0aW9uXzMgPSBuZXcgUHJvY2VkdXJlMTxKdm1GaWVsZD4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1GaWVsZCBpdCkgeworICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihJbmplY3QuY2xhc3MpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bUZpZWxkIF9maWVsZF8xNCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b0ZpZWxkKGNoYXJ0LCAiZXZlbnRCcm9rZXIiLCBfdHlwZVJlZl8xOCwgX2Z1bmN0aW9uXzMpOworICAgIGZpZWxkID0gX2ZpZWxkXzE0OworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTQgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xNCwgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMTkgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEV2ZW50SGFuZGxlci5jbGFzcyk7CisgICAgSnZtRmllbGQgX2ZpZWxkXzE1ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJyZWZyZXNoVmlldyIsIF90eXBlUmVmXzE5KTsKKyAgICBmaWVsZCA9IF9maWVsZF8xNTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzE1ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1GaWVsZD5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMTUsIGZpZWxkKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzIwID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJRFNMTWV0YWRhdGFTZXJ2aWNlLmNsYXNzKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bUZpZWxkPiBfZnVuY3Rpb25fNCA9IG5ldyBQcm9jZWR1cmUxPEp2bUZpZWxkPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bUZpZWxkIGl0KSB7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKEluamVjdC5jbGFzcyk7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgfQorICAgIH07CisgICAgSnZtRmllbGQgX2ZpZWxkXzE2ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJkc2xNZXRhZGF0YVNlcnZpY2UiLCBfdHlwZVJlZl8yMCwgX2Z1bmN0aW9uXzQpOworICAgIGZpZWxkID0gX2ZpZWxkXzE2OworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfMTYgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZpZWxkPm9wZXJhdG9yX2FkZChfbWVtYmVyc18xNiwgZmllbGQpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMjEgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKExvY2FsZS5jbGFzcyk7CisgICAgSnZtRmllbGQgX2ZpZWxkXzE3ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvRmllbGQoY2hhcnQsICJsb2NhbGUiLCBfdHlwZVJlZl8yMSk7CisgICAgZmllbGQgPSBfZmllbGRfMTc7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18xNyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtRmllbGQ+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzE3LCBmaWVsZCk7CisgIH0KKyAgCisgIC8qKgorICAgKiA8cD5idWlsZCB0aGUgZ2V0dGVycyBhbmQgc2V0dGVycyBmcm9tIGNsYXNzIHZhcmlhYmxlcy48L3A+CisgICAqLworICBwdWJsaWMgdm9pZCB0b0dldHRlclNldHRlcihmaW5hbCBKdm1EZWNsYXJlZFR5cGUgdHlwZSwgZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBKdm1PcGVyYXRpb24gb3BlcmF0aW9uID0gbnVsbDsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihJbnRlZ2VyLmNsYXNzKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEFycmF5TGlzdC5jbGFzcywgX3R5cGVSZWYpOworICAgIEp2bU9wZXJhdGlvbiBfZ2V0dGVyID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvR2V0dGVyKGNoYXJ0LCAiY29vcmRpbmF0ZVN5c3RlbSIsIF90eXBlUmVmXzEpOworICAgIG9wZXJhdGlvbiA9IF9nZXR0ZXI7CisgICAgb3BlcmF0aW9uLnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QVUJMSUMpOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnMgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnMsIG9wZXJhdGlvbik7CisgIH0KKyAgCisgIC8qKgorICAgKiA8cD5idWlsZCB0aGUgbWV0aG9kcy48L3A+CisgICAqLworICBwdWJsaWMgdm9pZCB0b09wZXJhdGlvbnMoZmluYWwgSnZtRGVjbGFyZWRUeXBlIHR5cGUsIGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVycyA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQuVFlQRSk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVycyA9IGl0LmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZlcnRpY2FsTGF5b3V0LmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAicGFyZW50IiwgX3R5cGVSZWYpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIFN0cmluZyBfY3JlYXRlVmlldyA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLmNyZWF0ZVZpZXcoY2hhcnQpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9jcmVhdGVWaWV3LCAiIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2QgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QoY2hhcnQsICJjcmVhdGVWaWV3IiwgX3R5cGVSZWYsIF9mdW5jdGlvbik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzLCBfbWV0aG9kKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzEgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQuVFlQRSk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8xID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgU3RyaW5nIF9jcmVhdGVDb21wb25lbnRzID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuY3JlYXRlQ29tcG9uZW50cyhjaGFydCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2NyZWF0ZUNvbXBvbmVudHMsICIiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8xID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKGNoYXJ0LCAiY3JlYXRlQ29tcG9uZW50cyIsIF90eXBlUmVmXzEsIF9mdW5jdGlvbl8xKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMSwgX21ldGhvZF8xKTsKKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzIgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzIgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKENvbXBvbmVudC5jbGFzcyk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl8yID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfZXhjZXB0aW9ucyA9IGl0LmdldEV4Y2VwdGlvbnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKERlcml2ZWRPbGFwRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtVHlwZVJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2V4Y2VwdGlvbnMsIF90eXBlUmVmKTsKKyAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVycyA9IGl0LmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8xID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoRGVyaXZlZENlbGxTZXQuY2xhc3MpOworICAgICAgICBKdm1Gb3JtYWxQYXJhbWV0ZXIgX3BhcmFtZXRlciA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9QYXJhbWV0ZXIoY2hhcnQsICJjZWxsU2V0IiwgX3R5cGVSZWZfMSk7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnMsIF9wYXJhbWV0ZXIpOworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzXzEgPSBpdC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEludGVnZXIuY2xhc3MpOworICAgICAgICBKdm1Gb3JtYWxQYXJhbWV0ZXIgX3BhcmFtZXRlcl8xID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihjaGFydCwgImF4aXNObyIsIF90eXBlUmVmXzIpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzXzEsIF9wYXJhbWV0ZXJfMSk7CisgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICBTdHJpbmcgX2NyZWF0ZVRhYlNoZWV0ID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuY3JlYXRlVGFiU2hlZXQoY2hhcnQpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9jcmVhdGVUYWJTaGVldCwgIiIpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzIgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QoY2hhcnQsICJjcmVhdGVUYWJTaGVldCIsIF90eXBlUmVmXzIsIF9mdW5jdGlvbl8yKTsKKyAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMiwgX21ldGhvZF8yKTsKKyAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKCghKF9jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSkgeworICAgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc18zID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzMgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKENvbXBvbmVudC5jbGFzcyk7CisgICAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzMgPSBuZXcgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+KCkgeworICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfZXhjZXB0aW9ucyA9IGl0LmdldEV4Y2VwdGlvbnMoKTsKKyAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoRGVyaXZlZE9sYXBFeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bVR5cGVSZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9leGNlcHRpb25zLCBfdHlwZVJlZik7CisgICAgICAgICAgRUxpc3Q8SnZtRm9ybWFsUGFyYW1ldGVyPiBfcGFyYW1ldGVycyA9IGl0LmdldFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihEZXJpdmVkQ2VsbFNldC5jbGFzcyk7CisgICAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAiY2VsbFNldCIsIF90eXBlUmVmXzEpOworICAgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnMsIF9wYXJhbWV0ZXIpOworICAgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICBTdHJpbmcgX2NyZWF0ZUNoYXJ0ID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuY3JlYXRlQ2hhcnQoY2hhcnQpOworICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2NyZWF0ZUNoYXJ0LCAiIik7CisgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBKdm1PcGVyYXRpb24gX21ldGhvZF8zID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKGNoYXJ0LCAiY3JlYXRlQ2hhcnQiLCBfdHlwZVJlZl8zLCBfZnVuY3Rpb25fMyk7CisgICAgICB0aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bU9wZXJhdGlvbj5vcGVyYXRvcl9hZGQoX21lbWJlcnNfMywgX21ldGhvZF8zKTsKKyAgICB9CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKChfY2hhcnR0eXBlXzEgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSB7CisgICAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzQgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoQ29tcG9uZW50LmNsYXNzKTsKKyAgICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fNCA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICAgIEVMaXN0PEp2bVR5cGVSZWZlcmVuY2U+IF9leGNlcHRpb25zID0gaXQuZ2V0RXhjZXB0aW9ucygpOworICAgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihEZXJpdmVkT2xhcEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtVHlwZVJlZmVyZW5jZT5vcGVyYXRvcl9hZGQoX2V4Y2VwdGlvbnMsIF90eXBlUmVmKTsKKyAgICAgICAgICBFTGlzdDxKdm1UeXBlUmVmZXJlbmNlPiBfZXhjZXB0aW9uc18xID0gaXQuZ2V0RXhjZXB0aW9ucygpOworICAgICAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMSA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEpzb25FeGNlcHRpb24uY2xhc3MpOworICAgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bVR5cGVSZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9leGNlcHRpb25zXzEsIF90eXBlUmVmXzEpOworICAgICAgICAgIEVMaXN0PEp2bUZvcm1hbFBhcmFtZXRlcj4gX3BhcmFtZXRlcnMgPSBpdC5nZXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl8yID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoRGVyaXZlZENlbGxTZXQuY2xhc3MpOworICAgICAgICAgIEp2bUZvcm1hbFBhcmFtZXRlciBfcGFyYW1ldGVyID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci50b1BhcmFtZXRlcihjaGFydCwgImN4Q2VsbFNldCIsIF90eXBlUmVmXzIpOworICAgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUZvcm1hbFBhcmFtZXRlcj5vcGVyYXRvcl9hZGQoX3BhcmFtZXRlcnMsIF9wYXJhbWV0ZXIpOworICAgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX2NyZWF0ZUQzQ2hhcnQgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fY2hhcnREU0xEM0phdmFDb21wb25lbnRzQ3JlYXRvci5jcmVhdGVEM0NoYXJ0KGNoYXJ0KTsKKyAgICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9jcmVhdGVEM0NoYXJ0LCAiIik7CisgICAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfTsKKyAgICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICAgIH0KKyAgICAgIH07CisgICAgICBKdm1PcGVyYXRpb24gX21ldGhvZF80ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKGNoYXJ0LCAiY3JlYXRlRDNDaGFydCIsIF90eXBlUmVmXzQsIF9mdW5jdGlvbl80KTsKKyAgICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVyc180LCBfbWV0aG9kXzQpOworICAgIH0KKyAgICBFTGlzdDxKdm1NZW1iZXI+IF9tZW1iZXJzXzUgPSB0eXBlLmdldE1lbWJlcnMoKTsKKyAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzUgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFZvaWQuVFlQRSk7CisgICAgZmluYWwgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+IF9mdW5jdGlvbl81ID0gbmV3IFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPigpIHsKKyAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIEp2bU9wZXJhdGlvbiBpdCkgeworICAgICAgICBpdC5zZXRWaXNpYmlsaXR5KEp2bVZpc2liaWxpdHkuUFJPVEVDVEVEKTsKKyAgICAgICAgRUxpc3Q8SnZtQW5ub3RhdGlvblJlZmVyZW5jZT4gX2Fubm90YXRpb25zID0gaXQuZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgSnZtQW5ub3RhdGlvblJlZmVyZW5jZSBfYW5ub3RhdGlvblJlZiA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9hbm5vdGF0aW9uVHlwZXNCdWlsZGVyLmFubm90YXRpb25SZWYoUG9zdENvbnN0cnVjdC5jbGFzcyk7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBmaW5hbCBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4gX2Z1bmN0aW9uID0gbmV3IFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPigpIHsKKyAgICAgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBJVHJlZUFwcGVuZGFibGUgaXQpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgU3RyaW5nIF9zZXR1cCA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLnNldHVwKGNoYXJ0KTsKKyAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfc2V0dXAsICIiKTsKKyAgICAgICAgICAgIGl0LmFwcGVuZChfYnVpbGRlcik7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnNldEJvZHkoaXQsIF9mdW5jdGlvbik7CisgICAgICB9CisgICAgfTsKKyAgICBKdm1PcGVyYXRpb24gX21ldGhvZF81ID0gdGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvTWV0aG9kKGNoYXJ0LCAic2V0dXAiLCBfdHlwZVJlZl81LCBfZnVuY3Rpb25fNSk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzUsIF9tZXRob2RfNSk7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc182ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl82ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkLlRZUEUpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fNiA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRCk7CisgICAgICAgIGZpbmFsIFByb2NlZHVyZTE8SVRyZWVBcHBlbmRhYmxlPiBfZnVuY3Rpb24gPSBuZXcgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+KCkgeworICAgICAgICAgIHB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIElUcmVlQXBwZW5kYWJsZSBpdCkgeworICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgX3N1YnNjcmliZSA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLnN1YnNjcmliZShjaGFydCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3N1YnNjcmliZSwgIiIpOworICAgICAgICAgICAgaXQuYXBwZW5kKF9idWlsZGVyKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuc2V0Qm9keShpdCwgX2Z1bmN0aW9uKTsKKyAgICAgIH0KKyAgICB9OworICAgIEp2bU9wZXJhdGlvbiBfbWV0aG9kXzYgPSB0aGlzLl9qdm1UeXBlc0J1aWxkZXIudG9NZXRob2QoY2hhcnQsICJzdWJzY3JpYmUiLCBfdHlwZVJlZl82LCBfZnVuY3Rpb25fNik7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzYsIF9tZXRob2RfNik7CisgICAgRUxpc3Q8SnZtTWVtYmVyPiBfbWVtYmVyc183ID0gdHlwZS5nZXRNZW1iZXJzKCk7CisgICAgSnZtVHlwZVJlZmVyZW5jZSBfdHlwZVJlZl83ID0gdGhpcy5fdHlwZVJlZmVyZW5jZUJ1aWxkZXIudHlwZVJlZihWb2lkLlRZUEUpOworICAgIGZpbmFsIFByb2NlZHVyZTE8SnZtT3BlcmF0aW9uPiBfZnVuY3Rpb25fNyA9IG5ldyBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4oKSB7CisgICAgICBwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBKdm1PcGVyYXRpb24gaXQpIHsKKyAgICAgICAgaXQuc2V0VmlzaWJpbGl0eShKdm1WaXNpYmlsaXR5LlBST1RFQ1RFRCk7CisgICAgICAgIEVMaXN0PEp2bUFubm90YXRpb25SZWZlcmVuY2U+IF9hbm5vdGF0aW9ucyA9IGl0LmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEp2bUFubm90YXRpb25SZWZlcmVuY2UgX2Fubm90YXRpb25SZWYgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fYW5ub3RhdGlvblR5cGVzQnVpbGRlci5hbm5vdGF0aW9uUmVmKFByZURlc3Ryb3kuY2xhc3MpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPm9wZXJhdG9yX2FkZChfYW5ub3RhdGlvbnMsIF9hbm5vdGF0aW9uUmVmKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfdW5zdWJzY3JpYmUgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy51bnN1YnNjcmliZShjaGFydCk7CisgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX3Vuc3Vic2NyaWJlLCAiIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2RfNyA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChjaGFydCwgInVuc3Vic2NyaWJlIiwgX3R5cGVSZWZfNywgX2Z1bmN0aW9uXzcpOworICAgIHRoaXMuX2p2bVR5cGVzQnVpbGRlci48SnZtT3BlcmF0aW9uPm9wZXJhdG9yX2FkZChfbWVtYmVyc183LCBfbWV0aG9kXzcpOworICAgIEVMaXN0PEp2bU1lbWJlcj4gX21lbWJlcnNfOCA9IHR5cGUuZ2V0TWVtYmVycygpOworICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfOCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoVm9pZC5UWVBFKTsKKyAgICBmaW5hbCBQcm9jZWR1cmUxPEp2bU9wZXJhdGlvbj4gX2Z1bmN0aW9uXzggPSBuZXcgUHJvY2VkdXJlMTxKdm1PcGVyYXRpb24+KCkgeworICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSnZtT3BlcmF0aW9uIGl0KSB7CisgICAgICAgIGl0LnNldFZpc2liaWxpdHkoSnZtVmlzaWJpbGl0eS5QVUJMSUMpOworICAgICAgICBFTGlzdDxKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlPiBfYW5ub3RhdGlvbnMgPSBpdC5nZXRBbm5vdGF0aW9ucygpOworICAgICAgICBKdm1Bbm5vdGF0aW9uUmVmZXJlbmNlIF9hbm5vdGF0aW9uUmVmID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2Fubm90YXRpb25UeXBlc0J1aWxkZXIuYW5ub3RhdGlvblJlZihPdmVycmlkZS5jbGFzcyk7CisgICAgICAgIENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLl9qdm1UeXBlc0J1aWxkZXIuPEp2bUFubm90YXRpb25SZWZlcmVuY2U+b3BlcmF0b3JfYWRkKF9hbm5vdGF0aW9ucywgX2Fubm90YXRpb25SZWYpOworICAgICAgICBFTGlzdDxKdm1Gb3JtYWxQYXJhbWV0ZXI+IF9wYXJhbWV0ZXJzID0gaXQuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmID0gQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoTG9jYWxlLmNsYXNzKTsKKyAgICAgICAgSnZtRm9ybWFsUGFyYW1ldGVyIF9wYXJhbWV0ZXIgPSBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLnRvUGFyYW1ldGVyKGNoYXJ0LCAibG9jYWxlIiwgX3R5cGVSZWYpOworICAgICAgICBDaGFydERTTEp2bU1vZGVsSW5mZXJyZXIudGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1Gb3JtYWxQYXJhbWV0ZXI+b3BlcmF0b3JfYWRkKF9wYXJhbWV0ZXJzLCBfcGFyYW1ldGVyKTsKKyAgICAgICAgZmluYWwgUHJvY2VkdXJlMTxJVHJlZUFwcGVuZGFibGU+IF9mdW5jdGlvbiA9IG5ldyBQcm9jZWR1cmUxPElUcmVlQXBwZW5kYWJsZT4oKSB7CisgICAgICAgICAgcHVibGljIHZvaWQgYXBwbHkoZmluYWwgSVRyZWVBcHBlbmRhYmxlIGl0KSB7CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBfbG9jYWxlQ2hhbmdlZCA9IENoYXJ0RFNMSnZtTW9kZWxJbmZlcnJlci50aGlzLmxvY2FsZUNoYW5nZWQoY2hhcnQpOworICAgICAgICAgICAgX2J1aWxkZXIuYXBwZW5kKF9sb2NhbGVDaGFuZ2VkLCAiIik7CisgICAgICAgICAgICBpdC5hcHBlbmQoX2J1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQ2hhcnREU0xKdm1Nb2RlbEluZmVycmVyLnRoaXMuX2p2bVR5cGVzQnVpbGRlci5zZXRCb2R5KGl0LCBfZnVuY3Rpb24pOworICAgICAgfQorICAgIH07CisgICAgSnZtT3BlcmF0aW9uIF9tZXRob2RfOCA9IHRoaXMuX2p2bVR5cGVzQnVpbGRlci50b01ldGhvZChjaGFydCwgImxvY2FsZUNoYW5nZWQiLCBfdHlwZVJlZl84LCBfZnVuY3Rpb25fOCk7CisgICAgdGhpcy5fanZtVHlwZXNCdWlsZGVyLjxKdm1PcGVyYXRpb24+b3BlcmF0b3JfYWRkKF9tZW1iZXJzXzgsIF9tZXRob2RfOCk7CisgIH0KKyAgCisgIHB1YmxpYyBDaGFyU2VxdWVuY2Ugc3Vic2NyaWJlKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJldmVudEJyb2tlci5zdWJzY3JpYmUoRXZlbnRCcm9rZXJNc2cuUkVGUkVTSF9WSUVXK1wiIik7CisgICAgU3RyaW5nIF9uYW1lID0gY2hhcnQuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiQ2hhcnRcIiwgcmVmcmVzaFZpZXcpOyIpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgcHVibGljIENoYXJTZXF1ZW5jZSB1bnN1YnNjcmliZShmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZXZlbnRCcm9rZXIudW5zdWJzY3JpYmUocmVmcmVzaFZpZXcpOyIpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VEYXRhTWFydFJlZk5hbWUoZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBib29sZWFuIF9hbmQgPSBmYWxzZTsKKyAgICBib29sZWFuIF9hbmRfMSA9IGZhbHNlOworICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZSA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfc291cmNlLCBudWxsKSk7CisgICAgaWYgKCFfbm90RXF1YWxzKSB7CisgICAgICBfYW5kXzEgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgQ2hhcnREYXRhbWFydCBfc291cmNlXzEgPSBjaGFydC5nZXRTb3VyY2UoKTsKKyAgICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWYgPSBfc291cmNlXzEuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIGJvb2xlYW4gX25vdEVxdWFsc18xID0gKCFPYmplY3RzLmVxdWFsKF9kYXRhbWFydFJlZiwgbnVsbCkpOworICAgICAgX2FuZF8xID0gX25vdEVxdWFsc18xOworICAgIH0KKyAgICBpZiAoIV9hbmRfMSkgeworICAgICAgX2FuZCA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMiA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8xID0gX3NvdXJjZV8yLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBTdHJpbmcgX25hbWUgPSBfZGF0YW1hcnRSZWZfMS5nZXROYW1lKCk7CisgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMiA9ICghT2JqZWN0cy5lcXVhbChfbmFtZSwgbnVsbCkpOworICAgICAgX2FuZCA9IF9ub3RFcXVhbHNfMjsKKyAgICB9CisgICAgaWYgKF9hbmQpIHsKKyAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV8zID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmXzIgPSBfc291cmNlXzMuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIFN0cmluZyBfbmFtZV8xID0gX2RhdGFtYXJ0UmVmXzIuZ2V0TmFtZSgpOworICAgICAgcmV0dXJuIF9uYW1lXzEudG9TdHJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9CisgIAorICAvKioKKyAgICogPHA+YnVpbGQgdGhlIG1haW4gbWV0aG9kIHRvIGJlIGNhbGxlZCBmcm9tIGU0LjwvcD4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlVmlldyhmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY2hhcnRSZWZyZXNoZXJEb25lID0gZmFsc2U7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY2hhcnRzID0gbmV3IEFycmF5TGlzdDxEQ2hhcnRzPigpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImNvb3JkaW5hdGVTeXN0ZW0gPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZmlsdGVyR2VuZXJhdG9yID0gbmV3IERhdGFtYXJ0RmlsdGVyR2VuZXJhdG9yKCk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZmlsdGVyR2VuZXJhdG9yLnNldERzbE1ldGFkYXRhU2VydmljZShkc2xNZXRhZGF0YVNlcnZpY2UpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImxheW91dE1hbmFnZXIgPSBuZXcgVmlld0xheW91dE1hbmFnZXIoKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjaGFydFJlZnJlc2hlciA9IG5ldyBSZWZyZXNoZXIoKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjaGFydFJlbmRlckRlbGF5ID0gbmV3IFJlZnJlc2hlcigpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInByb3BlcnR5TG9va3VwTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLFByb3BlcnR5TG9va3VwPigpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBTdHJpbmcgYm9keSA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nIF9zb3VyY2VEYXRhTWFydFJlZk5hbWUgPSB0aGlzLmdldFNvdXJjZURhdGFNYXJ0UmVmTmFtZShjaGFydCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9zb3VyY2VEYXRhTWFydFJlZk5hbWUsIG51bGwpKTsKKyAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJkYXRhbWFydENsYXNzID0gbmV3ICIpOworICAgICAgU3RyaW5nIF9zb3VyY2VEYXRhTWFydFJlZk5hbWVfMSA9IHRoaXMuZ2V0U291cmNlRGF0YU1hcnRSZWZOYW1lKGNoYXJ0KTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9zb3VyY2VEYXRhTWFydFJlZk5hbWVfMSwgIiIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIkRhdGFtYXJ0KCk7Iik7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMS50b1N0cmluZygpOworICAgIH0KKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyXzIuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8yLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfMi5hcHBlbmQoInBhcmVudC5zZXRQcmltYXJ5U3R5bGVOYW1lKFwib3NicFwiKTsgLy8gPD09IGlzIFRISVMgbmVjZXNzYXJ5IGFueSBtb3JlPz8/Iik7CisgICAgX2J1aWxkZXJfMi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMi5hcHBlbmQoInBhcmVudC5hZGRTdHlsZU5hbWUoXCIiKTsKKyAgICBTdHJpbmcgX3N0eWxlTmFtZSA9IEVudW1Dc3NDbGFzcy5WSUVXLnN0eWxlTmFtZSgpOworICAgIF9idWlsZGVyXzIuYXBwZW5kKF9zdHlsZU5hbWUsICIiKTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXCIpOyIpOworICAgIF9idWlsZGVyXzIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZCgicGFyZW50LmFkZFN0eWxlTmFtZShcIiIpOworICAgIFN0cmluZyBfc3R5bGVOYW1lXzEgPSBFbnVtQ3NzQ2xhc3MuQ0hBUlRfVklFVy5zdHlsZU5hbWUoKTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZChfc3R5bGVOYW1lXzEsICIiKTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZCgiXCIpOyIpOworICAgIF9idWlsZGVyXzIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZCgicGFyZW50LnNldFNpemVGdWxsKCk7Iik7CisgICAgX2J1aWxkZXJfMi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMi5hcHBlbmQoImxheW91dE1hbmFnZXIuaW5pdChwYXJlbnQpOyIpOworICAgIF9idWlsZGVyXzIubmV3TGluZSgpOworICAgIF9idWlsZGVyXzIuYXBwZW5kKCJyZWZyZXNoVmlldyA9ICIpOworICAgIFN0cmluZyBfcmVmcmVzaFZpZXcgPSB0aGlzLnJlZnJlc2hWaWV3KGNoYXJ0KTsKKyAgICBfYnVpbGRlcl8yLmFwcGVuZChfcmVmcmVzaFZpZXcsICIiKTsKKyAgICBfYnVpbGRlcl8yLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyXzIudG9TdHJpbmcoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImNoYXJ0UmVuZGVyRGVsYXkuc2V0UmVmcmVzaEludGVydmFsKDEwMCk7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImNoYXJ0UmVuZGVyRGVsYXkuYWRkTGlzdGVuZXIobmV3IGNvbS5naXRodWIud29sZmllLnJlZnJlc2hlci5SZWZyZXNoZXIuUmVmcmVzaExpc3RlbmVyKCkgeyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJAT3ZlcnJpZGUiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgicHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBSZWZyZXNoZXIgc291cmNlKSB7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiLy8gcmVmcmVzaCBvbmx5IG9uY2UiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJsYXlvdXRNYW5hZ2VyLnJlbW92ZUV4dGVuc2lvbihzb3VyY2UpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImxvZy5kZWJ1ZyhcImluaXRpYWwgLSBzaG93IGRlbGF5ZWRcIik7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiZm9yKERDaGFydHMgY2hhcnQgOiBjaGFydHMpIHsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImNoYXJ0LnNob3coKTsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiY2hhcnRSZWZyZXNoZXJEb25lID0gdHJ1ZTsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJ9KTsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgibGF5b3V0TWFuYWdlci5hZGRFeHRlbnNpb24oY2hhcnRSZW5kZXJEZWxheSk7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoInVzZXIuYWRkVXNlckxvY2FsZUxpc3RlbmVyKHRoaXMpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8zLnRvU3RyaW5nKCk7CisgICAgYm9vbGVhbiBfaXNQb2xsaW5nID0gY2hhcnQuaXNQb2xsaW5nKCk7CisgICAgaWYgKF9pc1BvbGxpbmcpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiY2hhcnRSZWZyZXNoZXIuc2V0UmVmcmVzaEludGVydmFsKCIpOworICAgICAgaW50IF9wb2xsaW5nVGltZSA9IGNoYXJ0LmdldFBvbGxpbmdUaW1lKCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZChfcG9sbGluZ1RpbWUsICIiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCIqMTAwMCk7Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiY2hhcnRSZWZyZXNoZXIuYWRkTGlzdGVuZXIobmV3IGNvbS5naXRodWIud29sZmllLnJlZnJlc2hlci5SZWZyZXNoZXIuUmVmcmVzaExpc3RlbmVyKCkgeyIpOworICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJAT3ZlcnJpZGUiKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgicHVibGljIHZvaWQgcmVmcmVzaChmaW5hbCBSZWZyZXNoZXIgc291cmNlKSB7Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgicmVuZGVyRGF0YSgpOyIpOworICAgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9KTsiKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfNC5hcHBlbmQoImxheW91dE1hbmFnZXIuYWRkRXh0ZW5zaW9uKGNoYXJ0UmVmcmVzaGVyKTsiKTsKKyAgICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgICAgYm9keSA9IF9idWlsZGVyXzQudG9TdHJpbmcoKTsKKyAgICB9CisgICAgQ2hhcnREYXRhbWFydCBfc291cmNlID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzXzEgPSAoIU9iamVjdHMuZXF1YWwoX3NvdXJjZSwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzXzEpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZCgiZmlsdGVyQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVmFsdWVDaGFuZ2VMaXN0ZW5lcigpIHsiKTsKKyAgICAgIF9idWlsZGVyXzUubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfNS5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZCgiQE92ZXJyaWRlIik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfNS5hcHBlbmQoInB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlKGNvbS52YWFkaW4uZGF0YS5Qcm9wZXJ0eS5WYWx1ZUNoYW5nZUV2ZW50IGV2ZW50KSB7Iik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZCgicmVuZGVyRGF0YSgpOyIpOworICAgICAgX2J1aWxkZXJfNS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKCJ9OyIpOworICAgICAgX2J1aWxkZXJfNS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl81LmFwcGVuZCgiZmlsdGVyR2VuZXJhdG9yLmNyZWF0ZUZpbHRlcihkYXRhbWFydENsYXNzLCB1c2VyLCBmaWx0ZXJDaGFuZ2VMaXN0ZW5lciwgbGF5b3V0TWFuYWdlcik7Iik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmUoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl81LnRvU3RyaW5nKCk7CisgICAgfQorICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCIvLyB0byByZXNpemUgdGhlIGNoYXJ0IGFjY29yZGluZyB0byBicm93c2VyIik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJQYWdlLmdldEN1cnJlbnQoKS5hZGRCcm93c2VyV2luZG93UmVzaXplTGlzdGVuZXIobmV3IEJyb3dzZXJXaW5kb3dSZXNpemVMaXN0ZW5lcigpIHsiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiQE92ZXJyaWRlIik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoInB1YmxpYyB2b2lkIGJyb3dzZXJXaW5kb3dSZXNpemVkKEJyb3dzZXJXaW5kb3dSZXNpemVFdmVudCBldmVudCkgeyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoImxvZy5kZWJ1ZyhcImJyb3dzZXJXaW5kb3dSZXNpemVkIC0gbWFyayBkaXJ0eVwiKTsiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJnZXRQYXJlbnQoKS5tYXJrQXNEaXJ0eVJlY3Vyc2l2ZSgpOyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoIn0pOyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCIvLyB0byByZXNpemUgdGhlIGNoYXJ0IGFjY29yZGluZyB0byBzcGxpdCBwb3NpdGlvbnMgb2YgcGFydHNhc2hjb250YWluZXIgLSBzZXRDb250YWluZXJEYXRhIGlzIHRyYWNrZWQiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiRU9iamVjdCBjb250YWluZXIgPSAoKEVPYmplY3QpZWNsaXBzZUNvbnRleHQuZ2V0KE1VSUVsZW1lbnQuY2xhc3MpKS5lQ29udGFpbmVyKCk7Iik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoImlmKCEoY29udGFpbmVyIGluc3RhbmNlb2YgTVBhcnRTdGFjaykpIHsiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiY29udGFpbmVyID0gKEVPYmplY3QpZWNsaXBzZUNvbnRleHQuZ2V0KE1VSUVsZW1lbnQuY2xhc3MpOyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoImNvbnRhaW5lci5lQWRhcHRlcnMoKS5hZGQobmV3IEFkYXB0ZXJJbXBsKCkgeyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJpZiAobm90aWZpY2F0aW9uLmdldEV2ZW50VHlwZSgpPT1Ob3RpZmljYXRpb24uU0VUICYmICIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJub3RpZmljYXRpb24uZ2V0RmVhdHVyZUlEKFVJRWxlbWVudEltcGwuY2xhc3MpID09IFVpUGFja2FnZUltcGwuVUlfRUxFTUVOVF9fQ09OVEFJTkVSX0RBVEEpIik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgieyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgibG9nLmRlYnVnKFwic3BsaXQgcG9zaXRpb24gY2hhbmdlZCAtIG1hcmsgZGlydHlcIik7Iik7CisgICAgX2J1aWxkZXJfNi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJnZXRQYXJlbnQoKS5tYXJrQXNEaXJ0eVJlY3Vyc2l2ZSgpOyIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfNi5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl82LmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzYubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYuYXBwZW5kKCJ9KTsiKTsKKyAgICBfYnVpbGRlcl82Lm5ld0xpbmUoKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfNi50b1N0cmluZygpOworICAgIHJldHVybiBib2R5OworICB9CisgIAorICAvKioKKyAgICogPHA+Y3JlYXRlIGEgaGFuZGxlciBmb3IgZXh0ZXJuYWwgdHJpZ2dlcmVkIHJlZnJlc2ggcmVxdWVzdHMuPC9wPgorICAgKi8KKyAgcHVibGljIFN0cmluZyByZWZyZXNoVmlldyhmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZyBib2R5ID0gIiI7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgibmV3IEV2ZW50SGFuZGxlcigpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiQE92ZXJyaWRlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgicmVuZGVyRGF0YSgpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgifTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGJvZHk7CisgIH0KKyAgCisgIC8qKgorICAgKiA8cD5idWlsZCB0aGUgZGF0YSBjb21wb25lbnRzLjwvcD4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlQ29tcG9uZW50cyhmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZyBib2R5ID0gIiI7CisgICAgQ2hhcnREYXRhbWFydCBfc291cmNlID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9zb3VyY2UsIG51bGwpKTsKKyAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBnZXQgdGhlIHJlc3VsdHMiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoInRyeSB7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImZpbmFsIERlcml2ZWRDZWxsU2V0IGNlbGxTZXQgPSBkYXRhbWFydENsYXNzLmdldFJlc3VsdHModXNlciwgZmlsdGVyR2VuZXJhdG9yLmdldEZpbHRlcigiKTsKKyAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV8xID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gX3NvdXJjZV8xLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzIgPSBfZGF0YW1hcnRSZWYuZ2V0U291cmNlKCk7CisgICAgICBib29sZWFuIF9ib29sZWFuVmFsdWUgPSBCb29sZWFuLnZhbHVlT2YoKF9zb3VyY2VfMiBpbnN0YW5jZW9mIERhdGFtYXJ0Q3ViZSkpLmJvb2xlYW5WYWx1ZSgpOworICAgICAgU3RyaW5nIF9zdHJpbmcgPSBCb29sZWFuLnZhbHVlT2YoX2Jvb2xlYW5WYWx1ZSkudG9TdHJpbmcoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChfc3RyaW5nLCAiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiKSwgZ2V0VGFza09wZXJhdGl2ZUR0b0NsYXNzKCksIGdldFRhc2tJbml0aWFsT3BlcmF0aXZlRHRvcygpKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImdldENvb3JkaW5hdGVTeXN0ZW0oKS5jbGVhcigpOyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoY2VsbFNldCA9PSBudWxsKSB7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgicHJvbXB0U2VjdXJpdHlNZXNzYWdlKGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUobG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSwgXCJzZWN1cml0eU1lc3NhZ2VcIiksIGxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKSk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuOyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9IGVsc2UgeyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5yZW1vdmVBbGxDb21wb25lbnRzKCk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gZ2VuZXJhdGUgYSBuZXcgcmVzdWx0IGNvbXBvbmVudCIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoY2VsbFNldCAhPSBudWxsKSB7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gY3JlYXRlIGEgbXVsdGlkaW1lbnNpb25hbCBjb29yZGluYXRlIHN5c3RlbSBhZ2FpbnN0IHRoZSBjZWxsU2V0Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiZm9yXHQoaW50IGF4aXMgPSAwOyBheGlzIDwgY2VsbFNldC5nZXRBeGVzKCkuc2l6ZSgpOyBheGlzKyspIHsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImdldENvb3JkaW5hdGVTeXN0ZW0oKS5hZGQoMCk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIi8vIHJlbW92ZSBhbnkgcHJldmlvdXMgY29tcG9uZW50Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWZcdChkYXRhQ29tcG9uZW50ICE9IG51bGwpIHsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5yZW1vdmVDb21wb25lbnQoZGF0YUNvbXBvbmVudCk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJkYXRhQ29tcG9uZW50ID0gbnVsbDsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiaWYgKGNlbGxTZXQuZ2V0QXhlcygpLnNpemUoKSA8IDIpIHsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoImxvZy5lcnJvcihcImF0IGxlYXN0IDIgYXhlcyBmcm9tIHJlZmVyZW5jZWQgZGF0YW1hcnQgIik7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMyA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8xID0gX3NvdXJjZV8zLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBTdHJpbmcgX25hbWUgPSBfZGF0YW1hcnRSZWZfMS5nZXROYW1lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWUsICJcdFx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiIGFyZSBuZWVkZWQgdG8gcmVuZGVyICIpOworICAgICAgU3RyaW5nIF9uYW1lXzEgPSBjaGFydC5nZXROYW1lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoX25hbWVfMSwgIlx0XHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIik7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJkYXRhQ29tcG9uZW50ID0gY3JlYXRlVGFiU2hlZXQoY2VsbFNldCwgY2VsbFNldC5nZXRBeGVzKCkuc2l6ZSgpKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJkYXRhQ29tcG9uZW50LnNldFNpemVGdWxsKCk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiZGF0YUNvbXBvbmVudC5zZXRJZChcImRhdGFDb21wb25lbnRcIik7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiZGF0YUNvbXBvbmVudC5hZGRTdHlsZU5hbWUoXCIiKTsKKyAgICAgIFN0cmluZyBfc3R5bGVOYW1lID0gRW51bUNzc0NsYXNzLkRBVEFfQ09NUE9ORU5ULnN0eWxlTmFtZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9zdHlsZU5hbWUsICJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlwiKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgibGF5b3V0TWFuYWdlci5nZXREYXRhQXJlYSgpLmFkZENvbXBvbmVudChkYXRhQ29tcG9uZW50KTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuc2V0RXhwYW5kUmF0aW8oZGF0YUNvbXBvbmVudCwgMSk7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgiZWxzZSB7Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgibG9nLmVycm9yKFwicmVmZXJlbmNlZCBkYXRhbWFydCAiKTsKKyAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV80ID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmXzIgPSBfc291cmNlXzQuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIFN0cmluZyBfbmFtZV8yID0gX2RhdGFtYXJ0UmVmXzIuZ2V0TmFtZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKF9uYW1lXzIsICJcdFx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIiBnZW5lcmF0ZXMgbm8gcmVzdWx0c1wiKTsiKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZCgifSBjYXRjaCAoRGVyaXZlZE9sYXBFeGNlcHRpb24gZSkgeyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJsb2cuZXJyb3IoZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOyIpOworICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgICBib2R5ID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCIvLyBnZW5lcmF0ZSBhIG5ldyByZXN1bHQgY29tcG9uZW50Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJ0cnkgeyIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCIvLyByZW1vdmUgYW55IHByZXZpb3VzIGNvbXBvbmVudCIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJpZlx0KGRhdGFDb21wb25lbnQgIT0gbnVsbCkgeyIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHRcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoImxheW91dE1hbmFnZXIuZ2V0RGF0YUFyZWEoKS5yZW1vdmVDb21wb25lbnQoZGF0YUNvbXBvbmVudCk7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiZGF0YUNvbXBvbmVudCA9IG51bGw7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIn1cdFx0XHRcdCIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJkYXRhQ29tcG9uZW50ID0gY3JlYXRlVGFiU2hlZXQobnVsbCwgMik7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoImRhdGFDb21wb25lbnQuc2V0U2l6ZUZ1bGwoKTsiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiZGF0YUNvbXBvbmVudC5zZXRJZChcImRhdGFDb21wb25lbnRcIik7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoImRhdGFDb21wb25lbnQuYWRkU3R5bGVOYW1lKFwiIik7CisgICAgICBTdHJpbmcgX3N0eWxlTmFtZV8xID0gRW51bUNzc0NsYXNzLkRBVEFfQ09NUE9ORU5ULnN0eWxlTmFtZSgpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX3N0eWxlTmFtZV8xLCAiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcIik7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuYWRkQ29tcG9uZW50KGRhdGFDb21wb25lbnQpOyIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJsYXlvdXRNYW5hZ2VyLmdldERhdGFBcmVhKCkuc2V0RXhwYW5kUmF0aW8oZGF0YUNvbXBvbmVudCwgMSk7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJ9IGNhdGNoIChEZXJpdmVkT2xhcEV4Y2VwdGlvbiBlKSB7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoImxvZy5lcnJvcihlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl8xLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBib2R5OworICB9CisgIAorICAvKioKKyAgICogPHA+aWYgbW9yZSB0aGFuIDIgYXhlcyAoZGltZW5zaW9ucykgYXJlIGZvdW5kIGluIHRoZSBjZWxsU2V0LCBidWlsZCByZWN1cnNpdmUgdGFic2hlZXRzIGFzIGxvbmcgYXMgdGhlIHJlbWFpbmluZyBheGVzIGFyZSBtb3JlIHRoYW4gMi48L3A+CisgICAqLworICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVRhYlNoZWV0KGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjaGFydHMuY2xlYXIoKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBlaXRoZXIgY3JlYXRlIGEgcmVjdXJzaXZlIHRhYnNoZWV0IG9yIGEgY2hhcnQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJDb21wb25lbnQgY29tcG9uZW50ID0gbnVsbDsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJpZlx0KGF4aXNObyA9PSAyKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIFN0cmluZyBib2R5ID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKChfY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSkgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoInRyeSB7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiY29tcG9uZW50ID0gY3JlYXRlRDNDaGFydChjZWxsU2V0KTsiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgifSBjYXRjaCAoSnNvbkV4Y2VwdGlvbiBlKSB7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdFx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgibG9nLmVycm9yKGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZSgpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgifSIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lKCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMS50b1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXJfMi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoIlx0Iik7CisgICAgICBfYnVpbGRlcl8yLmFwcGVuZCgiY29tcG9uZW50ID0gY3JlYXRlQ2hhcnQoY2VsbFNldCk7Iik7CisgICAgICBfYnVpbGRlcl8yLm5ld0xpbmUoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl8yLnRvU3RyaW5nKCk7CisgICAgfQorICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyXzMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJlbHNlIHtcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIkludGVnZXIgYXhpcyA9IGF4aXNOby0xOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJUYWJTaGVldCB0YWJzaGVldCA9IG5ldyBUYWJTaGVldCgpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJ0YWJzaGVldC5zZXRTaXplRnVsbCgpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJEZXJpdmVkQXhpcyB0YWJBeGlzID0gY2VsbFNldC5nZXRBeGVzKCkuZ2V0KGF4aXMpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCIvLyBjcmVhdGUgYSB0YWIgcGFnZSBmb3IgYWxsIHRhYiBheGlzIG1lbWJlcnMiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiaW50IHRhYk5vID0gMDsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiZm9yXHQoRGVyaXZlZFBvc2l0aW9uIGNvbHVtbiA6IHRhYkF4aXMuZ2V0UG9zaXRpb25zKCkpIHsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCIvLyBjcmVhdGUgdGhlIHRpdGxlIGZvciB0aGUgYXhpcyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlN0cmluZyB0aXRsZSA9IG51bGw7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiZm9yIChEZXJpdmVkTWVtYmVyIG1lbWJlciA6IGNvbHVtbi5nZXRNZW1iZXJzKCkpIHsiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImlmXHQodGl0bGUgPT0gbnVsbCkgeyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJ0aXRsZSA9IGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUodXNlci5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCksIG1lbWJlci5nZXRDYXB0aW9uKCkpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiZWxzZSB7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoInRpdGxlICs9IFwiIC8gXCIrZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgbWVtYmVyLmdldENhcHRpb24oKSk7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIi8vIHBvc2l0aW9uIHRoZSBkYXRhIHRvIHRoaXMgY29vcmRpbmF0ZSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImdldENvb3JkaW5hdGVTeXN0ZW0oKS5zZXQoYXhpcywgdGFiTm8pOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImNvbXBvbmVudCA9IGNyZWF0ZVRhYlNoZWV0KGNlbGxTZXQsIGF4aXMpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIi8vIHNldCB0aGUgY2FwdGlvbiIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoImlmIChjb21wb25lbnQgIT0gbnVsbCkgeyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiY29tcG9uZW50LnNldENhcHRpb24odGl0bGUpOyIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiLy8gYWRkIHRoZSBjb21wb25lbnQgYXMgYSB0YWIgcGFnZSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgidGFic2hlZXQuYWRkQ29tcG9uZW50KGNvbXBvbmVudCk7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzMubmV3TGluZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoInRhYk5vKys7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgiY29tcG9uZW50ID0gdGFic2hlZXQ7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8zLmFwcGVuZCgicmV0dXJuIGNvbXBvbmVudDsiKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfMy50b1N0cmluZygpOworICAgIHJldHVybiBib2R5OworICB9CisgIAorICAvKioKKyAgICogPHA+YnVpbGQgdGhlIGNoYXJ0IGNvbXBvbmVudHMuPC9wPgorICAgKi8KKyAgcHVibGljIFN0cmluZyBjcmVhdGVDaGFydChmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZyBib2R5ID0gIiI7CisgICAgU3RyaW5nIHBvc3RmaXggPSAiIjsKKyAgICBTdHJpbmcgY2hhcnRUeXBlID0gIiI7CisgICAgYm9vbGVhbiBoYXNBeGlzID0gdHJ1ZTsKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtdWx0aXBsZUF4ZXMgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPFN0cmluZywgU3RyaW5nPm5ld0hhc2hNYXAoKTsKKyAgICBDaGFydEF4aXMgY2F0ZWdvcnlfYXhpcyA9IG51bGw7CisgICAgQ2hhcnRBeGlzIGRhdGFfYXhpcyA9IG51bGw7CisgICAgQ2hhcnRBeGlzIGlubmVyX2F4aXMgPSBudWxsOworICAgIENoYXJ0QXhpcyBvdXRlcl9heGlzID0gbnVsbDsKKyAgICBib29sZWFuIGF4aXNTd2l0Y2ggPSBmYWxzZTsKKyAgICBTdHJpbmcgYXhpc1ByZWZpeCA9ICJYWSI7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0QmFyKSkgeworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBib29sZWFuIF9pc1N3YXBwZWQgPSAoKENoYXJ0QmFyKSBfY2hhcnR0eXBlXzEpLmlzU3dhcHBlZCgpOworICAgICAgaWYgKF9pc1N3YXBwZWQpIHsKKyAgICAgICAgYXhpc1ByZWZpeCA9ICJZWCI7CisgICAgICAgIGF4aXNTd2l0Y2ggPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2UgPSBjaGFydC5nZXRTb3VyY2UoKTsKKyAgICBFTGlzdDxDaGFydEVsZW1lbnQ+IF9lbGVtZW50cyA9IF9zb3VyY2UuZ2V0RWxlbWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIENoYXJ0RWxlbWVudCBlbGVtZW50IDogX2VsZW1lbnRzKSB7CisgICAgICBpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBDaGFydEF4aXMpKSB7CisgICAgICAgIENoYXJ0QXhpcyBheGlzID0gKChDaGFydEF4aXMpIGVsZW1lbnQpOworICAgICAgICBib29sZWFuIF9vciA9IGZhbHNlOworICAgICAgICBEYXRhbWFydEF4aXMgX2F4aXMgPSBheGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWUgPSBfYXhpcy5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbmFtZV8xID0gX25hbWUuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbmFtZV8xLmVxdWFscygiQ09MVU1OUyIpOworICAgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICAgIF9vciA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzEgPSBheGlzLmdldEF4aXMoKTsKKyAgICAgICAgICBBeGlzRW51bSBfbmFtZV8yID0gX2F4aXNfMS5nZXROYW1lKCk7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzMgPSBfbmFtZV8yLmdldE5hbWUoKTsKKyAgICAgICAgICBib29sZWFuIF9lcXVhbHNfMSA9IF9uYW1lXzMuZXF1YWxzKCJST1dTIik7CisgICAgICAgICAgX29yID0gX2VxdWFsc18xOworICAgICAgICB9CisgICAgICAgIGlmIChfb3IpIHsKKyAgICAgICAgICBib29sZWFuIF9vcl8xID0gZmFsc2U7CisgICAgICAgICAgYm9vbGVhbiBfb3JfMiA9IGZhbHNlOworICAgICAgICAgIFJlbmRlclR5cGVFbnVtIF9yZW5kZXJUeXBlID0gYXhpcy5nZXRSZW5kZXJUeXBlKCk7CisgICAgICAgICAgU3RyaW5nIF9uYW1lXzQgPSBfcmVuZGVyVHlwZS5nZXROYW1lKCk7CisgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzIgPSBfbmFtZV80LmVxdWFscygiTE9HIik7CisgICAgICAgICAgaWYgKF9lcXVhbHNfMikgeworICAgICAgICAgICAgX29yXzIgPSB0cnVlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZW5kZXJUeXBlRW51bSBfcmVuZGVyVHlwZV8xID0gYXhpcy5nZXRSZW5kZXJUeXBlKCk7CisgICAgICAgICAgICBTdHJpbmcgX25hbWVfNSA9IF9yZW5kZXJUeXBlXzEuZ2V0TmFtZSgpOworICAgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzMgPSBfbmFtZV81LmVxdWFscygiTElORUFSIik7CisgICAgICAgICAgICBfb3JfMiA9IF9lcXVhbHNfMzsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9vcl8yKSB7CisgICAgICAgICAgICBfb3JfMSA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlbmRlclR5cGVFbnVtIF9yZW5kZXJUeXBlXzIgPSBheGlzLmdldFJlbmRlclR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBfbmFtZV82ID0gX3JlbmRlclR5cGVfMi5nZXROYW1lKCk7CisgICAgICAgICAgICBib29sZWFuIF9lcXVhbHNfNCA9IF9uYW1lXzYuZXF1YWxzKCJQWVJBTUlEIik7CisgICAgICAgICAgICBfb3JfMSA9IF9lcXVhbHNfNDsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9vcl8xKSB7CisgICAgICAgICAgICBkYXRhX2F4aXMgPSBheGlzOworICAgICAgICAgIH0KKyAgICAgICAgICBib29sZWFuIF9vcl8zID0gZmFsc2U7CisgICAgICAgICAgUmVuZGVyVHlwZUVudW0gX3JlbmRlclR5cGVfMyA9IGF4aXMuZ2V0UmVuZGVyVHlwZSgpOworICAgICAgICAgIFN0cmluZyBfbmFtZV83ID0gX3JlbmRlclR5cGVfMy5nZXROYW1lKCk7CisgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzUgPSBfbmFtZV83LmVxdWFscygiQ0FURUdPUlkiKTsKKyAgICAgICAgICBpZiAoX2VxdWFsc181KSB7CisgICAgICAgICAgICBfb3JfMyA9IHRydWU7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlbmRlclR5cGVFbnVtIF9yZW5kZXJUeXBlXzQgPSBheGlzLmdldFJlbmRlclR5cGUoKTsKKyAgICAgICAgICAgIFN0cmluZyBfbmFtZV84ID0gX3JlbmRlclR5cGVfNC5nZXROYW1lKCk7CisgICAgICAgICAgICBib29sZWFuIF9lcXVhbHNfNiA9IF9uYW1lXzguZXF1YWxzKCJEQVRFIik7CisgICAgICAgICAgICBfb3JfMyA9IF9lcXVhbHNfNjsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKF9vcl8zKSB7CisgICAgICAgICAgICBjYXRlZ29yeV9heGlzID0gYXhpczsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8yID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKChfY2hhcnR0eXBlXzIgaW5zdGFuY2VvZiBDaGFydEJhcikpIHsKKyAgICAgIGNoYXJ0VHlwZSA9ICJCQVIiOworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlci5hcHBlbmQoIl8iKTsKKyAgICAgIF9idWlsZGVyLmFwcGVuZChjaGFydFR5cGUsICIiKTsKKyAgICAgIHBvc3RmaXggPSBfYnVpbGRlci50b1N0cmluZygpOworICAgICAgaW5uZXJfYXhpcyA9IGNhdGVnb3J5X2F4aXM7CisgICAgICBvdXRlcl9heGlzID0gZGF0YV9heGlzOworICAgIH0gZWxzZSB7CisgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzMgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgIGlmICgoX2NoYXJ0dHlwZV8zIGluc3RhbmNlb2YgQ2hhcnRCdWJibGUpKSB7CisgICAgICAgIGNoYXJ0VHlwZSA9ICJCVUJCTEUiOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXyIpOworICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZChjaGFydFR5cGUsICIiKTsKKyAgICAgICAgcG9zdGZpeCA9IF9idWlsZGVyXzEudG9TdHJpbmcoKTsKKyAgICAgICAgaGFzQXhpcyA9IHRydWU7CisgICAgICAgIGlubmVyX2F4aXMgPSBkYXRhX2F4aXM7CisgICAgICAgIG91dGVyX2F4aXMgPSBjYXRlZ29yeV9heGlzOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV80ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgIGlmICgoX2NoYXJ0dHlwZV80IGluc3RhbmNlb2YgQ2hhcnREb251dCkpIHsKKyAgICAgICAgICBjaGFydFR5cGUgPSAiRE9OVVQiOworICAgICAgICAgIGhhc0F4aXMgPSBmYWxzZTsKKyAgICAgICAgICBpbm5lcl9heGlzID0gY2F0ZWdvcnlfYXhpczsKKyAgICAgICAgICBvdXRlcl9heGlzID0gZGF0YV9heGlzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfNSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgIGlmICgoX2NoYXJ0dHlwZV81IGluc3RhbmNlb2YgQ2hhcnRMaW5lKSkgeworICAgICAgICAgICAgY2hhcnRUeXBlID0gIkxJTkUiOworICAgICAgICAgICAgaW5uZXJfYXhpcyA9IGNhdGVnb3J5X2F4aXM7CisgICAgICAgICAgICBvdXRlcl9heGlzID0gZGF0YV9heGlzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzYgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgIGlmICgoX2NoYXJ0dHlwZV82IGluc3RhbmNlb2YgQ2hhcnRQaWUpKSB7CisgICAgICAgICAgICAgIGNoYXJ0VHlwZSA9ICJQSUUiOworICAgICAgICAgICAgICBoYXNBeGlzID0gZmFsc2U7CisgICAgICAgICAgICAgIGlubmVyX2F4aXMgPSBkYXRhX2F4aXM7CisgICAgICAgICAgICAgIG91dGVyX2F4aXMgPSBjYXRlZ29yeV9heGlzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV83ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgICAgICAgIGlmICgoX2NoYXJ0dHlwZV83IGluc3RhbmNlb2YgQ2hhcnRHYXVnZSkpIHsKKyAgICAgICAgICAgICAgICBjaGFydFR5cGUgPSAiTUVURVJfR0FVR0UiOworICAgICAgICAgICAgICAgIGhhc0F4aXMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpbm5lcl9heGlzID0gZGF0YV9heGlzOworICAgICAgICAgICAgICAgIG91dGVyX2F4aXMgPSBjYXRlZ29yeV9heGlzOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMi5hcHBlbmQoIkxpc3Q8SW50ZWdlcj4gY29vcmRpbmF0ZSA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oZ2V0Q29vcmRpbmF0ZVN5c3RlbSgpKTsiKTsKKyAgICBfYnVpbGRlcl8yLm5ld0xpbmUoKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfMi50b1N0cmluZygpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCIvLyBjcmVhdGUgYSBsYWJlbCBzZXJpZXMiKTsKKyAgICBfYnVpbGRlcl8zLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIkxpc3Q8U3RyaW5nPiAiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMiA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfOSA9IF9heGlzXzIuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfbGl0ZXJhbCA9IF9uYW1lXzkuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKF9saXRlcmFsLCAiIik7CisgICAgX2J1aWxkZXJfMy5hcHBlbmQoIlRpdGxlc0FycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCJmb3JcdChEZXJpdmVkUG9zaXRpb24gcG9zIDogY2VsbFNldC5nZXRBeGVzKCkuZ2V0KCIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc18zID0gZGF0YV9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8xMCA9IF9heGlzXzMuZ2V0TmFtZSgpOworICAgIGludCBfdmFsdWUgPSBfbmFtZV8xMC5nZXRWYWx1ZSgpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKF92YWx1ZSwgIiIpOworICAgIF9idWlsZGVyXzMuYXBwZW5kKCIpLmdldFBvc2l0aW9ucygpKSB7Iik7CisgICAgX2J1aWxkZXJfMy5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8zLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZChib2R5LCAiIik7CisgICAgX2J1aWxkZXJfNC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJTdHJpbmcgdGl0bGUgPSBudWxsOyIpOworICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJCb29sZWFuIHZhbHVlVXNlZCA9IGZhbHNlOyIpOworICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJmb3IgKERlcml2ZWRNZW1iZXIgbWVtYmVyIDogcG9zLmdldE1lbWJlcnMoKSkgeyIpOworICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoImlmXHQodGl0bGUgPT0gbnVsbCkgeyIpOworICAgIF9idWlsZGVyXzQubmV3TGluZSgpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgidGl0bGUgPSBkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKHVzZXIuZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLCBtZW1iZXIuZ2V0Q2FwdGlvbigpKTsiKTsKKyAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgiZWxzZSB7Iik7CisgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ0aXRsZSArPSBcIiBcIitkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKHVzZXIuZ2V0TG9jYWxlKCkudG9MYW5ndWFnZVRhZygpLCBtZW1iZXIuZ2V0Q2FwdGlvbigpKTsiKTsKKyAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzQuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfNC5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgiXHQiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfNCA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMTEgPSBfYXhpc180LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfMSA9IF9uYW1lXzExLmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZChfbGl0ZXJhbF8xLCAiXHQiKTsKKyAgICBfYnVpbGRlcl80LmFwcGVuZCgiVGl0bGVzQXJyYXkuYWRkKHRpdGxlKTsiKTsKKyAgICBfYnVpbGRlcl80Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfNC5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl80Lm5ld0xpbmUoKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfNC50b1N0cmluZygpOworICAgIGlmIChoYXNBeGlzKSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzUgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfNS5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXJfNS5hcHBlbmQoIlNlcmllcyAiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc181ID0gZGF0YV9heGlzLmdldEF4aXMoKTsKKyAgICAgIEF4aXNFbnVtIF9uYW1lXzEyID0gX2F4aXNfNS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMiA9IF9uYW1lXzEyLmdldExpdGVyYWwoKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKF9saXRlcmFsXzIsICIiKTsKKyAgICAgIF9idWlsZGVyXzUuYXBwZW5kKCJTZXJpZXMgPSBuZXcgU2VyaWVzKCk7Iik7CisgICAgICBfYnVpbGRlcl81Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfNS50b1N0cmluZygpOworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl82ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzYuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzYuYXBwZW5kKCJpZiAoIik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfNiA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgICBBeGlzRW51bSBfbmFtZV8xMyA9IF9heGlzXzYuZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzMgPSBfbmFtZV8xMy5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl82LmFwcGVuZChfbGl0ZXJhbF8zLCAiIik7CisgICAgICBfYnVpbGRlcl82LmFwcGVuZCgiVGl0bGVzQXJyYXkuc2l6ZSgpID4gMCkgeyIpOworICAgICAgX2J1aWxkZXJfNi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgYm9keSA9IF9idWlsZGVyXzYudG9TdHJpbmcoKTsKKyAgICAgIGJvb2xlYW4gc2hvd01hcmtlciA9IGZhbHNlOworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV84ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBpZiAoKF9jaGFydHR5cGVfOCBpbnN0YW5jZW9mIENoYXJ0TGluZSkpIHsKKyAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV85ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgIGJvb2xlYW4gX2lzU2hvd01hcmtlciA9ICgoQ2hhcnRMaW5lKSBfY2hhcnR0eXBlXzkpLmlzU2hvd01hcmtlcigpOworICAgICAgICBzaG93TWFya2VyID0gX2lzU2hvd01hcmtlcjsKKyAgICAgIH0KKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl83LmFwcGVuZChib2R5LCAiIik7CisgICAgICBTdHJpbmcgX2NyZWF0ZUxhYmVsU2VyaWVzID0gdGhpcy5jcmVhdGVMYWJlbFNlcmllcyhjaGFydCwgZGF0YV9heGlzLCBtdWx0aXBsZUF4ZXMsIGF4aXNQcmVmaXgsIHNob3dNYXJrZXIpOworICAgICAgX2J1aWxkZXJfNy5hcHBlbmQoX2NyZWF0ZUxhYmVsU2VyaWVzLCAiIik7CisgICAgICBib2R5ID0gX2J1aWxkZXJfNy50b1N0cmluZygpOworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl84ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzguYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzguYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl84Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfOC50b1N0cmluZygpOworICAgIH0KKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzkgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiLy8gY3JlYXRlIHRoZSBkYXRhIHNlcmllcyB0aWNrcyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiU3RyaW5nICIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc183ID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMTQgPSBfYXhpc183LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfNCA9IF9uYW1lXzE0LmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZChfbGl0ZXJhbF80LCAiIik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIkF4aXNMYWJlbCA9IFwiXCI7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJCb29sZWFuICIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc184ID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMTUgPSBfYXhpc184LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfNSA9IF9uYW1lXzE1LmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZChfbGl0ZXJhbF81LCAiIik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIkF4aXNMYWJlbFNldCA9IGZhbHNlOyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiTGlzdDxTdHJpbmc+ICIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc185ID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMTYgPSBfYXhpc185LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfNiA9IF9uYW1lXzE2LmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZChfbGl0ZXJhbF82LCAiIik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIlRpdGxlc0FycmF5ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJmb3JcdChEZXJpdmVkUG9zaXRpb24gcG9zIDogY2VsbFNldC5nZXRBeGVzKCkuZ2V0KCIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc18xMCA9IGNhdGVnb3J5X2F4aXMuZ2V0QXhpcygpOworICAgIEF4aXNFbnVtIF9uYW1lXzE3ID0gX2F4aXNfMTAuZ2V0TmFtZSgpOworICAgIGludCBfdmFsdWVfMSA9IF9uYW1lXzE3LmdldFZhbHVlKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoX3ZhbHVlXzEsICIiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiKS5nZXRQb3NpdGlvbnMoKSkgeyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiU3RyaW5nIHRpdGxlID0gXCJcIjsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiZm9yIChEZXJpdmVkTWVtYmVyIG1lbWJlciA6IHBvcy5nZXRNZW1iZXJzKCkpIHsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiICAgIFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIlN0cmluZ1tdIHRva2VucyA9IG1lbWJlci5nZXRVbmlxdWVOYW1lKCkuc3BsaXQoXCJcXFxcXVxcXFwuXFxcXFtcIik7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJpZiAoISIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc18xMSA9IGNhdGVnb3J5X2F4aXMuZ2V0QXhpcygpOworICAgIEF4aXNFbnVtIF9uYW1lXzE4ID0gX2F4aXNfMTEuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfbGl0ZXJhbF83ID0gX25hbWVfMTguZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKF9saXRlcmFsXzcsICIgICAgXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiQXhpc0xhYmVsU2V0KSB7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCIgICAgXHRcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJpZiAoIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzEyID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMTkgPSBfYXhpc18xMi5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzggPSBfbmFtZV8xOS5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoX2xpdGVyYWxfOCwgIiAgICBcdFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIkF4aXNMYWJlbC5sZW5ndGgoKSA+IDApIHsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdFx0XHQiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMTMgPSBjYXRlZ29yeV9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8yMCA9IF9heGlzXzEzLmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfOSA9IF9uYW1lXzIwLmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZChfbGl0ZXJhbF85LCAiICAgIFx0XHRcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJBeGlzTGFiZWwgKz0gXCIgLyBcIjsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiICAgIFx0XHQiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMTQgPSBjYXRlZ29yeV9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8yMSA9IF9heGlzXzE0LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfMTAgPSBfbmFtZV8yMS5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoX2xpdGVyYWxfMTAsICIgICAgXHRcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJBeGlzTGFiZWwgKz0gZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZSh1c2VyLmdldExvY2FsZSgpLnRvTGFuZ3VhZ2VUYWcoKSwgbWVtYmVyLmdldExldmVsKCkuZ2V0TmFtZSgpKTsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJpbnQgc3RhcnQgPSAxOyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCIgICAgXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiLy8gaWYgc2hvcnRsYWJlbCBpcyBjb25maWd1cmVkLCB1c2Ugb25seSBsYXN0IGxldmVsIG5hbWUiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiICAgIFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoImlmICgiKTsKKyAgICBib29sZWFuIF9pc1Nob3J0TGFiZWwgPSBjYXRlZ29yeV9heGlzLmlzU2hvcnRMYWJlbCgpOworICAgIGJvb2xlYW4gX2Jvb2xlYW5WYWx1ZSA9IEJvb2xlYW4udmFsdWVPZihfaXNTaG9ydExhYmVsKS5ib29sZWFuVmFsdWUoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZChfYm9vbGVhblZhbHVlLCAiICAgIFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIikgeyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiICAgIFx0XHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgic3RhcnQgPSB0b2tlbnMubGVuZ3RoLTE7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJmb3JcdChpbnQgdG9rZW4gPSBzdGFydDsgdG9rZW4gPCB0b2tlbnMubGVuZ3RoOyB0b2tlbisrKSB7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIiAgICBcdFx0Iik7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoInRpdGxlICs9IGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUodXNlci5nZXRMb2NhbGUoKS50b0xhbmd1YWdlVGFnKCksIHRva2Vuc1t0b2tlbl0pK1wiIFwiOyIpOworICAgIF9idWlsZGVyXzkubmV3TGluZSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCIgICAgXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyXzkubmV3TGluZSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIlx0Iik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzE1ID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMjIgPSBfYXhpc18xNS5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzExID0gX25hbWVfMjIuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKF9saXRlcmFsXzExLCAiXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiQXhpc0xhYmVsU2V0ID0gdHJ1ZTsiKTsKKyAgICBfYnVpbGRlcl85Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXJfOS5hcHBlbmQoIlx0Iik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzE2ID0gY2F0ZWdvcnlfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMjMgPSBfYXhpc18xNi5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzEyID0gX25hbWVfMjMuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKF9saXRlcmFsXzEyLCAiXHQiKTsKKyAgICBfYnVpbGRlcl85LmFwcGVuZCgiVGl0bGVzQXJyYXkuYWRkKHRpdGxlLnRyaW0oKS5yZXBsYWNlKFwiW1wiLCBcIlwiKS5yZXBsYWNlKFwiXVwiLCBcIlwiKSk7Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzkuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXJfOS5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyXzkudG9TdHJpbmcoKTsKKyAgICBpZiAoaGFzQXhpcykgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xMCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl8xMC5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXJfMTAuYXBwZW5kKCJUaWNrcyAiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc18xNyA9IGNhdGVnb3J5X2F4aXMuZ2V0QXhpcygpOworICAgICAgQXhpc0VudW0gX25hbWVfMjQgPSBfYXhpc18xNy5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMTMgPSBfbmFtZV8yNC5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl8xMC5hcHBlbmQoX2xpdGVyYWxfMTMsICIiKTsKKyAgICAgIF9idWlsZGVyXzEwLmFwcGVuZCgiVGlja3MgPSBuZXcgVGlja3MoKTsiKTsKKyAgICAgIF9idWlsZGVyXzEwLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMTggPSBjYXRlZ29yeV9heGlzLmdldEF4aXMoKTsKKyAgICAgIEF4aXNFbnVtIF9uYW1lXzI1ID0gX2F4aXNfMTguZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzE0ID0gX25hbWVfMjUuZ2V0TGl0ZXJhbCgpOworICAgICAgX2J1aWxkZXJfMTAuYXBwZW5kKF9saXRlcmFsXzE0LCAiIik7CisgICAgICBfYnVpbGRlcl8xMC5hcHBlbmQoIlRpY2tzLmFkZCgiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc18xOSA9IGNhdGVnb3J5X2F4aXMuZ2V0QXhpcygpOworICAgICAgQXhpc0VudW0gX25hbWVfMjYgPSBfYXhpc18xOS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMTUgPSBfbmFtZV8yNi5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl8xMC5hcHBlbmQoX2xpdGVyYWxfMTUsICIiKTsKKyAgICAgIF9idWlsZGVyXzEwLmFwcGVuZCgiVGl0bGVzQXJyYXkudG9BcnJheSgpKTsiKTsKKyAgICAgIF9idWlsZGVyXzEwLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMTAudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMTEuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8xMS5hcHBlbmQoIi8vIGNvcHkgY2VsbHNldCBkYXRhIHRvIGRhdGEgc2VyaWVzIik7CisgICAgX2J1aWxkZXJfMTEubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl8xMS5hcHBlbmQoIkRhdGFTZXJpZXMgZGF0YVNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKCk7Iik7CisgICAgX2J1aWxkZXJfMTEubmV3TGluZSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8xMS50b1N0cmluZygpOworICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMTAgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICBpZiAoKF9jaGFydHR5cGVfMTAgaW5zdGFuY2VvZiBDaGFydEJ1YmJsZSkpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMTIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMTIuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzEyLmFwcGVuZCgiZGF0YVNlcmllcy5uZXdTZXJpZXMoKTsiKTsKKyAgICAgIF9idWlsZGVyXzEyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMTIudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xMyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMTMuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8xMy5hcHBlbmQoImludCAiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMjAgPSBvdXRlcl9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8yNyA9IF9heGlzXzIwLmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfMTYgPSBfbmFtZV8yNy5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXJfMTMuYXBwZW5kKF9saXRlcmFsXzE2LCAiIik7CisgICAgX2J1aWxkZXJfMTMuYXBwZW5kKCJObyA9IDA7Iik7CisgICAgX2J1aWxkZXJfMTMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfMTMudG9TdHJpbmcoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzE0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlcl8xNC5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyXzE0LmFwcGVuZCgiZm9yXHQoRGVyaXZlZFBvc2l0aW9uICIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc18yMSA9IG91dGVyX2F4aXMuZ2V0QXhpcygpOworICAgIEF4aXNFbnVtIF9uYW1lXzI4ID0gX2F4aXNfMjEuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfbGl0ZXJhbF8xNyA9IF9uYW1lXzI4LmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl8xNC5hcHBlbmQoX2xpdGVyYWxfMTcsICIiKTsKKyAgICBfYnVpbGRlcl8xNC5hcHBlbmQoIlBvcyA6IGNlbGxTZXQuZ2V0QXhlcygpLmdldCgiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMjIgPSBvdXRlcl9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8yOSA9IF9heGlzXzIyLmdldE5hbWUoKTsKKyAgICBpbnQgX3ZhbHVlXzIgPSBfbmFtZV8yOS5nZXRWYWx1ZSgpOworICAgIF9idWlsZGVyXzE0LmFwcGVuZChfdmFsdWVfMiwgIiIpOworICAgIF9idWlsZGVyXzE0LmFwcGVuZCgiKS5nZXRQb3NpdGlvbnMoKSkgeyIpOworICAgIF9idWlsZGVyXzE0Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyXzE0LnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xNSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMTUuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8xNS5hcHBlbmQoIlx0Y29vcmRpbmF0ZS5zZXQoIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzIzID0gb3V0ZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMzAgPSBfYXhpc18yMy5nZXROYW1lKCk7CisgICAgaW50IF92YWx1ZV8zID0gX25hbWVfMzAuZ2V0VmFsdWUoKTsKKyAgICBfYnVpbGRlcl8xNS5hcHBlbmQoX3ZhbHVlXzMsICIiKTsKKyAgICBfYnVpbGRlcl8xNS5hcHBlbmQoIiwgIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzI0ID0gb3V0ZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMzEgPSBfYXhpc18yNC5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzE4ID0gX25hbWVfMzEuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzE1LmFwcGVuZChfbGl0ZXJhbF8xOCwgIiIpOworICAgIF9idWlsZGVyXzE1LmFwcGVuZCgiTm8pOyIpOworICAgIF9idWlsZGVyXzE1Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyXzE1LnRvU3RyaW5nKCk7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xMSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZV8xMSBpbnN0YW5jZW9mIENoYXJ0RG9udXQpKSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzE2ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzE2LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl8xNi5hcHBlbmQoIlx0ZGF0YVNlcmllcy5uZXdTZXJpZXMoKTsiKTsKKyAgICAgIF9idWlsZGVyXzE2Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMTYudG9TdHJpbmcoKTsKKyAgICB9CisgICAgaWYgKCgoIShjaGFydC5nZXRDaGFydHR5cGUoKSBpbnN0YW5jZW9mIENoYXJ0UGllKSkgJiYgKCEoY2hhcnQuZ2V0Q2hhcnR0eXBlKCkgaW5zdGFuY2VvZiBDaGFydERvbnV0KSkpKSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzE3ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzE3LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl8xNy5hcHBlbmQoIlx0QXJyYXlMaXN0PE9iamVjdD4gIik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMjUgPSBpbm5lcl9heGlzLmdldEF4aXMoKTsKKyAgICAgIEF4aXNFbnVtIF9uYW1lXzMyID0gX2F4aXNfMjUuZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzE5ID0gX25hbWVfMzIuZ2V0TGl0ZXJhbCgpOworICAgICAgX2J1aWxkZXJfMTcuYXBwZW5kKF9saXRlcmFsXzE5LCAiIik7CisgICAgICBfYnVpbGRlcl8xNy5hcHBlbmQoIkRhdGFTZXJpZXMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsiKTsKKyAgICAgIF9idWlsZGVyXzE3Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMTcudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xOCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMTguYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8xOC5hcHBlbmQoIlx0aW50ICIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpc18yNiA9IGlubmVyX2F4aXMuZ2V0QXhpcygpOworICAgIEF4aXNFbnVtIF9uYW1lXzMzID0gX2F4aXNfMjYuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfbGl0ZXJhbF8yMCA9IF9uYW1lXzMzLmdldExpdGVyYWwoKTsKKyAgICBfYnVpbGRlcl8xOC5hcHBlbmQoX2xpdGVyYWxfMjAsICIiKTsKKyAgICBfYnVpbGRlcl8xOC5hcHBlbmQoIk5vID0gMDsiKTsKKyAgICBfYnVpbGRlcl8xOC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8xOC50b1N0cmluZygpOworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMTkgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyXzE5LmFwcGVuZChib2R5LCAiIik7CisgICAgX2J1aWxkZXJfMTkuYXBwZW5kKCJcdGZvclx0KERlcml2ZWRQb3NpdGlvbiAiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMjcgPSBpbm5lcl9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV8zNCA9IF9heGlzXzI3LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfMjEgPSBfbmFtZV8zNC5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXJfMTkuYXBwZW5kKF9saXRlcmFsXzIxLCAiIik7CisgICAgX2J1aWxkZXJfMTkuYXBwZW5kKCJQb3MgOiBjZWxsU2V0LmdldEF4ZXMoKS5nZXQoIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzI4ID0gaW5uZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMzUgPSBfYXhpc18yOC5nZXROYW1lKCk7CisgICAgaW50IF92YWx1ZV80ID0gX25hbWVfMzUuZ2V0VmFsdWUoKTsKKyAgICBfYnVpbGRlcl8xOS5hcHBlbmQoX3ZhbHVlXzQsICIiKTsKKyAgICBfYnVpbGRlcl8xOS5hcHBlbmQoIikuZ2V0UG9zaXRpb25zKCkpIHsiKTsKKyAgICBfYnVpbGRlcl8xOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8xOS50b1N0cmluZygpOworICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMTIgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICBpZiAoKF9jaGFydHR5cGVfMTIgaW5zdGFuY2VvZiBDaGFydFBpZSkpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMjAgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMjAuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzIwLmFwcGVuZCgiXHRcdGRhdGFTZXJpZXMubmV3U2VyaWVzKCk7Iik7CisgICAgICBfYnVpbGRlcl8yMC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgYm9keSA9IF9idWlsZGVyXzIwLnRvU3RyaW5nKCk7CisgICAgfQorICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMjEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyXzIxLmFwcGVuZChib2R5LCAiIik7CisgICAgX2J1aWxkZXJfMjEuYXBwZW5kKCJcdFx0Y29vcmRpbmF0ZS5zZXQoIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzI5ID0gaW5uZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMzYgPSBfYXhpc18yOS5nZXROYW1lKCk7CisgICAgaW50IF92YWx1ZV81ID0gX25hbWVfMzYuZ2V0VmFsdWUoKTsKKyAgICBfYnVpbGRlcl8yMS5hcHBlbmQoX3ZhbHVlXzUsICIiKTsKKyAgICBfYnVpbGRlcl8yMS5hcHBlbmQoIiwgIik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzMwID0gaW5uZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMzcgPSBfYXhpc18zMC5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzIyID0gX25hbWVfMzcuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzIxLmFwcGVuZChfbGl0ZXJhbF8yMiwgIiIpOworICAgIF9idWlsZGVyXzIxLmFwcGVuZCgiTm8pOyIpOworICAgIF9idWlsZGVyXzIxLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyXzIxLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8yMiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMjIuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8yMi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzIyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyXzIyLmFwcGVuZCgiT2JqZWN0IHZhbHVlID0gbnVsbDsiKTsKKyAgICBfYnVpbGRlcl8yMi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMjIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXJfMjIuYXBwZW5kKCJEZXJpdmVkQ2VsbCBjZWxsID0gY2VsbFNldC5nZXRDZWxsKGNvb3JkaW5hdGUpOyIpOworICAgIF9idWlsZGVyXzIyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8yMi5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8yMi5hcHBlbmQoImlmIChjZWxsICE9IG51bGwpIHsiKTsKKyAgICBfYnVpbGRlcl8yMi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfMjIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlcl8yMi5hcHBlbmQoInZhbHVlID0gY2VsbC5nZXRWYWx1ZSgpOyIpOworICAgIF9idWlsZGVyXzIyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl8yMi5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlcl8yMi5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl8yMi5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyXzIyLnRvU3RyaW5nKCk7CisgICAgYm9vbGVhbiBfb3JfNCA9IGZhbHNlOworICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMTMgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICBpZiAoKF9jaGFydHR5cGVfMTMgaW5zdGFuY2VvZiBDaGFydFBpZSkpIHsKKyAgICAgIF9vcl80ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xNCA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgX29yXzQgPSAoX2NoYXJ0dHlwZV8xNCBpbnN0YW5jZW9mIENoYXJ0RG9udXQpOworICAgIH0KKyAgICBpZiAoX29yXzQpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMjMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMjMuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzIzLmFwcGVuZCgiXHRcdGRhdGFTZXJpZXMuYWRkKCIpOworICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzMxID0gb3V0ZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgICBBeGlzRW51bSBfbmFtZV8zOCA9IF9heGlzXzMxLmdldE5hbWUoKTsKKyAgICAgIFN0cmluZyBfbGl0ZXJhbF8yMyA9IF9uYW1lXzM4LmdldExpdGVyYWwoKTsKKyAgICAgIF9idWlsZGVyXzIzLmFwcGVuZChfbGl0ZXJhbF8yMywgIiIpOworICAgICAgX2J1aWxkZXJfMjMuYXBwZW5kKCJUaXRsZXNBcnJheS5nZXQoIik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMzIgPSBvdXRlcl9heGlzLmdldEF4aXMoKTsKKyAgICAgIEF4aXNFbnVtIF9uYW1lXzM5ID0gX2F4aXNfMzIuZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzI0ID0gX25hbWVfMzkuZ2V0TGl0ZXJhbCgpOworICAgICAgX2J1aWxkZXJfMjMuYXBwZW5kKF9saXRlcmFsXzI0LCAiIik7CisgICAgICBfYnVpbGRlcl8yMy5hcHBlbmQoIk5vKStcIiBcIisiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc18zMyA9IGlubmVyX2F4aXMuZ2V0QXhpcygpOworICAgICAgQXhpc0VudW0gX25hbWVfNDAgPSBfYXhpc18zMy5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMjUgPSBfbmFtZV80MC5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl8yMy5hcHBlbmQoX2xpdGVyYWxfMjUsICIiKTsKKyAgICAgIF9idWlsZGVyXzIzLmFwcGVuZCgiVGl0bGVzQXJyYXkuZ2V0KCIpOworICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzM0ID0gaW5uZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgICBBeGlzRW51bSBfbmFtZV80MSA9IF9heGlzXzM0LmdldE5hbWUoKTsKKyAgICAgIFN0cmluZyBfbGl0ZXJhbF8yNiA9IF9uYW1lXzQxLmdldExpdGVyYWwoKTsKKyAgICAgIF9idWlsZGVyXzIzLmFwcGVuZChfbGl0ZXJhbF8yNiwgIiIpOworICAgICAgX2J1aWxkZXJfMjMuYXBwZW5kKCJObyksKHZhbHVlID09IG51bGwgPyAwLjAgOiB2YWx1ZSkpOyIpOworICAgICAgX2J1aWxkZXJfMjMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl8yMy50b1N0cmluZygpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzI0ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzI0LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl8yNC5hcHBlbmQoIlx0XHQiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc18zNSA9IGlubmVyX2F4aXMuZ2V0QXhpcygpOworICAgICAgQXhpc0VudW0gX25hbWVfNDIgPSBfYXhpc18zNS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMjcgPSBfbmFtZV80Mi5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl8yNC5hcHBlbmQoX2xpdGVyYWxfMjcsICIiKTsKKyAgICAgIF9idWlsZGVyXzI0LmFwcGVuZCgiRGF0YVNlcmllcy5hZGQodmFsdWUgPT0gbnVsbCA/IDAuMCA6IHZhbHVlKTsiKTsKKyAgICAgIF9idWlsZGVyXzI0Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMjQudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8yNSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMjUuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8yNS5hcHBlbmQoIlx0XHQiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMzYgPSBpbm5lcl9heGlzLmdldEF4aXMoKTsKKyAgICBBeGlzRW51bSBfbmFtZV80MyA9IF9heGlzXzM2LmdldE5hbWUoKTsKKyAgICBTdHJpbmcgX2xpdGVyYWxfMjggPSBfbmFtZV80My5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXJfMjUuYXBwZW5kKF9saXRlcmFsXzI4LCAiIik7CisgICAgX2J1aWxkZXJfMjUuYXBwZW5kKCJObyArKzsiKTsKKyAgICBfYnVpbGRlcl8yNS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzI1LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8yNS5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl8yNS5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyXzI1LnRvU3RyaW5nKCk7CisgICAgaWYgKCgoIShjaGFydC5nZXRDaGFydHR5cGUoKSBpbnN0YW5jZW9mIENoYXJ0UGllKSkgJiYgKCEoY2hhcnQuZ2V0Q2hhcnR0eXBlKCkgaW5zdGFuY2VvZiBDaGFydERvbnV0KSkpKSB7CisgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzE1ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBpZiAoKF9jaGFydHR5cGVfMTUgaW5zdGFuY2VvZiBDaGFydEJ1YmJsZSkpIHsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8yNiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzI2LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzI2LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzM3ID0gaW5uZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgICAgIEF4aXNFbnVtIF9uYW1lXzQ0ID0gX2F4aXNfMzcuZ2V0TmFtZSgpOworICAgICAgICBTdHJpbmcgX2xpdGVyYWxfMjkgPSBfbmFtZV80NC5nZXRMaXRlcmFsKCk7CisgICAgICAgIF9idWlsZGVyXzI2LmFwcGVuZChfbGl0ZXJhbF8yOSwgIiIpOworICAgICAgICBfYnVpbGRlcl8yNi5hcHBlbmQoIkRhdGFTZXJpZXMuYWRkKCIpOworICAgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMzggPSBvdXRlcl9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNDUgPSBfYXhpc18zOC5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zMCA9IF9uYW1lXzQ1LmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfMjYuYXBwZW5kKF9saXRlcmFsXzMwLCAiIik7CisgICAgICAgIF9idWlsZGVyXzI2LmFwcGVuZCgiVGl0bGVzQXJyYXkuZ2V0KCIpOworICAgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMzkgPSBvdXRlcl9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNDYgPSBfYXhpc18zOS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zMSA9IF9uYW1lXzQ2LmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfMjYuYXBwZW5kKF9saXRlcmFsXzMxLCAiIik7CisgICAgICAgIF9idWlsZGVyXzI2LmFwcGVuZCgiTm8pKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfMjYubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzI2LnRvU3RyaW5nKCk7CisgICAgICB9CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzI3ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzI3LmFwcGVuZChib2R5LCAiIik7CisgICAgICBfYnVpbGRlcl8yNy5hcHBlbmQoIlx0ZGF0YVNlcmllcy5hZGQoIik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfNDAgPSBpbm5lcl9heGlzLmdldEF4aXMoKTsKKyAgICAgIEF4aXNFbnVtIF9uYW1lXzQ3ID0gX2F4aXNfNDAuZ2V0TmFtZSgpOworICAgICAgU3RyaW5nIF9saXRlcmFsXzMyID0gX25hbWVfNDcuZ2V0TGl0ZXJhbCgpOworICAgICAgX2J1aWxkZXJfMjcuYXBwZW5kKF9saXRlcmFsXzMyLCAiIik7CisgICAgICBfYnVpbGRlcl8yNy5hcHBlbmQoIkRhdGFTZXJpZXMudG9BcnJheSgpKTsiKTsKKyAgICAgIF9idWlsZGVyXzI3Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMjcudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8yOCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMjguYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8yOC5hcHBlbmQoIlx0Iik7CisgICAgRGF0YW1hcnRBeGlzIF9heGlzXzQxID0gb3V0ZXJfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfNDggPSBfYXhpc180MS5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsXzMzID0gX25hbWVfNDguZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyXzI4LmFwcGVuZChfbGl0ZXJhbF8zMywgIiIpOworICAgIF9idWlsZGVyXzI4LmFwcGVuZCgiTm8gKys7Iik7CisgICAgX2J1aWxkZXJfMjgubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl8yOC5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl8yOC5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyXzI4LnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8yOSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMjkuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8yOS5hcHBlbmQoIlNlcmllc0RlZmF1bHRzIHNlcmllc0RlZmF1bHRzID0gbmV3IFNlcmllc0RlZmF1bHRzKCkiKTsKKyAgICBfYnVpbGRlcl8yOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzI5LmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8yOS5hcHBlbmQoIi5zZXRSZW5kZXJlcihTZXJpZXNSZW5kZXJlcnMuIik7CisgICAgX2J1aWxkZXJfMjkuYXBwZW5kKGNoYXJ0VHlwZSwgIlx0Iik7CisgICAgX2J1aWxkZXJfMjkuYXBwZW5kKCIpOyIpOworICAgIF9idWlsZGVyXzI5Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyXzI5LnRvU3RyaW5nKCk7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xNiA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZV8xNiBpbnN0YW5jZW9mIENoYXJ0TGluZSkpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMzAgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMzAuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzMwLmFwcGVuZCgic2VyaWVzRGVmYXVsdHMuc2V0RmlsbFRvWmVybygiKTsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMTcgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgIGJvb2xlYW4gX2lzRmlsbFRvWmVybyA9ICgoQ2hhcnRMaW5lKSBfY2hhcnR0eXBlXzE3KS5pc0ZpbGxUb1plcm8oKTsKKyAgICAgIGJvb2xlYW4gX2Jvb2xlYW5WYWx1ZV8xID0gQm9vbGVhbi52YWx1ZU9mKF9pc0ZpbGxUb1plcm8pLmJvb2xlYW5WYWx1ZSgpOworICAgICAgU3RyaW5nIF9zdHJpbmcgPSBCb29sZWFuLnZhbHVlT2YoX2Jvb2xlYW5WYWx1ZV8xKS50b1N0cmluZygpOworICAgICAgX2J1aWxkZXJfMzAuYXBwZW5kKF9zdHJpbmcsICIiKTsKKyAgICAgIF9idWlsZGVyXzMwLmFwcGVuZCgiKS5zZXRGaWxsKCIpOworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xOCA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgYm9vbGVhbiBfaXNGaWxsQXJlYSA9ICgoQ2hhcnRMaW5lKSBfY2hhcnR0eXBlXzE4KS5pc0ZpbGxBcmVhKCk7CisgICAgICBTdHJpbmcgX3N0cmluZ18xID0gQm9vbGVhbi52YWx1ZU9mKF9pc0ZpbGxBcmVhKS50b1N0cmluZygpOworICAgICAgX2J1aWxkZXJfMzAuYXBwZW5kKF9zdHJpbmdfMSwgIiIpOworICAgICAgX2J1aWxkZXJfMzAuYXBwZW5kKCIpOyIpOworICAgICAgX2J1aWxkZXJfMzAubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl8zMC50b1N0cmluZygpOworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xOSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgYm9vbGVhbiBfaXNUcmVuZExpbmUgPSAoKENoYXJ0TGluZSkgX2NoYXJ0dHlwZV8xOSkuaXNUcmVuZExpbmUoKTsKKyAgICAgIGlmIChfaXNUcmVuZExpbmUpIHsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8zMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzMxLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzMxLmFwcGVuZCgic2VyaWVzRGVmYXVsdHMuc2V0VHJlbmRsaW5lKCIpOworICAgICAgICBfYnVpbGRlcl8zMS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl8zMS5hcHBlbmQoIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzMxLmFwcGVuZCgibmV3IFRyZW5kbGluZSgpLnNldFNob3codHJ1ZSkuc2V0TGluZVdpZHRoKDEpKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfMzEubmV3TGluZSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfMzEudG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8zMiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfMzIuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl8zMi5hcHBlbmQoIk9wdGlvbnMgb3B0aW9ucyA9IG5ldyBPcHRpb25zKCkiKTsKKyAgICBfYnVpbGRlcl8zMi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzMyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl8zMi5hcHBlbmQoIi5zZXRTZXJpZXNEZWZhdWx0cyhzZXJpZXNEZWZhdWx0cyk7Iik7CisgICAgX2J1aWxkZXJfMzIubmV3TGluZSgpOworICAgIGJvZHkgPSBfYnVpbGRlcl8zMi50b1N0cmluZygpOworICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMjAgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICBpZiAoKF9jaGFydHR5cGVfMjAgaW5zdGFuY2VvZiBDaGFydFBpZSkpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMzMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMzMuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzMzLmFwcGVuZCgic2VyaWVzRGVmYXVsdHMuc2V0UmVuZGVyZXJPcHRpb25zKG5ldyBQaWVSZW5kZXJlcigpIik7CisgICAgICBfYnVpbGRlcl8zMy5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgX2J1aWxkZXJfMzMuYXBwZW5kKCJcdCIpOworICAgICAgX2J1aWxkZXJfMzMuYXBwZW5kKCIuc2V0U2hvd0RhdGFMYWJlbHModHJ1ZSkuc2V0RmlsbCgiKTsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMjEgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgIGJvb2xlYW4gX2lzRW1wdHkgPSAoKENoYXJ0UGllKSBfY2hhcnR0eXBlXzIxKS5pc0VtcHR5KCk7CisgICAgICBib29sZWFuIF9ub3QgPSAoIV9pc0VtcHR5KTsKKyAgICAgIFN0cmluZyBfc3RyaW5nXzIgPSBCb29sZWFuLnZhbHVlT2YoX25vdCkudG9TdHJpbmcoKTsKKyAgICAgIF9idWlsZGVyXzMzLmFwcGVuZChfc3RyaW5nXzIsICJcdCIpOworICAgICAgX2J1aWxkZXJfMzMuYXBwZW5kKCIpKTsiKTsKKyAgICAgIF9idWlsZGVyXzMzLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMzMudG9TdHJpbmcoKTsKKyAgICB9IGVsc2UgeworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8yMiA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgaWYgKChfY2hhcnR0eXBlXzIyIGluc3RhbmNlb2YgQ2hhcnREb251dCkpIHsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8zNCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzM0LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzM0LmFwcGVuZCgic2VyaWVzRGVmYXVsdHMuc2V0UmVuZGVyZXJPcHRpb25zKG5ldyBEb251dFJlbmRlcmVyKCkiKTsKKyAgICAgICAgX2J1aWxkZXJfMzQubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfMzQuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl8zNC5hcHBlbmQoIi5zZXRTaG93RGF0YUxhYmVscyh0cnVlKSIpOworICAgICAgICBfYnVpbGRlcl8zNC5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyXzM0LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfMzQuYXBwZW5kKCIuc2V0U3RhcnRBbmdsZSgtOTApIik7CisgICAgICAgIF9idWlsZGVyXzM0Lm5ld0xpbmUoKTsKKyAgICAgICAgX2J1aWxkZXJfMzQuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl8zNC5hcHBlbmQoIi5zZXRTbGljZU1hcmdpbigzKSk7Iik7CisgICAgICAgIF9idWlsZGVyXzM0Lm5ld0xpbmUoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzM0LnRvU3RyaW5nKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzIzID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgIGlmICgoX2NoYXJ0dHlwZV8yMyBpbnN0YW5jZW9mIENoYXJ0QnViYmxlKSkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMzUgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgX2J1aWxkZXJfMzUuYXBwZW5kKCJzZXJpZXNEZWZhdWx0cy5zZXRSZW5kZXJlck9wdGlvbnMobmV3IEJ1YmJsZVJlbmRlcmVyKCkiKTsKKyAgICAgICAgICBfYnVpbGRlcl8zNS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl8zNS5hcHBlbmQoIi5zZXRWYXJ5QnViYmxlQ29sb3JzKHRydWUpIik7CisgICAgICAgICAgX2J1aWxkZXJfMzUubmV3TGluZSgpOworICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzI0ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgICAgICBib29sZWFuIF9pc011bHRpcGxpZXIgPSAoKENoYXJ0QnViYmxlKSBfY2hhcnR0eXBlXzI0KS5pc011bHRpcGxpZXIoKTsKKyAgICAgICAgICAgIGlmIChfaXNNdWx0aXBsaWVyKSB7CisgICAgICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiLnNldEF1dG9zY2FsZU11bHRpcGxpZXIoIik7CisgICAgICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMjUgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgICAgU3RyaW5nIF9tdWx0aXBsaWVyVmFsdWUgPSAoKENoYXJ0QnViYmxlKSBfY2hhcnR0eXBlXzI1KS5nZXRNdWx0aXBsaWVyVmFsdWUoKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMzUuYXBwZW5kKF9tdWx0aXBsaWVyVmFsdWUsICJcdCIpOworICAgICAgICAgICAgICBfYnVpbGRlcl8zNS5hcHBlbmQoImYpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIF9idWlsZGVyXzM1Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgX2J1aWxkZXJfMzUuYXBwZW5kKCIgICAgIik7CisgICAgICAgICAgeworICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8yNiA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgYm9vbGVhbiBfaXNUcmFuc3BhcmVudCA9ICgoQ2hhcnRCdWJibGUpIF9jaGFydHR5cGVfMjYpLmlzVHJhbnNwYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChfaXNUcmFuc3BhcmVudCkgeworICAgICAgICAgICAgICBfYnVpbGRlcl8zNS5hcHBlbmQoIi5zZXRIaWdobGlnaHRBbHBoYSgwLjhmKS5zZXRCdWJibGVBbHBoYSgwLjZmKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfYnVpbGRlcl8zNS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzI3ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgICAgICBib29sZWFuIF9pc0dyYWRpZW50ID0gKChDaGFydEJ1YmJsZSkgX2NoYXJ0dHlwZV8yNykuaXNHcmFkaWVudCgpOworICAgICAgICAgICAgaWYgKF9pc0dyYWRpZW50KSB7CisgICAgICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiLnNldEJ1YmJsZUdyYWRpZW50cyh0cnVlKSIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBfYnVpbGRlcl8zNS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyXzM1LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl8zNS5hcHBlbmQoIi5zZXRTaG93TGFiZWxzKGZhbHNlKSIpOworICAgICAgICAgIF9idWlsZGVyXzM1Lm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlcl8zNS5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfMzUuYXBwZW5kKCIuc2V0QXV0b3NjYWxlQnViYmxlcyh0cnVlKSk7Iik7CisgICAgICAgICAgX2J1aWxkZXJfMzUubmV3TGluZSgpOworICAgICAgICAgIGJvZHkgPSBfYnVpbGRlcl8zNS50b1N0cmluZygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMjggPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICBpZiAoKF9jaGFydHR5cGVfMjggaW5zdGFuY2VvZiBDaGFydEdhdWdlKSkgeworICAgICAgICAgICAgU3RyaW5nIGludGVydmFsVmFsdWVzID0gIiI7CisgICAgICAgICAgICBTdHJpbmcgaW50ZXJ2YWxDb2xvcnMgPSAiIjsKKyAgICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMjkgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2lzSGFzSW50ZXJ2YWxzID0gKChDaGFydEdhdWdlKSBfY2hhcnR0eXBlXzI5KS5pc0hhc0ludGVydmFscygpOworICAgICAgICAgICAgaWYgKF9pc0hhc0ludGVydmFscykgeworICAgICAgICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzMwID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgICAgICAgIEVMaXN0PENoYXJ0SW50ZXJ2YWw+IF9pbnRlcnZhbHMgPSAoKENoYXJ0R2F1Z2UpIF9jaGFydHR5cGVfMzApLmdldEludGVydmFscygpOworICAgICAgICAgICAgICBmb3IgKGZpbmFsIENoYXJ0SW50ZXJ2YWwgaW50ZXJ2YWwgOiBfaW50ZXJ2YWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKChpbnRlcnZhbCBpbnN0YW5jZW9mIENoYXJ0TnVtYmVySW50ZXJ2YWwpKSB7CisgICAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzM2ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyXzM2LmFwcGVuZChpbnRlcnZhbFZhbHVlcywgIiIpOworICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgX2xlbmd0aCA9IGludGVydmFsVmFsdWVzLmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICBib29sZWFuIF9ncmVhdGVyVGhhbiA9IChfbGVuZ3RoID4gMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICBfYnVpbGRlcl8zNi5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaW50IF9udW1iZXJJbnRlcnZhbFZhbHVlID0gKChDaGFydE51bWJlckludGVydmFsKSBpbnRlcnZhbCkuZ2V0TnVtYmVySW50ZXJ2YWxWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzYuYXBwZW5kKF9udW1iZXJJbnRlcnZhbFZhbHVlLCAiIik7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlcl8zNi5hcHBlbmQoImYiKTsKKyAgICAgICAgICAgICAgICAgIGludGVydmFsVmFsdWVzID0gX2J1aWxkZXJfMzYudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIENoYXJ0UmFuZ2VFbGVtZW50IF9udW1iZXJSYW5nZSA9ICgoQ2hhcnROdW1iZXJJbnRlcnZhbCkgaW50ZXJ2YWwpLmdldE51bWJlclJhbmdlKCk7CisgICAgICAgICAgICAgICAgICBpZiAoKF9udW1iZXJSYW5nZSBpbnN0YW5jZW9mIENoYXJ0U2VnbWVudENvbG9yKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzM3ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzcuYXBwZW5kKGludGVydmFsQ29sb3JzLCAiIik7CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgX2xlbmd0aF8xID0gaW50ZXJ2YWxDb2xvcnMubGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW5fMSA9IChfbGVuZ3RoXzEgPiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoX2dyZWF0ZXJUaGFuXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9idWlsZGVyXzM3LmFwcGVuZCgiLCIpOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfYnVpbGRlcl8zNy5hcHBlbmQoIlwiIik7CisgICAgICAgICAgICAgICAgICAgIENoYXJ0UmFuZ2VFbGVtZW50IF9udW1iZXJSYW5nZV8xID0gKChDaGFydE51bWJlckludGVydmFsKSBpbnRlcnZhbCkuZ2V0TnVtYmVyUmFuZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9yZ2IgPSAoKENoYXJ0U2VnbWVudENvbG9yKSBfbnVtYmVyUmFuZ2VfMSkuZ2V0UmdiKCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBfaGV4ID0gdGhpcy50b0hleChfcmdiKTsKKyAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzcuYXBwZW5kKF9oZXgsICIiKTsKKyAgICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzcuYXBwZW5kKCJcIiIpOworICAgICAgICAgICAgICAgICAgICBpbnRlcnZhbENvbG9ycyA9IF9idWlsZGVyXzM3LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzM4ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoInNlcmllc0RlZmF1bHRzLnNldFJlbmRlcmVyT3B0aW9ucyhuZXcgTWV0ZXJHYXVnZVJlbmRlcmVyKCkiKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIi5zZXRTaG93VGlja0xhYmVscygiKTsKKyAgICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMzEgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2lzSGFzVGlja3MgPSAoKENoYXJ0R2F1Z2UpIF9jaGFydHR5cGVfMzEpLmlzSGFzVGlja3MoKTsKKyAgICAgICAgICAgIFN0cmluZyBfc3RyaW5nXzMgPSBCb29sZWFuLnZhbHVlT2YoX2lzSGFzVGlja3MpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoX3N0cmluZ18zLCAiXHQiKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiKSIpOworICAgICAgICAgICAgX2J1aWxkZXJfMzgubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8zMiA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgICBib29sZWFuIF9pc0xhYmVsZWQgPSAoKENoYXJ0R2F1Z2UpIF9jaGFydHR5cGVfMzIpLmlzTGFiZWxlZCgpOworICAgICAgICAgICAgICBpZiAoX2lzTGFiZWxlZCkgeworICAgICAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiLnNldExhYmVsKFwiIik7CisgICAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8zMyA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgICAgIFN0cmluZyBfbGFiZWxWYWx1ZSA9ICgoQ2hhcnRHYXVnZSkgX2NoYXJ0dHlwZV8zMykuZ2V0TGFiZWxWYWx1ZSgpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZChfbGFiZWxWYWx1ZSwgIlx0Iik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzguYXBwZW5kKCJcIikiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXJfMzgubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8zNCA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgICBib29sZWFuIF9pc0hhc0ludGVydmFsc18xID0gKChDaGFydEdhdWdlKSBfY2hhcnR0eXBlXzM0KS5pc0hhc0ludGVydmFscygpOworICAgICAgICAgICAgICBpZiAoX2lzSGFzSW50ZXJ2YWxzXzEpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIi5zZXRJbnRlcnZhbHMoIik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzguYXBwZW5kKGludGVydmFsVmFsdWVzLCAiXHQiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1aWxkZXJfMzgubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8zNSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgICBib29sZWFuIF9pc0hhc0ludGVydmFsc18yID0gKChDaGFydEdhdWdlKSBfY2hhcnR0eXBlXzM1KS5pc0hhc0ludGVydmFscygpOworICAgICAgICAgICAgICBpZiAoX2lzSGFzSW50ZXJ2YWxzXzIpIHsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIi5zZXRJbnRlcnZhbENvbG9ycygiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoaW50ZXJ2YWxDb2xvcnMsICJcdCIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzM4LmFwcGVuZCgiKSIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5hcHBlbmQoIik7Iik7CisgICAgICAgICAgICBfYnVpbGRlcl8zOC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzM4LnRvU3RyaW5nKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMzYgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgIGlmICgoX2NoYXJ0dHlwZV8zNiBpbnN0YW5jZW9mIENoYXJ0QmFyKSkgeworICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzM5ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMzkuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgICAgICAgICAgX2J1aWxkZXJfMzkuYXBwZW5kKCJzZXJpZXNEZWZhdWx0cy5zZXRGaWxsVG9aZXJvKHRydWUpOyIpOworICAgICAgICAgICAgICBfYnVpbGRlcl8zOS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgICAgICBfYnVpbGRlcl8zOS5hcHBlbmQoInNlcmllc0RlZmF1bHRzLnNldFJlbmRlcmVyT3B0aW9ucyhuZXcgQmFyUmVuZGVyZXIoKSIpOworICAgICAgICAgICAgICBfYnVpbGRlcl8zOS5uZXdMaW5lKCk7CisgICAgICAgICAgICAgIF9idWlsZGVyXzM5LmFwcGVuZCgiICAgICIpOworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGF4aXNTd2l0Y2gpIHsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyXzM5LmFwcGVuZCgiLnNldEJhckRpcmVjdGlvbihCYXJEaXJlY3Rpb25zLkhPVElaT05UQUwpKTsiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgX2J1aWxkZXJfMzkuYXBwZW5kKCIuc2V0QmFyRGlyZWN0aW9uKEJhckRpcmVjdGlvbnMuVkVSVElDQUwpKTsiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgX2J1aWxkZXJfMzkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzM5LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMzcgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgICAgICAgICAgYm9vbGVhbiBfaXNTdGFja2VkID0gKChDaGFydEJhcikgX2NoYXJ0dHlwZV8zNykuaXNTdGFja2VkKCk7CisgICAgICAgICAgICAgIGlmIChfaXNTdGFja2VkKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80MCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfNDAuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl80MC5hcHBlbmQoIm9wdGlvbnMuc2V0U3RhY2tTZXJpZXModHJ1ZSk7Iik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfNDAubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICAgICAgICBib2R5ID0gX2J1aWxkZXJfNDAudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzM4ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgICAgICAgIGJvb2xlYW4gX2lzU2hhZG93ID0gKChDaGFydEJhcikgX2NoYXJ0dHlwZV8zOCkuaXNTaGFkb3coKTsKKyAgICAgICAgICAgICAgaWYgKF9pc1NoYWRvdykgeworICAgICAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNDEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzQxLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgICAgICAgX2J1aWxkZXJfNDEuYXBwZW5kKCJzZXJpZXNEZWZhdWx0cy5zZXRTaGFkb3codHJ1ZSkuc2V0U2hhZG93QWxwaGEoMC4wNWYpOyIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzQxLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzQxLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8zOSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICAgICAgICBib29sZWFuIF9pc0FuaW1hdGVkID0gKChDaGFydEJhcikgX2NoYXJ0dHlwZV8zOSkuaXNBbmltYXRlZCgpOworICAgICAgICAgICAgICBpZiAoX2lzQW5pbWF0ZWQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzQyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICBfYnVpbGRlcl80Mi5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzQyLmFwcGVuZCgib3B0aW9ucy5zZXRBbmltYXRlKHRydWUpOyIpOworICAgICAgICAgICAgICAgIF9idWlsZGVyXzQyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzQyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80MyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfNDMuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl80My5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzQzLmFwcGVuZCgiU3RyaW5nW10gc2VyaWVzQ29sb3JzID0ge1wiIzk4RTk1OFwiLFwiIzMwOTBGMFwiLFwiI0VDNjQ2NFwiLFwiI0Y5REQ1MVwiLFwiIzI0RENENFwiLFwiI0VDNjRBNVwiLFwiIzY4NUNCMFwiLFwiI0ZGN0Q0MlwiLFwiI0FBNTE0RFwiLFwiIzdGQjA1M1wiLFwiI0JCQTg1QlwiLFwiIzI0Nzk4MVwifTsiKTsKKyAgICBfYnVpbGRlcl80My5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNDMuYXBwZW5kKCJvcHRpb25zLnNldFNlcmllc0NvbG9ycyhzZXJpZXNDb2xvcnMpOyIpOworICAgIF9idWlsZGVyXzQzLm5ld0xpbmUoKTsKKyAgICBib2R5ID0gX2J1aWxkZXJfNDMudG9TdHJpbmcoKTsKKyAgICBpZiAoaGFzQXhpcykgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80NCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl80NC5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXJfNDQuYXBwZW5kKCJBeGVzIGF4ZXMgPSBuZXcgQXhlcygpOyIpOworICAgICAgX2J1aWxkZXJfNDQubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl80NC50b1N0cmluZygpOworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV80MCA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgaWYgKChfY2hhcnR0eXBlXzQwIGluc3RhbmNlb2YgQ2hhcnRCdWJibGUpKSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNDUgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIgYXhpc1RpY2tSZW5kZXJlciA9IG5ldyBDYW52YXNBeGlzVGlja1JlbmRlcmVyKCk7Iik7CisgICAgICAgIF9idWlsZGVyXzQ1Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiYXhpc1RpY2tSZW5kZXJlci5zZXRUZXh0Q29sb3IoXCIjMjAyMDIwXCIpOyIpOworICAgICAgICBfYnVpbGRlcl80NS5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiaWYgKCIpOworICAgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfNDIgPSBkYXRhX2F4aXMuZ2V0QXhpcygpOworICAgICAgICBBeGlzRW51bSBfbmFtZV80OSA9IF9heGlzXzQyLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIF9saXRlcmFsXzM0ID0gX25hbWVfNDkuZ2V0TGl0ZXJhbCgpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoX2xpdGVyYWxfMzQsICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJUaXRsZXNBcnJheS5zaXplKCkgPiAwKSB7Iik7CisgICAgICAgIF9idWlsZGVyXzQ1Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJheGVzLmFkZEF4aXMobmV3IFhZYXhpcyhYWWF4ZXMuIik7CisgICAgICAgIGNoYXIgX2NoYXJBdCA9IGF4aXNQcmVmaXguY2hhckF0KDApOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoX2NoYXJBdCwgIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiKS5zZXRMYWJlbCgiKTsKKyAgICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzQzID0gZGF0YV9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNTAgPSBfYXhpc180My5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zNSA9IF9uYW1lXzUwLmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9saXRlcmFsXzM1LCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJUaXRsZXNBcnJheS5nZXQoMCkpLnNldFRpY2tPcHRpb25zKGF4aXNUaWNrUmVuZGVyZXIiKTsKKyAgICAgICAgeworICAgICAgICAgIGludCBfYW5nbGUgPSBjYXRlZ29yeV9heGlzLmdldEFuZ2xlKCk7CisgICAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKF9hbmdsZSAhPSAwKTsKKyAgICAgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCIuc2V0QW5nbGUoIik7CisgICAgICAgICAgICBpbnQgX2FuZ2xlXzEgPSBkYXRhX2F4aXMuZ2V0QW5nbGUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZChfYW5nbGVfMSwgIlx0Iik7CisgICAgICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIikiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCIpKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoImF4ZXMuYWRkQXhpcyhuZXcgWFlheGlzKFhZYXhlcy4iKTsKKyAgICAgICAgY2hhciBfY2hhckF0XzEgPSBheGlzUHJlZml4LmNoYXJBdCgxKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9jaGFyQXRfMSwgIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiKS5zZXRMYWJlbCgiKTsKKyAgICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzQ0ID0gZGF0YV9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNTEgPSBfYXhpc180NC5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zNiA9IF9uYW1lXzUxLmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9saXRlcmFsXzM2LCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJUaXRsZXNBcnJheS5nZXQoMSkpLnNldFRpY2tPcHRpb25zKGF4aXNUaWNrUmVuZGVyZXIiKTsKKyAgICAgICAgeworICAgICAgICAgIGludCBfYW5nbGVfMiA9IGNhdGVnb3J5X2F4aXMuZ2V0QW5nbGUoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMSA9IChfYW5nbGVfMiAhPSAwKTsKKyAgICAgICAgICBpZiAoX25vdEVxdWFsc18xKSB7CisgICAgICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIi5zZXRBbmdsZSgiKTsKKyAgICAgICAgICAgIGludCBfYW5nbGVfMyA9IGRhdGFfYXhpcy5nZXRBbmdsZSgpOworICAgICAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9hbmdsZV8zLCAiXHQiKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiKSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIikpOyIpOworICAgICAgICBfYnVpbGRlcl80NS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiYXhlcy5hZGRBeGlzKG5ldyBYWWF4aXMoWFlheGVzLiIpOworICAgICAgICBjaGFyIF9jaGFyQXRfMiA9IGF4aXNQcmVmaXguY2hhckF0KDEpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoX2NoYXJBdF8yLCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCIyKS5zZXRMYWJlbCgiKTsKKyAgICAgICAgRGF0YW1hcnRBeGlzIF9heGlzXzQ1ID0gZGF0YV9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNTIgPSBfYXhpc180NS5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zNyA9IF9uYW1lXzUyLmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9saXRlcmFsXzM3LCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKCJUaXRsZXNBcnJheS5nZXQoMikpLnNldFRpY2tPcHRpb25zKGF4aXNUaWNrUmVuZGVyZXIiKTsKKyAgICAgICAgeworICAgICAgICAgIGludCBfYW5nbGVfNCA9IGNhdGVnb3J5X2F4aXMuZ2V0QW5nbGUoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RFcXVhbHNfMiA9IChfYW5nbGVfNCAhPSAwKTsKKyAgICAgICAgICBpZiAoX25vdEVxdWFsc18yKSB7CisgICAgICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIi5zZXRBbmdsZSgiKTsKKyAgICAgICAgICAgIGludCBfYW5nbGVfNSA9IGRhdGFfYXhpcy5nZXRBbmdsZSgpOworICAgICAgICAgICAgX2J1aWxkZXJfNDUuYXBwZW5kKF9hbmdsZV81LCAiXHQiKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ1LmFwcGVuZCgiKSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIikpOyIpOworICAgICAgICBfYnVpbGRlcl80NS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl80NS5hcHBlbmQoIn0iKTsKKyAgICAgICAgX2J1aWxkZXJfNDUubmV3TGluZSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNDUudG9TdHJpbmcoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNDYgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIkNhbnZhc0F4aXNUaWNrUmVuZGVyZXIgdGlja1JlbmRlcmVyID0gbmV3IENhbnZhc0F4aXNUaWNrUmVuZGVyZXIoKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNDYubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKCJ0aWNrUmVuZGVyZXIuc2V0VGV4dENvbG9yKFwiIzIwMjAyMFwiKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNDYubmV3TGluZSgpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoImF4ZXMuYWRkQXhpcyhuZXcgWFlheGlzKFhZYXhlcy4iKTsKKyAgICAgICAgY2hhciBfY2hhckF0XzMgPSBheGlzUHJlZml4LmNoYXJBdCgwKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKF9jaGFyQXRfMywgIiIpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIikiKTsKKyAgICAgICAgX2J1aWxkZXJfNDYubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIi5zZXRSZW5kZXJlcihBeGlzUmVuZGVyZXJzLiIpOworICAgICAgICBSZW5kZXJUeXBlRW51bSBfcmVuZGVyVHlwZV81ID0gY2F0ZWdvcnlfYXhpcy5nZXRSZW5kZXJUeXBlKCk7CisgICAgICAgIFN0cmluZyBfbmFtZV81MyA9IF9yZW5kZXJUeXBlXzUubmFtZSgpOworICAgICAgICBTdHJpbmcgX3N0cmluZ180ID0gX25hbWVfNTMudG9TdHJpbmcoKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKF9zdHJpbmdfNCwgIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiKSIpOworICAgICAgICBfYnVpbGRlcl80Ni5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiLnNldExhYmVsKCIpOworICAgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfNDYgPSBjYXRlZ29yeV9heGlzLmdldEF4aXMoKTsKKyAgICAgICAgQXhpc0VudW0gX25hbWVfNTQgPSBfYXhpc180Ni5nZXROYW1lKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbF8zOCA9IF9uYW1lXzU0LmdldExpdGVyYWwoKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKF9saXRlcmFsXzM4LCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKCJBeGlzTGFiZWwpIik7CisgICAgICAgIF9idWlsZGVyXzQ2Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKCIuc2V0VGlja3MoIik7CisgICAgICAgIERhdGFtYXJ0QXhpcyBfYXhpc180NyA9IGNhdGVnb3J5X2F4aXMuZ2V0QXhpcygpOworICAgICAgICBBeGlzRW51bSBfbmFtZV81NSA9IF9heGlzXzQ3LmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIF9saXRlcmFsXzM5ID0gX25hbWVfNTUuZ2V0TGl0ZXJhbCgpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoX2xpdGVyYWxfMzksICJcdCIpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIlRpY2tzKSIpOworICAgICAgICBfYnVpbGRlcl80Ni5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIlx0Iik7CisgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiLnNldFRpY2tPcHRpb25zKHRpY2tSZW5kZXJlciIpOworICAgICAgICB7CisgICAgICAgICAgaW50IF9hbmdsZV82ID0gY2F0ZWdvcnlfYXhpcy5nZXRBbmdsZSgpOworICAgICAgICAgIGJvb2xlYW4gX25vdEVxdWFsc18zID0gKF9hbmdsZV82ICE9IDApOworICAgICAgICAgIGlmIChfbm90RXF1YWxzXzMpIHsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiLnNldEFuZ2xlKCIpOworICAgICAgICAgICAgaW50IF9hbmdsZV83ID0gY2F0ZWdvcnlfYXhpcy5nZXRBbmdsZSgpOworICAgICAgICAgICAgX2J1aWxkZXJfNDYuYXBwZW5kKF9hbmdsZV83LCAiXHQiKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ2LmFwcGVuZCgiKSIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfYnVpbGRlcl80Ni5hcHBlbmQoIikpOyIpOworICAgICAgICBfYnVpbGRlcl80Ni5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNDYudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl80NyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZCgiQ2FudmFzQXhpc1RpY2tSZW5kZXJlciBheGlzVGlja1JlbmRlcmVyID0gbmV3IENhbnZhc0F4aXNUaWNrUmVuZGVyZXIoKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNDcubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCJheGlzVGlja1JlbmRlcmVyLnNldFRleHRDb2xvcihcIiMyMDIwMjBcIik7Iik7CisgICAgICAgIF9idWlsZGVyXzQ3Lm5ld0xpbmUoKTsKKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCJheGVzLmFkZEF4aXMobmV3IFhZYXhpcyhYWWF4ZXMuIik7CisgICAgICAgIGNoYXIgX2NoYXJBdF80ID0gYXhpc1ByZWZpeC5jaGFyQXQoMSk7CisgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZChfY2hhckF0XzQsICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCIpIik7CisgICAgICAgIF9idWlsZGVyXzQ3Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCIuc2V0UGFkKDEuMDVmKSIpOworICAgICAgICBfYnVpbGRlcl80Ny5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCIuc2V0VGlja09wdGlvbnMoYXhpc1RpY2tSZW5kZXJlciIpOworICAgICAgICB7CisgICAgICAgICAgaW50IF9hbmdsZV84ID0gZGF0YV9heGlzLmdldEFuZ2xlKCk7CisgICAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzXzQgPSAoX2FuZ2xlXzggIT0gMCk7CisgICAgICAgICAgaWYgKF9ub3RFcXVhbHNfNCkgeworICAgICAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCIuc2V0QW5nbGUoIik7CisgICAgICAgICAgICBpbnQgX2FuZ2xlXzkgPSBkYXRhX2F4aXMuZ2V0QW5nbGUoKTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ3LmFwcGVuZChfYW5nbGVfOSwgIlx0Iik7CisgICAgICAgICAgICBfYnVpbGRlcl80Ny5hcHBlbmQoIikiKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2J1aWxkZXJfNDcuYXBwZW5kKCIpKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNDcubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzQ3LnRvU3RyaW5nKCk7CisgICAgICAgIFNldDxTdHJpbmc+IF9rZXlTZXQgPSBtdWx0aXBsZUF4ZXMua2V5U2V0KCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGF4aXNLZXkgOiBfa2V5U2V0KSB7CisgICAgICAgICAgYm9vbGVhbiBfZXF1YWxzXzcgPSBheGlzS2V5LmVxdWFscygiMSIpOworICAgICAgICAgIGJvb2xlYW4gX25vdF8xID0gKCFfZXF1YWxzXzcpOworICAgICAgICAgIGlmIChfbm90XzEpIHsKKyAgICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNDggPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgICAgX2J1aWxkZXJfNDguYXBwZW5kKGJvZHksICIiKTsKKyAgICAgICAgICAgIFN0cmluZyBfZ2V0ID0gbXVsdGlwbGVBeGVzLmdldChheGlzS2V5KTsKKyAgICAgICAgICAgIF9idWlsZGVyXzQ4LmFwcGVuZChfZ2V0LCAiIik7CisgICAgICAgICAgICBib2R5ID0gX2J1aWxkZXJfNDgudG9TdHJpbmcoKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU2V0PFN0cmluZz4gX2tleVNldF8xID0gbXVsdGlwbGVBeGVzLmtleVNldCgpOworICAgICAgICBpbnQgX3NpemUgPSBfa2V5U2V0XzEuc2l6ZSgpOworICAgICAgICBib29sZWFuIF9ncmVhdGVyVGhhbl8yID0gKF9zaXplID4gMCk7CisgICAgICAgIGlmIChfZ3JlYXRlclRoYW5fMikgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNDkgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyXzQ5LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgX2J1aWxkZXJfNDkuYXBwZW5kKCJMaW5lYXJBeGlzUmVuZGVyZXIgbGluZWFyQXhpc1JlbmRlcmVyID0gbmV3IExpbmVhckF4aXNSZW5kZXJlcigpOyIpOworICAgICAgICAgIF9idWlsZGVyXzQ5Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgICAgX2J1aWxkZXJfNDkuYXBwZW5kKCJsaW5lYXJBeGlzUmVuZGVyZXIuc2V0QWxpZ25UaWNrcyh0cnVlKTsiKTsKKyAgICAgICAgICBfYnVpbGRlcl80OS5uZXdMaW5lKCk7CisgICAgICAgICAgX2J1aWxkZXJfNDkuYXBwZW5kKCJBeGVzRGVmYXVsdHMgYXhlc0RlZmF1bHRzID0gbmV3IEF4ZXNEZWZhdWx0cygpIik7CisgICAgICAgICAgX2J1aWxkZXJfNDkubmV3TGluZSgpOworICAgICAgICAgIF9idWlsZGVyXzQ5LmFwcGVuZCgiXHQiKTsKKyAgICAgICAgICBfYnVpbGRlcl80OS5hcHBlbmQoIi5zZXRVc2VTZXJpZXNDb2xvcih0cnVlKSIpOworICAgICAgICAgIF9idWlsZGVyXzQ5Lm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlcl80OS5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfNDkuYXBwZW5kKCIuc2V0Qm9yZGVyV2lkdGgoMylcdCIpOworICAgICAgICAgIF9idWlsZGVyXzQ5Lm5ld0xpbmUoKTsKKyAgICAgICAgICBfYnVpbGRlcl80OS5hcHBlbmQoIlx0Iik7CisgICAgICAgICAgX2J1aWxkZXJfNDkuYXBwZW5kKCIuc2V0UmVuZGVyZXJPcHRpb25zKGxpbmVhckF4aXNSZW5kZXJlcik7Iik7CisgICAgICAgICAgX2J1aWxkZXJfNDkubmV3TGluZSgpOworICAgICAgICAgIF9idWlsZGVyXzQ5LmFwcGVuZCgib3B0aW9ucy5zZXRBeGVzRGVmYXVsdHMoYXhlc0RlZmF1bHRzKTsiKTsKKyAgICAgICAgICBfYnVpbGRlcl80OS5uZXdMaW5lKCk7CisgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzQ5LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTAgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfNTAuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzUwLmFwcGVuZCgib3B0aW9ucy5zZXRBeGVzKGF4ZXMpOyIpOworICAgICAgX2J1aWxkZXJfNTAubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl81MC50b1N0cmluZygpOworICAgIH0KKyAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMSA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgIEVMaXN0PENoYXJ0RWxlbWVudD4gX2VsZW1lbnRzXzEgPSBfc291cmNlXzEuZ2V0RWxlbWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIENoYXJ0RWxlbWVudCBlbGVtZW50XzEgOiBfZWxlbWVudHNfMSkgeworICAgICAgaWYgKChlbGVtZW50XzEgaW5zdGFuY2VvZiBDaGFydExlZ2VuZCkpIHsKKyAgICAgICAgQ2hhcnRMZWdlbmQgbGVnZW5kID0gKChDaGFydExlZ2VuZCkgZWxlbWVudF8xKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl81MSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzUxLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzUxLmFwcGVuZCgiTGVnZW5kIGxlZ2VuZCA9IG5ldyBMZWdlbmQoKS5zZXRTaG93KCIpOworICAgICAgICBib29sZWFuIF9ub3RFcXVhbHNfNSA9ICghT2JqZWN0cy5lcXVhbChsZWdlbmQsIG51bGwpKTsKKyAgICAgICAgYm9vbGVhbiBfYm9vbGVhblZhbHVlXzIgPSBCb29sZWFuLnZhbHVlT2YoX25vdEVxdWFsc181KS5ib29sZWFuVmFsdWUoKTsKKyAgICAgICAgU3RyaW5nIF9zdHJpbmdfNSA9IEJvb2xlYW4udmFsdWVPZihfYm9vbGVhblZhbHVlXzIpLnRvU3RyaW5nKCk7CisgICAgICAgIF9idWlsZGVyXzUxLmFwcGVuZChfc3RyaW5nXzUsICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNTEuYXBwZW5kKCIpOyIpOworICAgICAgICBfYnVpbGRlcl81MS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNTEudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl81MiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzUyLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzUyLmFwcGVuZCgibGVnZW5kLnNldFBsYWNlbWVudChMZWdlbmRQbGFjZW1lbnRzLiIpOworICAgICAgICBMZWdlbmRQbGFjZW1lbnRFbnVtIF9wbGFjZW1lbnQgPSBsZWdlbmQuZ2V0UGxhY2VtZW50KCk7CisgICAgICAgIFN0cmluZyBfbmFtZV81NiA9IF9wbGFjZW1lbnQubmFtZSgpOworICAgICAgICBfYnVpbGRlcl81Mi5hcHBlbmQoX25hbWVfNTYsICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNTIuYXBwZW5kKCIpOyIpOworICAgICAgICBfYnVpbGRlcl81Mi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNTIudG9TdHJpbmcoKTsKKyAgICAgICAgYm9vbGVhbiBfaXNUb2dnbGUgPSBsZWdlbmQuaXNUb2dnbGUoKTsKKyAgICAgICAgaWYgKF9pc1RvZ2dsZSkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTMgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyXzUzLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgX2J1aWxkZXJfNTMuYXBwZW5kKCJFbmhhbmNlZExlZ2VuZFJlbmRlcmVyIHJlbmRlcmVyID0gbmV3IEVuaGFuY2VkTGVnZW5kUmVuZGVyZXIoKTsiKTsKKyAgICAgICAgICBfYnVpbGRlcl81My5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyXzUzLmFwcGVuZCgicmVuZGVyZXIuc2V0U2VyaWVzVG9nZ2xlKFNlcmllc1RvZ2dsZXMuIik7CisgICAgICAgICAgVG9nZ2xlVHlwZUVudW0gX3RvZ2dsZVR5cGUgPSBsZWdlbmQuZ2V0VG9nZ2xlVHlwZSgpOworICAgICAgICAgIFN0cmluZyBfbmFtZV81NyA9IF90b2dnbGVUeXBlLmdldE5hbWUoKTsKKyAgICAgICAgICBfYnVpbGRlcl81My5hcHBlbmQoX25hbWVfNTcsICIiKTsKKyAgICAgICAgICBfYnVpbGRlcl81My5hcHBlbmQoIik7Iik7CisgICAgICAgICAgX2J1aWxkZXJfNTMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgICBfYnVpbGRlcl81My5hcHBlbmQoInJlbmRlcmVyLnNldFNlcmllc1RvZ2dsZVJlcGxvdCgiKTsKKyAgICAgICAgICBib29sZWFuIF9pc1JlcGxvdCA9IGxlZ2VuZC5pc1JlcGxvdCgpOworICAgICAgICAgIGJvb2xlYW4gX2Jvb2xlYW5WYWx1ZV8zID0gQm9vbGVhbi52YWx1ZU9mKF9pc1JlcGxvdCkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgU3RyaW5nIF9zdHJpbmdfNiA9IEJvb2xlYW4udmFsdWVPZihfYm9vbGVhblZhbHVlXzMpLnRvU3RyaW5nKCk7CisgICAgICAgICAgX2J1aWxkZXJfNTMuYXBwZW5kKF9zdHJpbmdfNiwgIiIpOworICAgICAgICAgIF9idWlsZGVyXzUzLmFwcGVuZCgiKTsiKTsKKyAgICAgICAgICBfYnVpbGRlcl81My5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICAgIF9idWlsZGVyXzUzLmFwcGVuZCgibGVnZW5kLnNldFJlbmRlcmVyT3B0aW9ucyhyZW5kZXJlcik7Iik7CisgICAgICAgICAgX2J1aWxkZXJfNTMubmV3TGluZSgpOworICAgICAgICAgIGJvZHkgPSBfYnVpbGRlcl81My50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTQgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl81NC5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl81NC5hcHBlbmQoIm9wdGlvbnMuc2V0TGVnZW5kKGxlZ2VuZCk7Iik7CisgICAgICAgIF9idWlsZGVyXzU0Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIGJvZHkgPSBfYnVpbGRlcl81NC50b1N0cmluZygpOworICAgICAgfQorICAgIH0KKyAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMiA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgIEVMaXN0PENoYXJ0RWxlbWVudD4gX2VsZW1lbnRzXzIgPSBfc291cmNlXzIuZ2V0RWxlbWVudHMoKTsKKyAgICBmb3IgKGZpbmFsIENoYXJ0RWxlbWVudCBlbGVtZW50XzIgOiBfZWxlbWVudHNfMikgeworICAgICAgaWYgKChlbGVtZW50XzIgaW5zdGFuY2VvZiBDaGFydEhpZ2hsaWdodGVyKSkgeworICAgICAgICBDaGFydEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyID0gKChDaGFydEhpZ2hsaWdodGVyKSBlbGVtZW50XzIpOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzU1ID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgX2J1aWxkZXJfNTUuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNTUuYXBwZW5kKCJIaWdobGlnaHRlciBoaWdobGlnaHRlciA9IG5ldyBIaWdobGlnaHRlcigpLnNldFNob3coIik7CisgICAgICAgIGJvb2xlYW4gX25vdEVxdWFsc182ID0gKCFPYmplY3RzLmVxdWFsKGhpZ2hsaWdodGVyLCBudWxsKSk7CisgICAgICAgIGJvb2xlYW4gX2Jvb2xlYW5WYWx1ZV80ID0gQm9vbGVhbi52YWx1ZU9mKF9ub3RFcXVhbHNfNikuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIFN0cmluZyBfc3RyaW5nXzcgPSBCb29sZWFuLnZhbHVlT2YoX2Jvb2xlYW5WYWx1ZV80KS50b1N0cmluZygpOworICAgICAgICBfYnVpbGRlcl81NS5hcHBlbmQoX3N0cmluZ183LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU1LmFwcGVuZCgiKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNTUubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzU1LnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTYgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoImhpZ2hsaWdodGVyLnNldFNob3dUb29sdGlwKHRydWUpIik7CisgICAgICAgIF9idWlsZGVyXzU2Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzU2LmFwcGVuZCgiLnNldFRvb2x0aXBBbHdheXNWaXNpYmxlKCIpOworICAgICAgICBib29sZWFuIF9pc1Rvb2x0aXBBbHdheXMgPSBoaWdobGlnaHRlci5pc1Rvb2x0aXBBbHdheXMoKTsKKyAgICAgICAgYm9vbGVhbiBfYm9vbGVhblZhbHVlXzUgPSBCb29sZWFuLnZhbHVlT2YoX2lzVG9vbHRpcEFsd2F5cykuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIFN0cmluZyBfc3RyaW5nXzggPSBCb29sZWFuLnZhbHVlT2YoX2Jvb2xlYW5WYWx1ZV81KS50b1N0cmluZygpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoX3N0cmluZ184LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU2LmFwcGVuZCgiKSIpOworICAgICAgICBfYnVpbGRlcl81Ni5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoIi5zZXRLZWVwVG9vbHRpcEluc2lkZUNoYXJ0KCIpOworICAgICAgICBib29sZWFuIF9pc0luc2lkZUNoYXJ0ID0gaGlnaGxpZ2h0ZXIuaXNJbnNpZGVDaGFydCgpOworICAgICAgICBib29sZWFuIF9ib29sZWFuVmFsdWVfNiA9IEJvb2xlYW4udmFsdWVPZihfaXNJbnNpZGVDaGFydCkuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIFN0cmluZyBfc3RyaW5nXzkgPSBCb29sZWFuLnZhbHVlT2YoX2Jvb2xlYW5WYWx1ZV82KS50b1N0cmluZygpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoX3N0cmluZ185LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU2LmFwcGVuZCgiKSIpOworICAgICAgICBfYnVpbGRlcl81Ni5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoIi5zZXRUb29sdGlwTG9jYXRpb24oVG9vbHRpcExvY2F0aW9ucy4iKTsKKyAgICAgICAgVG9vbHRpcExvY2F0aW9uRW51bSBfbG9jYXRpb24gPSBoaWdobGlnaHRlci5nZXRMb2NhdGlvbigpOworICAgICAgICBTdHJpbmcgX25hbWVfNTggPSBfbG9jYXRpb24ubmFtZSgpOworICAgICAgICBfYnVpbGRlcl81Ni5hcHBlbmQoX25hbWVfNTgsICIiKTsKKyAgICAgICAgX2J1aWxkZXJfNTYuYXBwZW5kKCIpIik7CisgICAgICAgIF9idWlsZGVyXzU2Lm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICAgIF9idWlsZGVyXzU2LmFwcGVuZCgiLnNldEJyaW5nU2VyaWVzVG9Gcm9udCh0cnVlKSIpOworICAgICAgICBfYnVpbGRlcl81Ni5uZXdMaW5lKCk7CisgICAgICAgIF9idWlsZGVyXzU2LmFwcGVuZCgiLnNldEZhZGVUb29sdGlwKHRydWUpIik7CisgICAgICAgIF9idWlsZGVyXzU2Lm5ld0xpbmUoKTsKKyAgICAgICAgX2J1aWxkZXJfNTYuYXBwZW5kKCIuc2V0U2hvd01hcmtlcih0cnVlKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNTYubmV3TGluZSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNTYudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl81NyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzU3LmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU3LmFwcGVuZCgiaGlnaGxpZ2h0ZXIuc2V0VG9vbHRpcEF4ZXMoVG9vbHRpcEF4ZXMuIik7CisgICAgICAgIF9idWlsZGVyXzU3LmFwcGVuZChheGlzUHJlZml4LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU3LmFwcGVuZChwb3N0Zml4LCAiIik7CisgICAgICAgIF9idWlsZGVyXzU3LmFwcGVuZCgiKTsiKTsKKyAgICAgICAgX2J1aWxkZXJfNTcubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzU3LnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTggPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl81OC5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl81OC5hcHBlbmQoIm9wdGlvbnMuc2V0SGlnaGxpZ2h0ZXIoaGlnaGxpZ2h0ZXIpOyIpOworICAgICAgICBfYnVpbGRlcl81OC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNTgudG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV80MSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZV80MSBpbnN0YW5jZW9mIENoYXJ0TGluZSkpIHsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfNDIgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgIGJvb2xlYW4gX2lzQ3Vyc29yID0gKChDaGFydExpbmUpIF9jaGFydHR5cGVfNDIpLmlzQ3Vyc29yKCk7CisgICAgICBpZiAoX2lzQ3Vyc29yKSB7CisgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNTkgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIkN1cnNvciBjdXJzb3IgPSBuZXcgQ3Vyc29yKCkiKTsKKyAgICAgICAgX2J1aWxkZXJfNTkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNTkuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIi5zZXRTaG93KHRydWUpIik7CisgICAgICAgIF9idWlsZGVyXzU5Lm5ld0xpbmUoKTsKKyAgICAgICAgX2J1aWxkZXJfNTkuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIi5zZXRab29tKCIpOworICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzQzID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgIGJvb2xlYW4gX2lzWm9vbSA9ICgoQ2hhcnRMaW5lKSBfY2hhcnR0eXBlXzQzKS5pc1pvb20oKTsKKyAgICAgICAgU3RyaW5nIF9zdHJpbmdfMTAgPSBCb29sZWFuLnZhbHVlT2YoX2lzWm9vbSkudG9TdHJpbmcoKTsKKyAgICAgICAgX2J1aWxkZXJfNTkuYXBwZW5kKF9zdHJpbmdfMTAsICJcdCIpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIikiKTsKKyAgICAgICAgX2J1aWxkZXJfNTkubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgICAgX2J1aWxkZXJfNTkuYXBwZW5kKCJcdCIpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIi5zZXRTaG93VG9vbHRpcCgiKTsKKyAgICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV80NCA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgICBib29sZWFuIF9pc1Rvb2x0aXAgPSAoKENoYXJ0TGluZSkgX2NoYXJ0dHlwZV80NCkuaXNUb29sdGlwKCk7CisgICAgICAgIFN0cmluZyBfc3RyaW5nXzExID0gQm9vbGVhbi52YWx1ZU9mKF9pc1Rvb2x0aXApLnRvU3RyaW5nKCk7CisgICAgICAgIF9idWlsZGVyXzU5LmFwcGVuZChfc3RyaW5nXzExLCAiXHQiKTsKKyAgICAgICAgX2J1aWxkZXJfNTkuYXBwZW5kKCIpOyIpOworICAgICAgICBfYnVpbGRlcl81OS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlcl81OS5hcHBlbmQoIm9wdGlvbnMuc2V0Q3Vyc29yKGN1cnNvcik7Iik7CisgICAgICAgIF9idWlsZGVyXzU5Lm5ld0xpbmUoKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyXzU5LnRvU3RyaW5nKCk7CisgICAgICB9CisgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzQ1ID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBib29sZWFuIF9pc0FuaW1hdGVkXzEgPSAoKENoYXJ0TGluZSkgX2NoYXJ0dHlwZV80NSkuaXNBbmltYXRlZCgpOworICAgICAgaWYgKF9pc0FuaW1hdGVkXzEpIHsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl82MCA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyXzYwLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIF9idWlsZGVyXzYwLmFwcGVuZCgib3B0aW9ucy5zZXRBbmltYXRlKHRydWUpOyIpOworICAgICAgICBfYnVpbGRlcl82MC5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBib2R5ID0gX2J1aWxkZXJfNjAudG9TdHJpbmcoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGhhc0F4aXMpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfNjEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfNjEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIF9idWlsZGVyXzYxLmFwcGVuZCgib3B0aW9ucy5zZXRTZXJpZXMoIik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfNDggPSBkYXRhX2F4aXMuZ2V0QXhpcygpOworICAgICAgQXhpc0VudW0gX25hbWVfNTkgPSBfYXhpc180OC5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfNDAgPSBfbmFtZV81OS5nZXRMaXRlcmFsKCk7CisgICAgICBfYnVpbGRlcl82MS5hcHBlbmQoX2xpdGVyYWxfNDAsICIiKTsKKyAgICAgIF9idWlsZGVyXzYxLmFwcGVuZCgiU2VyaWVzKTsiKTsKKyAgICAgIF9idWlsZGVyXzYxLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBib2R5ID0gX2J1aWxkZXJfNjEudG9TdHJpbmcoKTsKKyAgICB9CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl82MiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIkRDaGFydHMgY2hhcnQgPSBuZXcgRENoYXJ0cygpIik7CisgICAgX2J1aWxkZXJfNjIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKCIuc2V0RGF0YVNlcmllcyhkYXRhU2VyaWVzKSIpOworICAgIF9idWlsZGVyXzYyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKCIuc2V0T3B0aW9ucyhvcHRpb25zKSIpOworICAgIF9idWlsZGVyXzYyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKCIuc2V0RW5hYmxlRG93bmxvYWQodHJ1ZSkiKTsKKyAgICBfYnVpbGRlcl82Mi5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzYyLmFwcGVuZCgiLnNldERvd25sb2FkQnV0dG9uQ2FwdGlvbihkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKGxvY2FsZS50b0xhbmd1YWdlVGFnKCksIFwiZG93bmxvYWRcIikpIik7CisgICAgX2J1aWxkZXJfNjIubmV3TGluZSgpOworICAgIF9idWlsZGVyXzYyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIi5zZXREb3dubG9hZEZpbGVuYW1lKFwiIik7CisgICAgU3RyaW5nIF9uYW1lXzYwID0gY2hhcnQuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyXzYyLmFwcGVuZChfbmFtZV82MCwgIlx0Iik7CisgICAgX2J1aWxkZXJfNjIuYXBwZW5kKCJcIikiKTsKKyAgICBfYnVpbGRlcl82Mi5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgIF9idWlsZGVyXzYyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlcl82Mi5hcHBlbmQoIi5zZXREb3dubG9hZEJ1dHRvbkxvY2F0aW9uKERvd25sb2FkQnV0dG9uTG9jYXRpb24uVE9QX1JJR0hUKTsiKTsKKyAgICBfYnVpbGRlcl82Mi5uZXdMaW5lKCk7CisgICAgYm9keSA9IF9idWlsZGVyXzYyLnRvU3RyaW5nKCk7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl82MyA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXJfNjMuYXBwZW5kKGJvZHksICIiKTsKKyAgICBfYnVpbGRlcl82My5hcHBlbmQoImNoYXJ0LnNldElkKFwiY2hhcnRcIik7Iik7CisgICAgX2J1aWxkZXJfNjMubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlcl82My5hcHBlbmQoImNoYXJ0LnNldEltbWVkaWF0ZSh0cnVlKTsiKTsKKyAgICBfYnVpbGRlcl82My5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNjMuYXBwZW5kKCJpZihjaGFydFJlZnJlc2hlckRvbmUpIHsiKTsKKyAgICBfYnVpbGRlcl82My5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNjMuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyXzYzLmFwcGVuZCgiY2hhcnQuc2hvdygpOyIpOworICAgIF9idWlsZGVyXzYzLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlcl82My5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlcl82My5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNjMuYXBwZW5kKCJjaGFydHMuYWRkKGNoYXJ0KTsiKTsKKyAgICBfYnVpbGRlcl82My5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXJfNjMuYXBwZW5kKCJyZXR1cm4gY2hhcnQ7Iik7CisgICAgYm9keSA9IF9idWlsZGVyXzYzLnRvU3RyaW5nKCk7CisgICAgcmV0dXJuIGJvZHk7CisgIH0KKyAgCisgIC8qKgorICAgKiA8cD5oZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgYSByZ2Igc3RyaW5nIHRvIGEgaGV4IHN0cmluZy48L3A+CisgICAqLworICBwdWJsaWMgU3RyaW5nIHRvSGV4KGZpbmFsIFN0cmluZyByZ2IpIHsKKyAgICBTdHJpbmcgY29sb3JIZXggPSAiIyI7CisgICAgU3RyaW5nW10gX3NwbGl0ID0gcmdiLnNwbGl0KCIsIik7CisgICAgZm9yIChmaW5hbCBTdHJpbmcgY29sb3IgOiBfc3BsaXQpIHsKKyAgICAgIHsKKyAgICAgICAgSW50ZWdlciBpID0gbmV3IEludGVnZXIoY29sb3IpOworICAgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKGNvbG9ySGV4LCAiIik7CisgICAgICAgIFN0cmluZyBfZm9ybWF0ID0gU3RyaW5nLmZvcm1hdCgiJTAyeCIsIGkpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2Zvcm1hdCwgIiIpOworICAgICAgICBjb2xvckhleCA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBjb2xvckhleDsKKyAgfQorICAKKyAgLyoqCisgICAqIDxwPmJ1aWxkIHRoZSBsYWJlbCBzZXJpZXMuIENyZWF0ZSBtdWx0aXBsZSB5LWF4ZXMgd2hlbiB0aGUgdW5kZXJseWluZyBkYXRhbWFydCBwcmVzZW50cyBkaWZmZXJlbnQgc2NhbGVzLjwvcD4KKyAgICogCisgICAqIDxwPnNjYWxlcyBhcmUgdXNlZCB0byBkaXNwbGF5IGxpbmUgY2hhcnRzIHRvZ2V0aGVyIGZvciBjb21wYXJpc29uIHJlYXNvbiBidXQgdGhleSBhcmUgb2YgZGlmZmVyZW50IHNjYWxpbmdzLjwvcD4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlTGFiZWxTZXJpZXMoZmluYWwgQ2hhcnQgY2hhcnQsIGZpbmFsIENoYXJ0QXhpcyBkYXRhX2F4aXMsIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG11bHRpcGxlQXhlcywgZmluYWwgU3RyaW5nIGF4aXNQcmVmaXgsIGZpbmFsIGJvb2xlYW4gc2hvd01hcmtlcikgeworICAgIFN0cmluZyBib2R5ID0gIiI7CisgICAgaW50IG1zckNudCA9IDA7CisgICAgQ2hhcnREYXRhbWFydCBfc291cmNlID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZiA9ICgoQ2hhcnREYXRhbWFydCkgX3NvdXJjZSkuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzEgPSBfZGF0YW1hcnRSZWYuZ2V0U291cmNlKCk7CisgICAgaWYgKChfc291cmNlXzEgaW5zdGFuY2VvZiBEYXRhbWFydEN1YmUpKSB7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMiA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8xID0gKChDaGFydERhdGFtYXJ0KSBfc291cmNlXzIpLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzMgPSBfZGF0YW1hcnRSZWZfMS5nZXRTb3VyY2UoKTsKKyAgICAgIEVMaXN0PERhdGFtYXJ0Q3ViZUVsZW1lbnQ+IF9heGlzc2xpY2VyID0gKChEYXRhbWFydEN1YmUpIF9zb3VyY2VfMykuZ2V0QXhpc3NsaWNlcigpOworICAgICAgZm9yIChmaW5hbCBEYXRhbWFydEN1YmVFbGVtZW50IGF4aXNPclNsaWNlciA6IF9heGlzc2xpY2VyKSB7CisgICAgICAgIGlmICgoYXhpc09yU2xpY2VyIGluc3RhbmNlb2YgRGF0YW1hcnRBeGlzKSkgeworICAgICAgICAgIEVMaXN0PERhdGFtYXJ0RWxlbWVudD4gX2VsZW1lbnRzID0gKChEYXRhbWFydEF4aXMpIGF4aXNPclNsaWNlcikuZ2V0RWxlbWVudHMoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIERhdGFtYXJ0RWxlbWVudCBlbGVtZW50IDogX2VsZW1lbnRzKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIGlmICgoZWxlbWVudCBpbnN0YW5jZW9mIERhdGFtYXJ0RGVyaXZlZE1lYXN1cmUpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBfaXNTY2FsZWQgPSAoKERhdGFtYXJ0RGVyaXZlZE1lYXN1cmUpIGVsZW1lbnQpLmlzU2NhbGVkKCk7CisgICAgICAgICAgICAgICAgaWYgKF9pc1NjYWxlZCkgeworICAgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICAgICAgICAgICAgVmFsdWVTY2FsZUVudW0gX3NjYWxlID0gKChEYXRhbWFydERlcml2ZWRNZWFzdXJlKSBlbGVtZW50KS5nZXRTY2FsZSgpOworICAgICAgICAgICAgICAgICAgU3RyaW5nIF9jcmVhdGVTY2FsZSA9IHRoaXMuY3JlYXRlU2NhbGUoX3NjYWxlLCBkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgbXNyQ250LCBheGlzUHJlZml4LCBzaG93TWFya2VyKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfY3JlYXRlU2NhbGUsICIiKTsKKyAgICAgICAgICAgICAgICAgIGJvZHkgPSBfYnVpbGRlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgbXNyQ250ID0gKG1zckNudCArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBpZiAoKGVsZW1lbnQgaW5zdGFuY2VvZiBEYXRhbWFydE1lYXN1cmUpKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBfaXNTY2FsZWRfMSA9ICgoRGF0YW1hcnRNZWFzdXJlKSBlbGVtZW50KS5pc1NjYWxlZCgpOworICAgICAgICAgICAgICAgIGlmIChfaXNTY2FsZWRfMSkgeworICAgICAgICAgICAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgICAgICAgICAgICAgIFZhbHVlU2NhbGVFbnVtIF9zY2FsZV8xID0gKChEYXRhbWFydE1lYXN1cmUpIGVsZW1lbnQpLmdldFNjYWxlKCk7CisgICAgICAgICAgICAgICAgICBTdHJpbmcgX2NyZWF0ZVNjYWxlXzEgPSB0aGlzLmNyZWF0ZVNjYWxlKF9zY2FsZV8xLCBkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgbXNyQ250LCBheGlzUHJlZml4LCBzaG93TWFya2VyKTsKKyAgICAgICAgICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9jcmVhdGVTY2FsZV8xLCAiIik7CisgICAgICAgICAgICAgICAgICBib2R5ID0gX2J1aWxkZXJfMS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgbXNyQ250ID0gKG1zckNudCArIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfNCA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8yID0gKChDaGFydERhdGFtYXJ0KSBfc291cmNlXzQpLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzUgPSBfZGF0YW1hcnRSZWZfMi5nZXRTb3VyY2UoKTsKKyAgICAgIGlmICgoX3NvdXJjZV81IGluc3RhbmNlb2YgRGF0YW1hcnRFbnRpdHkpKSB7CisgICAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV82ID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWZfMyA9ICgoQ2hhcnREYXRhbWFydCkgX3NvdXJjZV82KS5nZXREYXRhbWFydFJlZigpOworICAgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzcgPSBfZGF0YW1hcnRSZWZfMy5nZXRTb3VyY2UoKTsKKyAgICAgICAgRGF0YW1hcnRFbnRpdHkgZW50aXR5ID0gKChEYXRhbWFydEVudGl0eSkgX3NvdXJjZV83KTsKKyAgICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgIFN0cmluZyBfZW50aXR5U2NhbGUgPSB0aGlzLmVudGl0eVNjYWxlKGVudGl0eSwgZGF0YV9heGlzLCBtdWx0aXBsZUF4ZXMsIG1zckNudCwgYXhpc1ByZWZpeCwgc2hvd01hcmtlcik7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZChfZW50aXR5U2NhbGUsICIiKTsKKyAgICAgICAgYm9keSA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICB9CisgICAgfQorICAgIFNldDxTdHJpbmc+IF9rZXlTZXQgPSBtdWx0aXBsZUF4ZXMua2V5U2V0KCk7CisgICAgaW50IF9zaXplID0gX2tleVNldC5zaXplKCk7CisgICAgYm9vbGVhbiBfZXF1YWxzID0gKF9zaXplID09IDApOworICAgIGlmIChfZXF1YWxzKSB7CisgICAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyXzEgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoYm9keSwgIiIpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIlx0Zm9yIChTdHJpbmcgdGl0bGUgOiAiKTsKKyAgICAgIERhdGFtYXJ0QXhpcyBfYXhpcyA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgICBBeGlzRW51bSBfbmFtZSA9IF9heGlzLmdldE5hbWUoKTsKKyAgICAgIFN0cmluZyBfbGl0ZXJhbCA9IF9uYW1lLmdldExpdGVyYWwoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9saXRlcmFsLCAiIik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiVGl0bGVzQXJyYXkpIHsiKTsKKyAgICAgIF9idWlsZGVyXzEubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJcdFx0Iik7CisgICAgICBEYXRhbWFydEF4aXMgX2F4aXNfMSA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgICBBeGlzRW51bSBfbmFtZV8xID0gX2F4aXNfMS5nZXROYW1lKCk7CisgICAgICBTdHJpbmcgX2xpdGVyYWxfMSA9IF9uYW1lXzEuZ2V0TGl0ZXJhbCgpOworICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX2xpdGVyYWxfMSwgIlx0XHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJTZXJpZXMuYWRkU2VyaWVzKG5ldyBYWXNlcmllcygpLnNldExhYmVsKHRpdGxlKS5zZXRTaG93TWFya2VyKCIpOworICAgICAgU3RyaW5nIF9zdHJpbmcgPSBCb29sZWFuLnZhbHVlT2Yoc2hvd01hcmtlcikudG9TdHJpbmcoKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9zdHJpbmcsICJcdFx0Iik7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiKSk7Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiXHQiKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKCJ9Iik7CisgICAgICBfYnVpbGRlcl8xLm5ld0xpbmUoKTsKKyAgICAgIGJvZHkgPSBfYnVpbGRlcl8xLnRvU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBib2R5OworICB9CisgIAorICAvKioKKyAgICogPHA+aGVscGVyIG1ldGhvZCBmb3Igc2NhbGVzIGNvbWluZyBmcm9tIGRhdGFtYXJ0IGVudGl0aWVzIG5vdCBmcm9tIGN1YmVzLjwvcD4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZW50aXR5U2NhbGUoZmluYWwgRGF0YW1hcnRFbnRpdHkgZW50aXR5LCBmaW5hbCBDaGFydEF4aXMgZGF0YV9heGlzLCBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBtdWx0aXBsZUF4ZXMsIGZpbmFsIGludCBtc3JDbnQsIGZpbmFsIFN0cmluZyBheGlzUHJlZml4LCBmaW5hbCBib29sZWFuIHNob3dNYXJrZXIpIHsKKyAgICBpbnQgY291bnRlciA9IG1zckNudDsKKyAgICBTdHJpbmcgYm9keSA9ICIiOworICAgIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IF9wcm9wZXJ0aWVzID0gZW50aXR5LmdldFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKGZpbmFsIERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkgOiBfcHJvcGVydGllcykgeworICAgICAgaWYgKChwcm9wZXJ0eSBpbnN0YW5jZW9mIERhdGFtYXJ0UHJvcGVydHkpKSB7CisgICAgICAgIGJvb2xlYW4gX2lzU2NhbGVkID0gcHJvcGVydHkuaXNTY2FsZWQoKTsKKyAgICAgICAgaWYgKF9pc1NjYWxlZCkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChib2R5LCAiIik7CisgICAgICAgICAgVmFsdWVTY2FsZUVudW0gX3NjYWxlID0gcHJvcGVydHkuZ2V0U2NhbGUoKTsKKyAgICAgICAgICBTdHJpbmcgX2NyZWF0ZVNjYWxlID0gdGhpcy5jcmVhdGVTY2FsZShfc2NhbGUsIGRhdGFfYXhpcywgbXVsdGlwbGVBeGVzLCBjb3VudGVyLCBheGlzUHJlZml4LCBzaG93TWFya2VyKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2NyZWF0ZVNjYWxlLCAiIik7CisgICAgICAgICAgYm9keSA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgY291bnRlciA9IChjb3VudGVyICsgMSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgRUxpc3Q8RGF0YW1hcnROYXZpZ2F0aW9uPiBfbmF2aWdhdGlvbnMgPSBlbnRpdHkuZ2V0TmF2aWdhdGlvbnMoKTsKKyAgICBmb3IgKGZpbmFsIERhdGFtYXJ0TmF2aWdhdGlvbiBuYXZpZ2F0aW9uIDogX25hdmlnYXRpb25zKSB7CisgICAgICB7CisgICAgICAgIGlmICgobmF2aWdhdGlvbiBpbnN0YW5jZW9mIERhdGFtYXJ0TWVtYmVyKSkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICAgIERhdGFtYXJ0RW50aXR5IF9kYXRhbWFydEVudGl0eSA9ICgoRGF0YW1hcnRNZW1iZXIpIG5hdmlnYXRpb24pLmdldERhdGFtYXJ0RW50aXR5KCk7CisgICAgICAgICAgU3RyaW5nIF9lbnRpdHlTY2FsZSA9IHRoaXMuZW50aXR5U2NhbGUoX2RhdGFtYXJ0RW50aXR5LCBkYXRhX2F4aXMsIG11bHRpcGxlQXhlcywgY291bnRlciwgYXhpc1ByZWZpeCwgc2hvd01hcmtlcik7CisgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoX2VudGl0eVNjYWxlLCAiIik7CisgICAgICAgICAgYm9keSA9IF9idWlsZGVyXzEudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE93bmVyKSkgeworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMiA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICAgICAgX2J1aWxkZXJfMi5hcHBlbmQoYm9keSwgIiIpOworICAgICAgICAgIERhdGFtYXJ0RW50aXR5IF9kYXRhbWFydEVudGl0eV8xID0gKChEYXRhbWFydE93bmVyKSBuYXZpZ2F0aW9uKS5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgICAgIFN0cmluZyBfZW50aXR5U2NhbGVfMSA9IHRoaXMuZW50aXR5U2NhbGUoX2RhdGFtYXJ0RW50aXR5XzEsIGRhdGFfYXhpcywgbXVsdGlwbGVBeGVzLCBjb3VudGVyLCBheGlzUHJlZml4LCBzaG93TWFya2VyKTsKKyAgICAgICAgICBfYnVpbGRlcl8yLmFwcGVuZChfZW50aXR5U2NhbGVfMSwgIiIpOworICAgICAgICAgIGJvZHkgPSBfYnVpbGRlcl8yLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGJvZHk7CisgIH0KKyAgCisgIC8qKgorICAgKiA8cD5oZWxwZXIgbWV0aG9kIGZvciBzY2FsZXMuPC9wPgorICAgKi8KKyAgcHVibGljIFN0cmluZyBjcmVhdGVTY2FsZShmaW5hbCBWYWx1ZVNjYWxlRW51bSBzY2FsZSwgZmluYWwgQ2hhcnRBeGlzIGRhdGFfYXhpcywgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbXVsdGlwbGVBeGVzLCBmaW5hbCBpbnQgbXNyQ250LCBmaW5hbCBTdHJpbmcgYXhpc1ByZWZpeCwgZmluYWwgYm9vbGVhbiBzaG93TWFya2VyKSB7CisgICAgU3RyaW5nIG11bHRpcGxlQm9keSA9ICIiOworICAgIFN0cmluZyBib2R5ID0gIiI7CisgICAgaW50IHNjYWxlT3JkaW5hbCA9IHNjYWxlLm9yZGluYWwoKTsKKyAgICBTdHJpbmcgc2NhbGVOYW1lID0gc2NhbGUudG9TdHJpbmcoKTsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIERhdGFtYXJ0QXhpcyBfYXhpcyA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWUgPSBfYXhpcy5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9saXRlcmFsID0gX25hbWUuZ2V0TGl0ZXJhbCgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbGl0ZXJhbCwgIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJTZXJpZXMuYWRkU2VyaWVzKG5ldyBYWXNlcmllcygiKTsKKyAgICBjaGFyIF9jaGFyQXQgPSBheGlzUHJlZml4LmNoYXJBdCgxKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoX2NoYXJBdCwgIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJheGVzLiIpOworICAgIGNoYXIgX2NoYXJBdF8xID0gYXhpc1ByZWZpeC5jaGFyQXQoMSk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9jaGFyQXRfMSwgIlx0Iik7CisgICAgeworICAgICAgaWYgKChzY2FsZU9yZGluYWwgIT0gMCkpIHsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKChzY2FsZU9yZGluYWwgKyAxKSwgIlx0Iik7CisgICAgICB9CisgICAgfQorICAgIF9idWlsZGVyLmFwcGVuZCgiKS5zZXRMYWJlbCgiKTsKKyAgICBEYXRhbWFydEF4aXMgX2F4aXNfMSA9IGRhdGFfYXhpcy5nZXRBeGlzKCk7CisgICAgQXhpc0VudW0gX25hbWVfMSA9IF9heGlzXzEuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfbGl0ZXJhbF8xID0gX25hbWVfMS5nZXRMaXRlcmFsKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKF9saXRlcmFsXzEsICJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiVGl0bGVzQXJyYXkuZ2V0KCIpOworICAgIF9idWlsZGVyLmFwcGVuZChtc3JDbnQsICJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiKSkuc2V0U2hvd01hcmtlcigiKTsKKyAgICBTdHJpbmcgX3N0cmluZyA9IEJvb2xlYW4udmFsdWVPZihzaG93TWFya2VyKS50b1N0cmluZygpOworICAgIF9idWlsZGVyLmFwcGVuZChfc3RyaW5nLCAiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIikpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgYm9keSA9IF9idWlsZGVyLnRvU3RyaW5nKCk7CisgICAgU2V0PFN0cmluZz4gX2tleVNldCA9IG11bHRpcGxlQXhlcy5rZXlTZXQoKTsKKyAgICBib29sZWFuIF9jb250YWlucyA9IF9rZXlTZXQuY29udGFpbnMoc2NhbGVOYW1lKTsKKyAgICBib29sZWFuIF9ub3QgPSAoIV9jb250YWlucyk7CisgICAgaWYgKF9ub3QpIHsKKyAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXJfMSA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiYXhlcy5hZGRBeGlzKG5ldyBYWWF4aXMoWFlheGVzLiIpOworICAgICAgY2hhciBfY2hhckF0XzIgPSBheGlzUHJlZml4LmNoYXJBdCgxKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9jaGFyQXRfMiwgIiIpOworICAgICAgeworICAgICAgICBpZiAoKHNjYWxlT3JkaW5hbCAhPSAwKSkgeworICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKChzY2FsZU9yZGluYWwgKyAxKSwgIiIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiKS5zZXRUaWNrT3B0aW9ucyhheGlzVGlja1JlbmRlcmVyIik7CisgICAgICB7CisgICAgICAgIGludCBfYW5nbGUgPSBkYXRhX2F4aXMuZ2V0QW5nbGUoKTsKKyAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKF9hbmdsZSAhPSAwKTsKKyAgICAgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgICAgICBfYnVpbGRlcl8xLmFwcGVuZCgiLnNldEFuZ2xlKCIpOworICAgICAgICAgIGludCBfYW5nbGVfMSA9IGRhdGFfYXhpcy5nZXRBbmdsZSgpOworICAgICAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9hbmdsZV8xLCAiIik7CisgICAgICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIikiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgX2J1aWxkZXJfMS5hcHBlbmQoIikpOyIpOworICAgICAgX2J1aWxkZXJfMS5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgbXVsdGlwbGVCb2R5ID0gX2J1aWxkZXJfMS50b1N0cmluZygpOworICAgICAgbXVsdGlwbGVBeGVzLnB1dChzY2FsZU5hbWUsIG11bHRpcGxlQm9keSk7CisgICAgfQorICAgIHJldHVybiBib2R5OworICB9CisgIAorICAvKioKKyAgICogPHA+aGVscGVyIG1ldGhvZCB0byBnZXQgYSBwcm9wZXJ0eSBuYW1lIG9yIGl0cyBhbGlhcyBpZiBwcmVzZW50IG9mIGEgZW50aXR5J3MgcHJvcGVydHkgb2JqZWN0LjwvcD4KKyAgICovCisgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKGZpbmFsIERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICBMRW50aXR5QXR0cmlidXRlIF9wcm9wZXJ0eVJlZiA9IHByb3BlcnR5LmdldFByb3BlcnR5UmVmKCk7CisgICAgU3RyaW5nIF9uYW1lID0gKChMQXR0cmlidXRlKSBfcHJvcGVydHlSZWYpLmdldE5hbWUoKTsKKyAgICByZXR1cm4gX25hbWUudG9VcHBlckNhc2UoKTsKKyAgfQorICAKKyAgLyoqCisgICAqIDxwPmhlbHBlciBtZXRob2QgdG8gZ2V0IGEgbGV2ZWwgbmFtZSBvZiBhIGhpZXJhcmNoeSdzIGxldmVsIG9iamVjdC48L3A+CisgICAqLworICBwdWJsaWMgU3RyaW5nIGdldExldmVsTmFtZShmaW5hbCBDdWJlTGV2ZWwgbGV2ZWwpIHsKKyAgICByZXR1cm4gbGV2ZWwuZ2V0TmFtZSgpOworICB9CisgIAorICBwdWJsaWMgU3RyaW5nIHNldHVwKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nIGJvZHkgPSAiIjsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoYm9keSwgIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJzdWJzY3JpYmUoKTsiKTsKKyAgICBib2R5ID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmaWx0ZXJJZE1hcCA9IENvbGxlY3Rpb25MaXRlcmFscy48U3RyaW5nLCBTdHJpbmc+bmV3SGFzaE1hcCgpOworICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgIGJvb2xlYW4gX2FuZF8xID0gZmFsc2U7CisgICAgQ2hhcnREYXRhbWFydCBfc291cmNlID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9zb3VyY2UsIG51bGwpKTsKKyAgICBpZiAoIV9ub3RFcXVhbHMpIHsKKyAgICAgIF9hbmRfMSA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICBDaGFydERhdGFtYXJ0IF9zb3VyY2VfMSA9IGNoYXJ0LmdldFNvdXJjZSgpOworICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZiA9IF9zb3VyY2VfMS5nZXREYXRhbWFydFJlZigpOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzXzEgPSAoIU9iamVjdHMuZXF1YWwoX2RhdGFtYXJ0UmVmLCBudWxsKSk7CisgICAgICBfYW5kXzEgPSBfbm90RXF1YWxzXzE7CisgICAgfQorICAgIGlmICghX2FuZF8xKSB7CisgICAgICBfYW5kID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV8yID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmXzEgPSBfc291cmNlXzIuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIFN0cmluZyBfbmFtZSA9IF9kYXRhbWFydFJlZl8xLmdldE5hbWUoKTsKKyAgICAgIGJvb2xlYW4gX25vdEVxdWFsc18yID0gKCFPYmplY3RzLmVxdWFsKF9uYW1lLCBudWxsKSk7CisgICAgICBfYW5kID0gX25vdEVxdWFsc18yOworICAgIH0KKyAgICBpZiAoX2FuZCkgeworICAgICAgQ2hhcnREYXRhbWFydCBfc291cmNlXzMgPSBjaGFydC5nZXRTb3VyY2UoKTsKKyAgICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWZfMiA9IF9zb3VyY2VfMy5nZXREYXRhbWFydFJlZigpOworICAgICAgdGhpcy5kYXRhbWFydEluZmVycmVyLmNyZWF0ZUZpbHRlck1hcChfZGF0YW1hcnRSZWZfMiwgZmlsdGVySWRNYXApOworICAgIH0KKyAgICBTZXQ8U3RyaW5nPiBfa2V5U2V0ID0gZmlsdGVySWRNYXAua2V5U2V0KCk7CisgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsdGVyIDogX2tleVNldCkgeworICAgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlcl8xID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKGJvZHksICIiKTsKKyAgICAgIFN0cmluZyBfZ2V0ID0gZmlsdGVySWRNYXAuZ2V0KGZpbHRlcik7CisgICAgICBDaGFyU2VxdWVuY2UgX3NldHVwRXZlbnQgPSB0aGlzLnNldHVwRXZlbnQoX2dldCwgZmlsdGVyKTsKKyAgICAgIF9idWlsZGVyXzEuYXBwZW5kKF9zZXR1cEV2ZW50LCAiIik7CisgICAgICBib2R5ID0gX2J1aWxkZXJfMS50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gYm9keTsKKyAgfQorICAKKyAgcHVibGljIENoYXJTZXF1ZW5jZSBzZXR1cEV2ZW50KGZpbmFsIFN0cmluZyBldmVudElkLCBmaW5hbCBTdHJpbmcgZmlsdGVyKSB7CisgICAgU3RyaW5nQ29uY2F0ZW5hdGlvbiBfYnVpbGRlciA9IG5ldyBTdHJpbmdDb25jYXRlbmF0aW9uKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJldmVudEJyb2tlci5zdWJzY3JpYmUoXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoZXZlbnRJZCwgIiIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsIik7CisgICAgX2J1aWxkZXIubmV3TGluZUlmTm90RW1wdHkoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm5ldyBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcigpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiQE92ZXJyaWRlIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQgZXZlbnQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJmaW5hbCBFdmVudEJyb2tlck1zZyBtc2cgPSAoRXZlbnRCcm9rZXJNc2cpZXZlbnQuZ2V0UHJvcGVydHkob3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VXRpbHMuREFUQSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZmlsdGVyR2VuZXJhdG9yLnNlbGVjdEl0ZW0oXCIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoZmlsdGVyLCAiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXCIsIG1zZy5nZXROYW1lKCkpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICByZXR1cm4gX2J1aWxkZXI7CisgIH0KKyAgCisgIHB1YmxpYyBDaGFyU2VxdWVuY2UgbG9jYWxlQ2hhbmdlZChmaW5hbCBDaGFydCBjaGFydCkgeworICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgIF9idWlsZGVyLmFwcGVuZCgidGhpcy5sb2NhbGUgPSBsb2NhbGU7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiaWYoY2hhcnRzICE9IG51bGwpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZm9yKERDaGFydHMgY2hhcnQ6Y2hhcnRzKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY2hhcnQuc2V0TG9jYWxlKGxvY2FsZSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIHsKKyAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgQ2hhcnREYXRhbWFydCBfc291cmNlID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICBEYXRhbWFydERlZmluaXRpb24gX2RhdGFtYXJ0UmVmID0gX3NvdXJjZS5nZXREYXRhbWFydFJlZigpOworICAgICAgYm9vbGVhbiBfaXNEZXNjcmlwdGlvbiA9IF9kYXRhbWFydFJlZi5pc0Rlc2NyaXB0aW9uKCk7CisgICAgICBpZiAoIV9pc0Rlc2NyaXB0aW9uKSB7CisgICAgICAgIF9hbmQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIENoYXJ0RGF0YW1hcnQgX3NvdXJjZV8xID0gY2hhcnQuZ2V0U291cmNlKCk7CisgICAgICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBfZGF0YW1hcnRSZWZfMSA9IF9zb3VyY2VfMS5nZXREYXRhbWFydFJlZigpOworICAgICAgICBTdHJpbmcgX2Rlc2NyaXB0aW9uVmFsdWUgPSBfZGF0YW1hcnRSZWZfMS5nZXREZXNjcmlwdGlvblZhbHVlKCk7CisgICAgICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChfZGVzY3JpcHRpb25WYWx1ZSwgbnVsbCkpOworICAgICAgICBfYW5kID0gX25vdEVxdWFsczsKKyAgICAgIH0KKyAgICAgIGlmIChfYW5kKSB7CisgICAgICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoImNoYXJ0LnNldERlc2NyaXB0aW9uKGRzbE1ldGFkYXRhU2VydmljZS50cmFuc2xhdGUobG9jYWxlLnRvTGFuZ3VhZ2VUYWcoKSwgXCIiKTsKKyAgICAgICAgQ2hhcnREYXRhbWFydCBfc291cmNlXzIgPSBjaGFydC5nZXRTb3VyY2UoKTsKKyAgICAgICAgRGF0YW1hcnREZWZpbml0aW9uIF9kYXRhbWFydFJlZl8yID0gX3NvdXJjZV8yLmdldERhdGFtYXJ0UmVmKCk7CisgICAgICAgIFN0cmluZyBfZGVzY3JpcHRpb25WYWx1ZV8xID0gX2RhdGFtYXJ0UmVmXzIuZ2V0RGVzY3JpcHRpb25WYWx1ZSgpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoX2Rlc2NyaXB0aW9uVmFsdWVfMSwgIlx0XHQiKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJcIikpOyIpOworICAgICAgICBfYnVpbGRlci5uZXdMaW5lSWZOb3RFbXB0eSgpOworICAgICAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICAgICAgX2J1aWxkZXIuYXBwZW5kKCJjaGFydC5zZXREb3dubG9hZEJ1dHRvbkNhcHRpb24oZHNsTWV0YWRhdGFTZXJ2aWNlLnRyYW5zbGF0ZShsb2NhbGUudG9MYW5ndWFnZVRhZygpLCBcImRvd25sb2FkXCIpKTsiKTsKKyAgICAgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgICAgfQorICAgIH0KKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImlmKGZpbHRlckdlbmVyYXRvciAhPSBudWxsKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImZpbHRlckdlbmVyYXRvci5zZXRMb2NhbGUobG9jYWxlKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiaWYobGF5b3V0TWFuYWdlciAhPSBudWxsKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImxheW91dE1hbmFnZXIuc2V0TGFiZWxWYWx1ZShkc2xNZXRhZGF0YVNlcnZpY2UudHJhbnNsYXRlKGxvY2FsZS50b0xhbmd1YWdlVGFnKCksIFwiIik7CisgICAgU3RyaW5nIF9uYW1lID0gY2hhcnQuZ2V0TmFtZSgpOworICAgIF9idWlsZGVyLmFwcGVuZChfbmFtZSwgIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIikpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIHJldHVybiBfYnVpbGRlcjsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgaW5mZXIoZmluYWwgRU9iamVjdCBwY2tnLCBmaW5hbCBJSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3IgYWNjZXB0b3IsIGZpbmFsIGJvb2xlYW4gaXNQcmVJbmRleGluZ1BoYXNlKSB7CisgICAgaWYgKHBja2cgaW5zdGFuY2VvZiBDaGFydFBhY2thZ2UpIHsKKyAgICAgIF9pbmZlcigoQ2hhcnRQYWNrYWdlKXBja2csIGFjY2VwdG9yLCBpc1ByZUluZGV4aW5nUGhhc2UpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAocGNrZyAhPSBudWxsKSB7CisgICAgICBfaW5mZXIocGNrZywgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICBBcnJheXMuPE9iamVjdD5hc0xpc3QocGNrZywgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0TW9kZWxHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvanZtbW9kZWwvQ2hhcnRNb2RlbEdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YTUwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0NoYXJ0TW9kZWxHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDk1OCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbDsKKworaW1wb3J0IGNvbS52YWFkaW4uZGF0YS5Qcm9wZXJ0eTsKK2ltcG9ydCBjb20udmFhZGluLnNlcnZlci5QYWdlOworaW1wb3J0IGNvbS52YWFkaW4udWkuSG9yaXpvbnRhbExheW91dDsKK2ltcG9ydCBjb20udmFhZGluLnVpLkphdmFTY3JpcHRGdW5jdGlvbjsKK2ltcG9ydCBjb20udmFhZGluLnVpLkxhYmVsOworaW1wb3J0IGNvbS52YWFkaW4udWkuVGFiU2hlZXQ7CitpbXBvcnQgY29tLnZhYWRpbi51aS5VSTsKK2ltcG9ydCBlbGVtZW50YWwuanNvbi5Kc29uQXJyYXk7CitpbXBvcnQgZWxlbWVudGFsLmpzb24uSnNvbkV4Y2VwdGlvbjsKK2ltcG9ydCBlbGVtZW50YWwuanNvbi5Kc29uT2JqZWN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMuRENoYXJ0czsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLkRvd25sb2FkQnV0dG9uTG9jYXRpb247CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5iYXNlLmVsZW1lbnRzLlRyZW5kbGluZTsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLmJhc2UuZWxlbWVudHMuWFlheGlzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMuYmFzZS5lbGVtZW50cy5YWXNlcmllczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLmRhdGEuRGF0YVNlcmllczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLmRhdGEuVGlja3M7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5MZWdlbmRQbGFjZW1lbnRzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuUHlyYW1pZFNpZGVzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuU2VyaWVzVG9nZ2xlczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm1ldGFkYXRhLlRvb2x0aXBBeGVzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuWFlheGVzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEuWGF4ZXM7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5ZYXhlczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm1ldGFkYXRhLmRpcmVjdGlvbnMuQmFyRGlyZWN0aW9uczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm1ldGFkYXRhLmxvY2F0aW9ucy5Ub29sdGlwTG9jYXRpb25zOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMubWV0YWRhdGEucmVuZGVyZXJzLkF4aXNSZW5kZXJlcnM7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5tZXRhZGF0YS5yZW5kZXJlcnMuU2VyaWVzUmVuZGVyZXJzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5BeGVzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5BeGVzRGVmYXVsdHM7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5vcHRpb25zLkN1cnNvcjsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuSGlnaGxpZ2h0ZXI7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5vcHRpb25zLkxlZ2VuZDsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuU2VyaWVzOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMub3B0aW9ucy5TZXJpZXNEZWZhdWx0czsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLm9wdGlvbnMuVGl0bGU7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuYXhpcy5MaW5lYXJBeGlzUmVuZGVyZXI7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMubGVnZW5kLkVuaGFuY2VkTGVnZW5kUmVuZGVyZXI7CitpbXBvcnQgb3JnLmR1c3Nhbi52YWFkaW4uZGNoYXJ0cy5yZW5kZXJlcnMuc2VyaWVzLkJhclJlbmRlcmVyOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLnNlcmllcy5CdWJibGVSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy5zZXJpZXMuRG9udXRSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy5zZXJpZXMuTWV0ZXJHYXVnZVJlbmRlcmVyOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLnNlcmllcy5QaWVSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy5zZXJpZXMuUHlyYW1pZFJlbmRlcmVyOworaW1wb3J0IG9yZy5kdXNzYW4udmFhZGluLmRjaGFydHMucmVuZGVyZXJzLnRpY2suQXhpc1RpY2tSZW5kZXJlcjsKK2ltcG9ydCBvcmcuZHVzc2FuLnZhYWRpbi5kY2hhcnRzLnJlbmRlcmVycy50aWNrLkNhbnZhc0F4aXNUaWNrUmVuZGVyZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5kaS5leHRlbnNpb25zLkV2ZW50VXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQuY29yZS5zZXJ2aWNlcy5ldmVudHMuSUV2ZW50QnJva2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLmU0LnVpLm1vZGVsLmFwcGxpY2F0aW9uLnVpLk1VSUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuYmFzaWMuTVBhcnRTdGFjazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lNC51aS5tb2RlbC5hcHBsaWNhdGlvbi51aS5pbXBsLlVJRWxlbWVudEltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZTQudWkubW9kZWwuYXBwbGljYXRpb24udWkuaW1wbC5VaVBhY2thZ2VJbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmV2ZW50YnJva2VyLkV2ZW50QnJva2VyTXNnOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudWkuYXBpLmRhdGFtYXJ0LkRlcml2ZWRPbGFwRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAudXRpbHMuY29uc3RhbnRzLkV4dGVuZGVkRGF0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnZhYWRpbi5WaWV3TGF5b3V0TWFuYWdlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLmdlbmVyYXRvci5CYXNpY0RzbEdlbmVyYXRvclV0aWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydE1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5qdm1tb2RlbC5EM0pzSmF2YVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24uRGF0YW1hcnRGaWx0ZXJHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5DZWxsU2V0VG9EM0pzb25Db252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkQXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRDZWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnQuY29tbW9uLm9sYXAuRGVyaXZlZEhpZXJhcmNoeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRMZXZlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0LmNvbW1vbi5vbGFwLkRlcml2ZWRNZW1iZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydC5jb21tb24ub2xhcC5EZXJpdmVkUG9zaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkkxOE5Nb2RlbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGVuZDIubGliLlN0cmluZ0NvbmNhdGVuYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bURlY2xhcmVkVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuSUZpbGVTeXN0ZW1BY2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLlF1YWxpZmllZE5hbWU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIuR2VuZXJhdG9yQ29uZmlnOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLkltcG9ydE1hbmFnZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuY29tcGlsZXIub3V0cHV0LlRyZWVBcHBlbmRhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5FeHRlbnNpb247CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudDsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ2hhcnRNb2RlbEdlbmVyYXRvciBleHRlbmRzIEkxOE5Nb2RlbEdlbmVyYXRvciB7CisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIElRdWFsaWZpZWROYW1lUHJvdmlkZXIgX2lRdWFsaWZpZWROYW1lUHJvdmlkZXI7CisgIAorICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBEM0pzSmF2YVV0aWwgX2QzSnNKYXZhVXRpbDsKKyAgCisgIEBJbmplY3QKKyAgQEV4dGVuc2lvbgorICBwcml2YXRlIEJhc2ljRHNsR2VuZXJhdG9yVXRpbHMgX2Jhc2ljRHNsR2VuZXJhdG9yVXRpbHM7CisgIAorICBwdWJsaWMgVHJlZUFwcGVuZGFibGUgY3JlYXRlQXBwZW5kYWJsZShmaW5hbCBFT2JqZWN0IGNvbnRleHQsIGZpbmFsIEltcG9ydE1hbmFnZXIgaW1wb3J0TWFuYWdlciwgZmluYWwgR2VuZXJhdG9yQ29uZmlnIGNvbmZpZykgeworICAgIFRyZWVBcHBlbmRhYmxlIF94YmxvY2tleHByZXNzaW9uID0gbnVsbDsKKyAgICB7CisgICAgICBSZXNvdXJjZSBfZVJlc291cmNlID0gY29udGV4dC5lUmVzb3VyY2UoKTsKKyAgICAgIHRoaXMuc2V0QnVpbGRlcihfZVJlc291cmNlKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZy5jbGFzcyk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzEgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZy5jbGFzcyk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzIgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKEhhc2hNYXAuY2xhc3MsIF90eXBlUmVmLCBfdHlwZVJlZl8xKTsKKyAgICAgIEp2bVR5cGUgX3R5cGUgPSBfdHlwZVJlZl8yLmdldFR5cGUoKTsKKyAgICAgIGltcG9ydE1hbmFnZXIuYWRkSW1wb3J0Rm9yKF90eXBlKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfMyA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNCA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoU3RyaW5nLmNsYXNzKTsKKyAgICAgIEp2bVR5cGVSZWZlcmVuY2UgX3R5cGVSZWZfNSA9IHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLnR5cGVSZWYoTWFwLmNsYXNzLCBfdHlwZVJlZl8zLCBfdHlwZVJlZl80KTsKKyAgICAgIEp2bVR5cGUgX3R5cGVfMSA9IF90eXBlUmVmXzUuZ2V0VHlwZSgpOworICAgICAgaW1wb3J0TWFuYWdlci5hZGRJbXBvcnRGb3IoX3R5cGVfMSk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzYgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKFN0cmluZy5jbGFzcyk7CisgICAgICBKdm1UeXBlUmVmZXJlbmNlIF90eXBlUmVmXzcgPSB0aGlzLl90eXBlUmVmZXJlbmNlQnVpbGRlci50eXBlUmVmKENvbGxlY3Rpb24uY2xhc3MsIF90eXBlUmVmXzYpOworICAgICAgSnZtVHlwZSBfdHlwZV8yID0gX3R5cGVSZWZfNy5nZXRUeXBlKCk7CisgICAgICBpbXBvcnRNYW5hZ2VyLmFkZEltcG9ydEZvcihfdHlwZV8yKTsKKyAgICAgIHRoaXMuX2Jhc2ljRHNsR2VuZXJhdG9yVXRpbHMuYWRkSW1wb3J0Rm9yKHRoaXMsIGltcG9ydE1hbmFnZXIsIHRoaXMuX3R5cGVSZWZlcmVuY2VCdWlsZGVyLCBQcm9wZXJ0eS5WYWx1ZUNoYW5nZUxpc3RlbmVyLmNsYXNzLCBEQ2hhcnRzLmNsYXNzLCBMYWJlbC5jbGFzcywgTGlzdC5jbGFzcywgQXJyYXlMaXN0LmNsYXNzLCBQYWdlLmNsYXNzLCBQYWdlLlN0eWxlcy5jbGFzcywgRGVyaXZlZEF4aXMuY2xhc3MsIERlcml2ZWRDZWxsLmNsYXNzLCBEZXJpdmVkUG9zaXRpb24uY2xhc3MsIERlcml2ZWRNZW1iZXIuY2xhc3MsIEhvcml6b250YWxMYXlvdXQuY2xhc3MsIFRhYlNoZWV0LmNsYXNzLCBTZXJpZXMuY2xhc3MsIFhZc2VyaWVzLmNsYXNzLCBUaWNrcy5jbGFzcywgRGF0YVNlcmllcy5jbGFzcywgU2VyaWVzRGVmYXVsdHMuY2xhc3MsIFNlcmllc1JlbmRlcmVycy5jbGFzcywgQ2FudmFzQXhpc1RpY2tSZW5kZXJlci5jbGFzcywgRG9udXRSZW5kZXJlci5jbGFzcywgUGllUmVuZGVyZXIuY2xhc3MsIEJ1YmJsZVJlbmRlcmVyLmNsYXNzLCBCYXJSZW5kZXJlci5jbGFzcywgQmFyRGlyZWN0aW9ucy5jbGFzcywgTWV0ZXJHYXVnZVJlbmRlcmVyLmNsYXNzLCBQeXJhbWlkUmVuZGVyZXIuY2xhc3MsIFB5cmFtaWRTaWRlcy5jbGFzcywgVHJlbmRsaW5lLmNsYXNzLCBDdXJzb3IuY2xhc3MsIExlZ2VuZC5jbGFzcywgTGVnZW5kUGxhY2VtZW50cy5jbGFzcywgRW5oYW5jZWRMZWdlbmRSZW5kZXJlci5jbGFzcywgU2VyaWVzVG9nZ2xlcy5jbGFzcywgSGlnaGxpZ2h0ZXIuY2xhc3MsIFRpdGxlLmNsYXNzLCBUb29sdGlwTG9jYXRpb25zLmNsYXNzLCBUb29sdGlwQXhlcy5jbGFzcywgQXhlcy5jbGFzcywgWFlheGVzLmNsYXNzLCBYWWF4aXMuY2xhc3MsIFhheGVzLmNsYXNzLCBZYXhlcy5jbGFzcywgQXhpc1RpY2tSZW5kZXJlci5jbGFzcywgQXhpc1JlbmRlcmVycy5jbGFzcywgTGluZWFyQXhpc1JlbmRlcmVyLmNsYXNzLCBBeGVzRGVmYXVsdHMuY2xhc3MsIERvd25sb2FkQnV0dG9uTG9jYXRpb24uY2xhc3MsIE9wdGlvbnMuY2xhc3MsIERlcml2ZWRIaWVyYXJjaHkuY2xhc3MsIERlcml2ZWRMZXZlbC5jbGFzcywgRGVyaXZlZE9sYXBFeGNlcHRpb24uY2xhc3MsIElFdmVudEJyb2tlci5jbGFzcywgQ2VsbFNldFRvRDNKc29uQ29udmVydGVyLmNsYXNzLCBEYXRlLmNsYXNzLCBFeHRlbmRlZERhdGUuY2xhc3MsIEphdmFTY3JpcHRGdW5jdGlvbi5jbGFzcywgSnNvbkFycmF5LmNsYXNzLCBKc29uT2JqZWN0LmNsYXNzLCBKc29uRXhjZXB0aW9uLmNsYXNzLCBFdmVudEhhbmRsZXIuY2xhc3MsIEV2ZW50LmNsYXNzLCBFdmVudFV0aWxzLmNsYXNzLCBFdmVudEJyb2tlck1zZy5jbGFzcywgRXhlY3V0b3JzLmNsYXNzLCBQYWdlLkJyb3dzZXJXaW5kb3dSZXNpemVFdmVudC5jbGFzcywgUGFnZS5Ccm93c2VyV2luZG93UmVzaXplTGlzdGVuZXIuY2xhc3MsIE5vdGlmaWNhdGlvbi5jbGFzcywgQWRhcHRlci5jbGFzcywgQWRhcHRlckltcGwuY2xhc3MsIEVPYmplY3QuY2xhc3MsIFVJRWxlbWVudEltcGwuY2xhc3MsIFVpUGFja2FnZUltcGwuY2xhc3MsIE1VSUVsZW1lbnQuY2xhc3MsIE1QYXJ0U3RhY2suY2xhc3MsIFVJLmNsYXNzLCBSZXNvdXJjZUJ1bmRsZS5jbGFzcywgTG9jYWxlLmNsYXNzLCBEYXRhbWFydEZpbHRlckdlbmVyYXRvci5jbGFzcywgVmlld0xheW91dE1hbmFnZXIuY2xhc3MpOworICAgICAgX3hibG9ja2V4cHJlc3Npb24gPSBzdXBlci5jcmVhdGVBcHBlbmRhYmxlKGNvbnRleHQsIGltcG9ydE1hbmFnZXIsIGNvbmZpZyk7CisgICAgfQorICAgIHJldHVybiBfeGJsb2NrZXhwcmVzc2lvbjsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgZG9HZW5lcmF0ZShmaW5hbCBSZXNvdXJjZSBpbnB1dCwgZmluYWwgSUZpbGVTeXN0ZW1BY2Nlc3MgZnNhKSB7CisgICAgc3VwZXIuYWRkVHJhbnNsYXRhYmxlcygiZG93bmxvYWQiKTsKKyAgICBzdXBlci5kb0dlbmVyYXRlKGlucHV0LCBmc2EpOworICAgIEVMaXN0PEVPYmplY3Q+IF9jb250ZW50cyA9IGlucHV0LmdldENvbnRlbnRzKCk7CisgICAgZm9yIChmaW5hbCBFT2JqZWN0IG9iaiA6IF9jb250ZW50cykgeworICAgICAgdGhpcy5pbnRlcm5hbERvR2VuZXJhdGUob2JqLCBmc2EpOworICAgIH0KKyAgfQorICAKKyAgcHJvdGVjdGVkIHZvaWQgX2ludGVybmFsRG9HZW5lcmF0ZShmaW5hbCBDaGFydE1vZGVsIGNoYXJ0TW9kZWwsIGZpbmFsIElGaWxlU3lzdGVtQWNjZXNzIGZzYSkgeworICAgIEVMaXN0PENoYXJ0UGFja2FnZT4gX3BhY2thZ2VzID0gY2hhcnRNb2RlbC5nZXRQYWNrYWdlcygpOworICAgIGZvciAoZmluYWwgQ2hhcnRQYWNrYWdlIHBrZyA6IF9wYWNrYWdlcykgeworICAgICAgRUxpc3Q8Q2hhcnQ+IF9jaGFydHMgPSBwa2cuZ2V0Q2hhcnRzKCk7CisgICAgICBmb3IgKGZpbmFsIENoYXJ0IGNoYXJ0IDogX2NoYXJ0cykgeworICAgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICAgIGlmICgoX2NoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSkpIHsKKyAgICAgICAgICBRdWFsaWZpZWROYW1lIF9mdWxseVF1YWxpZmllZE5hbWUgPSB0aGlzLl9pUXVhbGlmaWVkTmFtZVByb3ZpZGVyLmdldEZ1bGx5UXVhbGlmaWVkTmFtZShwa2cpOworICAgICAgICAgIFN0cmluZyBwY2tnTmFtZSA9IF9mdWxseVF1YWxpZmllZE5hbWUudG9TdHJpbmcoKTsKKyAgICAgICAgICBTdHJpbmdCdWlsZGVyIHN0ckJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgIFN0cmluZyBwY2tnTmFtZVBhdGggPSBwY2tnTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCAiLyIpOworICAgICAgICAgIFN0cmluZ0NvbmNhdGVuYXRpb24gX2J1aWxkZXIgPSBuZXcgU3RyaW5nQ29uY2F0ZW5hdGlvbigpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChwY2tnTmFtZVBhdGgsICIiKTsKKyAgICAgICAgICBfYnVpbGRlci5hcHBlbmQoIi8iKTsKKyAgICAgICAgICBTdHJpbmcgX2NyZWF0ZUNoYXJ0SnNGaWxlbmFtZSA9IHRoaXMuX2QzSnNKYXZhVXRpbC5jcmVhdGVDaGFydEpzRmlsZW5hbWUoY2hhcnQpOworICAgICAgICAgIF9idWlsZGVyLmFwcGVuZChfY3JlYXRlQ2hhcnRKc0ZpbGVuYW1lLCAiIik7CisgICAgICAgICAgU3RyaW5nIHByb3BPdXRwdXRGaWxlID0gX2J1aWxkZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICB0aGlzLmdlbmVyYXRlSnNGaWxlKGNoYXJ0LCBzdHJCdWlsZGVyKTsKKyAgICAgICAgICBpbnQgX2xlbmd0aCA9IHN0ckJ1aWxkZXIubGVuZ3RoKCk7CisgICAgICAgICAgYm9vbGVhbiBfZ3JlYXRlclRoYW4gPSAoX2xlbmd0aCA+IDApOworICAgICAgICAgIGlmIChfZ3JlYXRlclRoYW4pIHsKKyAgICAgICAgICAgIGZzYS5nZW5lcmF0ZUZpbGUocHJvcE91dHB1dEZpbGUsIHN0ckJ1aWxkZXIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgZ2VuZXJhdGVKc0ZpbGUoZmluYWwgQ2hhcnQgY2hhcnQsIGZpbmFsIFN0cmluZ0J1aWxkZXIgc3RyQnVpbGRlcikgeworICAgIFN0cmluZyBfY3JlYXRlZnVsbHlRdWFsaWZpZWRDaGFydEZpbGVuYW1lID0gdGhpcy5fZDNKc0phdmFVdGlsLmNyZWF0ZWZ1bGx5UXVhbGlmaWVkQ2hhcnRGaWxlbmFtZShjaGFydCk7CisgICAgU3RyaW5nIGNoYXJ0RmlsZVBhdGggPSBfY3JlYXRlZnVsbHlRdWFsaWZpZWRDaGFydEZpbGVuYW1lLnJlcGxhY2VBbGwoIlxcLiIsICJfIik7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSkpIHsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgQ2hhcnRUcmVlIGNoYXJ0VHJlZSA9ICgoQ2hhcnRUcmVlKSBfY2hhcnR0eXBlXzEpOworICAgICAgYm9vbGVhbiBfaXNNYXAgPSBjaGFydFRyZWUuaXNNYXAoKTsKKyAgICAgIGlmIChfaXNNYXApIHsKKyAgICAgICAgdGhpcy5nZW5lcmF0ZVRyZWVNYXBKc0ZpbGUoc3RyQnVpbGRlciwgY2hhcnRGaWxlUGF0aCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBib29sZWFuIF9pc0NvbGxhcHNpYmxlID0gY2hhcnRUcmVlLmlzQ29sbGFwc2libGUoKTsKKyAgICAgICAgaWYgKF9pc0NvbGxhcHNpYmxlKSB7CisgICAgICAgICAgdGhpcy5nZW5lcmF0ZUNvbGxUcmVlSnNGaWxlKHN0ckJ1aWxkZXIsIGNoYXJ0RmlsZVBhdGgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIAorICBwdWJsaWMgdm9pZCBnZW5lcmF0ZVRyZWVNYXBKc0ZpbGUoZmluYWwgU3RyaW5nQnVpbGRlciBzdHJCdWlsZGVyLCBmaW5hbCBTdHJpbmcgY2hhcnRKYXZhRmlsZU5hbWUpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoY2hhcnRKYXZhRmlsZU5hbWUsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiA9IGZ1bmN0aW9uKCkgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBtYXJnaW4gPSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInRvcDogNDAsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInJpZ2h0OiAxMCwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiYm90dG9tOiAxMCwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibGVmdDogMTAiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9LCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ3aWR0aCA9IDk2MCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0LCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJoZWlnaHQgPSA1MDAgLSBtYXJnaW4udG9wIC0gbWFyZ2luLmJvdHRvbTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGNvbG9yID0gZDMuc2NhbGUuY2F0ZWdvcnkyMGMoKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZnVuY3Rpb24gcG9zaXRpb24oKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInRoaXMuc3R5bGUoXCJsZWZ0XCIsIGZ1bmN0aW9uIChkKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gZC54ICsgXCJweFwiOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwidG9wXCIsIGZ1bmN0aW9uIChkKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGQueSArIFwicHhcIjsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0ICAgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0pIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJ3aWR0aFwiLCBmdW5jdGlvbiAoZCkgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgICAgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBNYXRoLm1heCgwLCBkLmR4IC0gMSkgKyBcInB4XCI7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwiaGVpZ2h0XCIsIGZ1bmN0aW9uIChkKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgICAgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIE1hdGgubWF4KDAsIGQuZHkgLSAxKSArIFwicHhcIjsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0ICAgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGN4RDNUcmVlTWFwSnNIVE1MUm9vdENvbXBvbmVudCA9IHRoaXMuZ2V0RWxlbWVudCgpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBjeEQzVHJlZU1hcEpzQ29tcG9uZW50SHRtbFRhZ0lkID0gdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZDsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgY2hlY2tlZCA9IFwiXCI7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGNvbm5lY3RvciA9IHRoaXM7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGRhdGFDb2x1bW4gPSBcIlwiOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgcHJlVmFsdWVMYWJlbCA9IFwiXCI7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImZvciAodmFyIGk9MDtpIDwgdGhpcy5nZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0Lmxlbmd0aDtpKyspIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImlmIChpID09IDApeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjaGVja2VkID0gXCIgY2hlY2tlZFwiOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJwcmVWYWx1ZUxhYmVsID0gdGhpcy5nZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0WzBdOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSBlbHNlIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY2hlY2tlZCA9IFwiXCI7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkYXRhQ29sdW1uID0gZGF0YUNvbHVtbiArIFwiXFx0PGxhYmVsPjxpbnB1dCBpZD1cXFwiXCIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCtcIl9pbnB1dFxcXCIgdHlwZT1cXFwicmFkaW9cXFwiIG5hbWU9XFxcIm1vZGVcXFwiIHZhbHVlPVxcXCJcIisgdGhpcy5nZXRTdGF0ZSgpLmRhdGFDb2x1bW5MaXN0W2ldICsgXCJcXFwiXCIgKyBjaGVja2VkICsgXCI+IFwiKyB0aGlzLmdldFN0YXRlKCkuZGF0YUNvbHVtbkxpc3RbaV0gKyBcIjwvbGFiZWw+XFxuXCI7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciB0cmVlbWFwID0gZDMubGF5b3V0LnRyZWVtYXAoKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5zaXplKFt3aWR0aCwgaGVpZ2h0XSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3RpY2t5KHRydWUpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnZhbHVlKGZ1bmN0aW9uIChkKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJyZXR1cm4gZXZhbChcImQuXCIgKyBwcmVWYWx1ZUxhYmVsKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvL1x0XHRhbGVydChcImRhdGFDb2x1bW46IFwiICsgZGF0YUNvbHVtbik7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50LmlubmVySFRNTCA9IFx0XCI8Zm9ybT5cXG5cIiArIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkYXRhQ29sdW1uICsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiPC9mb3JtPlxcblwiICsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlwiPGRpdiBpZD1cXFwiXCIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCtcIl9kaXZcXFwiPlwiICsgXCI8L2Rpdj5cIjsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBjeEQzVHJlZU1hcEpzSFRNTFJvb3RDb21wb25lbnRTZWxlY3Rpb24gPSBkMy5zZWxlY3QoY3hEM1RyZWVNYXBKc0hUTUxSb290Q29tcG9uZW50KS5zZWxlY3QoXCIjXCIrdGhpcy5nZXRTdGF0ZSgpLmh0bWxUYWdJZCtcIl9kaXZcIik7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy9cdFx0XHRhbGVydChcInNlbGVjdGlvbjogXCIgKyBzZWxlY3Rpb24pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGN4RDNUcmVlTWFwSnNIVE1MUm9vdENvbXBvbmVudERpdiA9IGN4RDNUcmVlTWFwSnNIVE1MUm9vdENvbXBvbmVudFNlbGVjdGlvbi5hcHBlbmQoXCJkaXZcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0XHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5zdHlsZShcInBvc2l0aW9uXCIsIFwicmVsYXRpdmVcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJ3aWR0aFwiLCAod2lkdGggKyBtYXJnaW4ubGVmdCArIG1hcmdpbi5yaWdodCkgKyBcInB4XCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwiaGVpZ2h0XCIsIChoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkgKyBcInB4XCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdFx0XHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJsZWZ0XCIsIG1hcmdpbi5sZWZ0ICsgXCJweFwiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHRcdFx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwidG9wXCIsIG1hcmdpbi50b3AgKyBcInB4XCIpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgianNvblRyZWVNYXBGdW5jdGlvbiA9IGZ1bmN0aW9uKGpzb25PYmopIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIG5vZGUgPSBjeEQzVHJlZU1hcEpzSFRNTFJvb3RDb21wb25lbnREaXYuZGF0dW0oanNvbk9iaikuc2VsZWN0QWxsKFwiLm5vZGVcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmRhdGEodHJlZW1hcC5ub2RlcykiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmVudGVyKCkuYXBwZW5kKFwiZGl2XCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwiY2xhc3NcIiwgXCJub2RlXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwidGl0bGVcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/IFwiXCIgOiBkLnRvb2x0aXBOYW1lICsgXCJcXG5cIiArIHByZVZhbHVlTGFiZWwgKyBcIjogXCIgKyBldmFsKFwiZC5cIiArIHByZVZhbHVlTGFiZWwpOyB9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuY2FsbChwb3NpdGlvbikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuID8gY29sb3IoZC5uYW1lKSA6IG51bGw7IH0pIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy9cdFx0XHRcdFx0ICAgICAgLnN0eWxlKFwiYmFja2dyb3VuZFwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuID8gZDMucmdiKFwicmVkXCIpIDogbnVsbDsgfSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/IG51bGwgOiBkLm5hbWU7IH0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImQzLnNlbGVjdChjeEQzVHJlZU1hcEpzSFRNTFJvb3RDb21wb25lbnQpLnNlbGVjdEFsbChcIiNcIitjeEQzVHJlZU1hcEpzQ29tcG9uZW50SHRtbFRhZ0lkK1wiX2lucHV0XCIpLm9uKFwiY2hhbmdlXCIsIGZ1bmN0aW9uIGNoYW5nZSgpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgdmFsdWVMYWJlbCA9IHRoaXMudmFsdWU7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy9cdFx0XHRcdCAgICBhbGVydChcInZhbHVlT3V0OiBcIiArIHZhbHVlT3V0KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciB2YWx1ZSA9IHRoaXMudmFsdWUgPT09IFwiY291bnRcIiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0ICAgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIj8gZnVuY3Rpb24oKSB7IHJldHVybiAxOyB9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHQgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZXZhbChcImQuXCIgKyB2YWx1ZUxhYmVsKTsgfTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvL1x0XHRcdFx0ICAgICAgICA6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnNpemU7IH07Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdCAgIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIm5vZGUuZGF0YSh0cmVlbWFwLnZhbHVlKHZhbHVlKS5ub2RlcykiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0ICAgICAgXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwidGl0bGVcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiA/IFwiXCIgOiBkLnRvb2x0aXBOYW1lICsgXCJcXG5cIiArIHZhbHVlTGFiZWwgKyBcIjogXCIgKyBldmFsKFwiZC5cIiArIHZhbHVlTGFiZWwpOyB9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHQgICAgICBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnRyYW5zaXRpb24oKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdFx0XHQgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmR1cmF0aW9uKDE1MDApIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuY2FsbChwb3NpdGlvbik7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0XHRcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBqc29uU3RyaW5nID0gdGhpcy5nZXRTdGF0ZSgpLmpzb25EYXRhOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgianNvblRyZWVNYXBGdW5jdGlvbihKU09OLnBhcnNlKGpzb25TdHJpbmcpKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBzdHJCdWlsZGVyLmFwcGVuZChfYnVpbGRlcik7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGdlbmVyYXRlQ29sbFRyZWVKc0ZpbGUoZmluYWwgU3RyaW5nQnVpbGRlciBzdHJCdWlsZGVyLCBmaW5hbCBTdHJpbmcgY2hhcnRKYXZhRmlsZU5hbWUpIHsKKyAgICBTdHJpbmdDb25jYXRlbmF0aW9uIF9idWlsZGVyID0gbmV3IFN0cmluZ0NvbmNhdGVuYXRpb24oKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoY2hhcnRKYXZhRmlsZU5hbWUsICIiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiA9IGZ1bmN0aW9uKCkgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmVJZk5vdEVtcHR5KCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgbWFyZ2luID0ge3RvcDogMjAsIHJpZ2h0OiAxMjAsIGJvdHRvbTogMjAsIGxlZnQ6IDEyMH0sIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgid2lkdGggPSAxNDYwIC0gbWFyZ2luLnJpZ2h0IC0gbWFyZ2luLmxlZnQsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiaGVpZ2h0ID0gMTAwMCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIiAgICAiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGkgPSAwLCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZHVyYXRpb24gPSA3NTAsIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290OyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciB0cmVlID0gZDMubGF5b3V0LnRyZWUoKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnNpemUoW2hlaWdodCwgd2lkdGhdKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnByb2plY3Rpb24oZnVuY3Rpb24oZCkgeyByZXR1cm4gW2QueSwgZC54XTsgfSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudCA9IHRoaXMuZ2V0RWxlbWVudCgpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnQuaW5uZXJIVE1MID0gXHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIjxsYWJlbD48aW5wdXQgaWQ9XFxcIlwiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrXCJfaW5wdXRcXFwiIHR5cGU9XFxcInJhZGlvXFxcIiBuYW1lPVxcXCJtb2RlXFxcIiB2YWx1ZT1cXFwiZXhwYW5kXFxcIj5FeHBhbmQ8L2xhYmVsPlxcblwiICsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIjxsYWJlbD48aW5wdXQgaWQ9XFxcIlwiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrXCJfaW5wdXRcXFwiIHR5cGU9XFxcInJhZGlvXFxcIiBuYW1lPVxcXCJtb2RlXFxcIiB2YWx1ZT1cXFwiY29sbGFwc2VcXFwiIGNoZWNrZWQ+Q29sbGFwc2U8L2xhYmVsPlxcblwiICsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0XHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcIjxkaXYgaWQ9XFxcIlwiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrXCJfZGl2XFxcIj5cIiArIFwiPC9kaXY+XCI7XHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgY3hEM1RyZWVKc0hUTUxSb290Q29tcG9uZW50U2VsZWN0aW9uID0gZDMuc2VsZWN0KGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudCkuc2VsZWN0KFwiI1wiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrXCJfZGl2XCIpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnRTdmcgPSBjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnRTZWxlY3Rpb24uYXBwZW5kKFwic3ZnXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcIndpZHRoXCIsIHdpZHRoICsgbWFyZ2luLnJpZ2h0ICsgbWFyZ2luLmxlZnQpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcImhlaWdodFwiLCBoZWlnaHQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXBwZW5kKFwiZ1wiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgXCJ0cmFuc2xhdGUoXCIgKyBtYXJnaW4ubGVmdCArIFwiLFwiICsgbWFyZ2luLnRvcCArIFwiKVwiKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImZ1bmN0aW9uIGNvbGxhcHNlKGQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoZC5jaGlsZHJlbikgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5fY2hpbGRyZW4uZm9yRWFjaChjb2xsYXBzZSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkLmNoaWxkcmVuID0gbnVsbDsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJmdW5jdGlvbiBleHBhbmQoZCkgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImlmIChkLl9jaGlsZHJlbikgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5jaGlsZHJlbiA9IGQuX2NoaWxkcmVuOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5jaGlsZHJlbi5mb3JFYWNoKGV4cGFuZCk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdFx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkLl9jaGlsZHJlbiA9IG51bGw7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgianNvblRyZWVGdW5jdGlvbiA9IGZ1bmN0aW9uKGpzb25EYXRhKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdCA9IGpzb25EYXRhOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QueDAgPSBoZWlnaHQgLyAyOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QueTAgPSAwOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdFx0Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHRcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290LmNoaWxkcmVuLmZvckVhY2goY29sbGFwc2UpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidXBkYXRlKGN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0XHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJqc29uVHJlZUZ1bmN0aW9uKEpTT04ucGFyc2UodGhpcy5nZXRTdGF0ZSgpLmpzb25EYXRhKSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkMy5zZWxlY3QoY3hEM1RyZWVKc0hUTUxSb290Q29tcG9uZW50KS5zZWxlY3Qoc2VsZi5mcmFtZUVsZW1lbnQpLnN0eWxlKFwiaGVpZ2h0XCIsIFwiODAwcHhcIik7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZDMuc2VsZWN0KGN4RDNUcmVlSnNIVE1MUm9vdENvbXBvbmVudCkuc2VsZWN0QWxsKFwiI1wiK3RoaXMuZ2V0U3RhdGUoKS5odG1sVGFnSWQrXCJfaW5wdXRcIikub24oXCJjaGFuZ2VcIiwgZnVuY3Rpb24gY2hhbmdlKCkgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi8vXHRcdGFsZXJ0KFwidGhpcy52YWx1ZSA9IFwiICsgdGhpcy52YWx1ZSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAodGhpcy52YWx1ZSA9PT0gXCJleHBhbmRcIil7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QuY2hpbGRyZW4uZm9yRWFjaChleHBhbmQpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSBlbHNlIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICBcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiY3hEM1RyZWVKc0NvbXBvbmVudF9qc29uUm9vdC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInVwZGF0ZShjeEQzVHJlZUpzQ29tcG9uZW50X2pzb25Sb290KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJmdW5jdGlvbiB1cGRhdGUoc291cmNlKSB7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi8vIENvbXB1dGUgdGhlIG5ldyB0cmVlIGxheW91dC4iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgbm9kZXMgPSB0cmVlLm5vZGVzKGN4RDNUcmVlSnNDb21wb25lbnRfanNvblJvb3QpLnJldmVyc2UoKSwiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibGlua3MgPSB0cmVlLmxpbmtzKG5vZGVzKTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gTm9ybWFsaXplIGZvciBmaXhlZC1kZXB0aC4iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsgZC55ID0gZC5kZXB0aCAqIDE4MDsgfSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi8vIFVwZGF0ZSB0aGUgbm9kZXPigqzCpiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBub2RlID0gY3hEM1RyZWVKc0hUTUxSb290Q29tcG9uZW50U3ZnLnNlbGVjdEFsbChcImcubm9kZVwiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuZGF0YShub2RlcywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5pZCB8fCAoZC5pZCA9ICsraSk7IH0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBFbnRlciBhbnkgbmV3IG5vZGVzIGF0IHRoZSBwYXJlbnRcJ3MgcHJldmlvdXMgcG9zaXRpb24uIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIG5vZGVFbnRlciA9IG5vZGUuZW50ZXIoKS5hcHBlbmQoXCJnXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwiY2xhc3NcIiwgXCJub2RlXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwidHJhbnNmb3JtXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIFwidHJhbnNsYXRlKFwiICsgc291cmNlLnkwICsgXCIsXCIgKyBzb3VyY2UueDAgKyBcIilcIjsgfSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLm9uKFwiY2xpY2tcIiwgY2xpY2spOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlRW50ZXIuYXBwZW5kKFwiY2lyY2xlXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5hdHRyKFwiclwiLCAxZS02KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuX2NoaWxkcmVuID8gXCJsaWdodHN0ZWVsYmx1ZVwiIDogXCIjZmZmXCI7IH0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlRW50ZXIuYXBwZW5kKFwidGV4dFwiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcInhcIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5jaGlsZHJlbiB8fCBkLl9jaGlsZHJlbiA/IC0xMCA6IDEwOyB9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcImR5XCIsIFwiLjM1ZW1cIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJ0ZXh0LWFuY2hvclwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuIHx8IGQuX2NoaWxkcmVuID8gXCJlbmRcIiA6IFwic3RhcnRcIjsgfSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5uYW1lOyB9KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJmaWxsLW9wYWNpdHlcIiwgMWUtNik7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi8vIFRyYW5zaXRpb24gbm9kZXMgdG8gdGhlaXIgbmV3IHBvc2l0aW9uLiIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInZhciBub2RlVXBkYXRlID0gbm9kZS50cmFuc2l0aW9uKCkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmR1cmF0aW9uKGR1cmF0aW9uKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcInRyYW5zZm9ybVwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBcInRyYW5zbGF0ZShcIiArIGQueSArIFwiLFwiICsgZC54ICsgXCIpXCI7IH0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlVXBkYXRlLnNlbGVjdChcImNpcmNsZVwiKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcInJcIiwgNC41KSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuc3R5bGUoXCJmaWxsXCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuX2NoaWxkcmVuID8gXCJsaWdodHN0ZWVsYmx1ZVwiIDogXCIjZmZmXCI7IH0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlVXBkYXRlLnNlbGVjdChcInRleHRcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnN0eWxlKFwiZmlsbC1vcGFjaXR5XCIsIDEpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBUcmFuc2l0aW9uIGV4aXRpbmcgbm9kZXMgdG8gdGhlIHBhcmVudFwncyBuZXcgcG9zaXRpb24uIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIG5vZGVFeGl0ID0gbm9kZS5leGl0KCkudHJhbnNpdGlvbigpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5kdXJhdGlvbihkdXJhdGlvbikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJ0cmFuc2Zvcm1cIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gXCJ0cmFuc2xhdGUoXCIgKyBzb3VyY2UueSArIFwiLFwiICsgc291cmNlLnggKyBcIilcIjsgfSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnJlbW92ZSgpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlRXhpdC5zZWxlY3QoXCJjaXJjbGVcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJyXCIsIDFlLTYpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2RlRXhpdC5zZWxlY3QoXCJ0ZXh0XCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5zdHlsZShcImZpbGwtb3BhY2l0eVwiLCAxZS02KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gVXBkYXRlIHRoZSBsaW5rc+KCrMKmIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidmFyIGxpbmsgPSBjeEQzVHJlZUpzSFRNTFJvb3RDb21wb25lbnRTdmcuc2VsZWN0QWxsKFwicGF0aC5saW5rXCIpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5kYXRhKGxpbmtzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnRhcmdldC5pZDsgfSk7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi8vIEVudGVyIGFueSBuZXcgbGlua3MgYXQgdGhlIHBhcmVudFwncyBwcmV2aW91cyBwb3NpdGlvbi4iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJsaW5rLmVudGVyKCkuaW5zZXJ0KFwicGF0aFwiLCBcImdcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJjbGFzc1wiLCBcImxpbmtcIikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJkXCIsIGZ1bmN0aW9uKGQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgbyA9IHt4OiBzb3VyY2UueDAsIHk6IHNvdXJjZS55MH07Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgicmV0dXJuIGRpYWdvbmFsKHtzb3VyY2U6IG8sIHRhcmdldDogb30pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLy8gVHJhbnNpdGlvbiBsaW5rcyB0byB0aGVpciBuZXcgcG9zaXRpb24uIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibGluay50cmFuc2l0aW9uKCkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmR1cmF0aW9uKGR1cmF0aW9uKSIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIuYXR0cihcImRcIiwgZGlhZ29uYWwpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBUcmFuc2l0aW9uIGV4aXRpbmcgbm9kZXMgdG8gdGhlIHBhcmVudFwncyBuZXcgcG9zaXRpb24uIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgibGluay5leGl0KCkudHJhbnNpdGlvbigpIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIi5kdXJhdGlvbihkdXJhdGlvbikiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLmF0dHIoXCJkXCIsIGZ1bmN0aW9uKGQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ2YXIgbyA9IHt4OiBzb3VyY2UueCwgeTogc291cmNlLnl9OyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoInJldHVybiBkaWFnb25hbCh7c291cmNlOiBvLCB0YXJnZXQ6IG99KTsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSkiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiLnJlbW92ZSgpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBTdGFzaCB0aGUgb2xkIHBvc2l0aW9ucyBmb3IgdHJhbnNpdGlvbi4iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImQueDAgPSBkLng7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJkLnkwID0gZC55OyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0pOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCIvLyBUb2dnbGUgY2hpbGRyZW4gb24gY2xpY2suIik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImZ1bmN0aW9uIGNsaWNrKGQpIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJpZiAoZC5jaGlsZHJlbikgeyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0ICAgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgiZC5jaGlsZHJlbiA9IG51bGw7Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgifSBlbHNlIHsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImQuY2hpbGRyZW4gPSBkLl9jaGlsZHJlbjsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgICAiKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoImQuX2NoaWxkcmVuID0gbnVsbDsiKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJcdCAgIik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLmFwcGVuZCgiXHQgICIpOworICAgIF9idWlsZGVyLmFwcGVuZCgidXBkYXRlKGQpOyIpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIlx0Iik7CisgICAgX2J1aWxkZXIuYXBwZW5kKCJ9Iik7CisgICAgX2J1aWxkZXIubmV3TGluZSgpOworICAgIF9idWlsZGVyLm5ld0xpbmUoKTsKKyAgICBfYnVpbGRlci5hcHBlbmQoIn0iKTsKKyAgICBfYnVpbGRlci5uZXdMaW5lKCk7CisgICAgc3RyQnVpbGRlci5hcHBlbmQoX2J1aWxkZXIpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBpbnRlcm5hbERvR2VuZXJhdGUoZmluYWwgRU9iamVjdCBjaGFydE1vZGVsLCBmaW5hbCBJRmlsZVN5c3RlbUFjY2VzcyBmc2EpIHsKKyAgICBpZiAoY2hhcnRNb2RlbCBpbnN0YW5jZW9mIEp2bURlY2xhcmVkVHlwZSkgeworICAgICAgX2ludGVybmFsRG9HZW5lcmF0ZSgoSnZtRGVjbGFyZWRUeXBlKWNoYXJ0TW9kZWwsIGZzYSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChjaGFydE1vZGVsIGluc3RhbmNlb2YgQ2hhcnRNb2RlbCkgeworICAgICAgX2ludGVybmFsRG9HZW5lcmF0ZSgoQ2hhcnRNb2RlbCljaGFydE1vZGVsLCBmc2EpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoY2hhcnRNb2RlbCAhPSBudWxsKSB7CisgICAgICBfaW50ZXJuYWxEb0dlbmVyYXRlKGNoYXJ0TW9kZWwsIGZzYSk7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBwYXJhbWV0ZXIgdHlwZXM6ICIgKworICAgICAgICBBcnJheXMuPE9iamVjdD5hc0xpc3QoY2hhcnRNb2RlbCwgZnNhKS50b1N0cmluZygpKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvanZtbW9kZWwvRDNKc0phdmFVdGlsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0QzSnNKYXZhVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTg2NWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0L3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2NoYXJ0L2p2bW1vZGVsL0QzSnNKYXZhVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTI5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0Lmp2bW1vZGVsOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuQ2hhcnRPcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydFRyZWU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgRDNKc0phdmFVdGlsIHsKKyAgQEluamVjdAorICBARXh0ZW5zaW9uCisgIHByaXZhdGUgSVF1YWxpZmllZE5hbWVQcm92aWRlciBfaVF1YWxpZmllZE5hbWVQcm92aWRlcjsKKyAgCisgIHB1YmxpYyBDaGFydFRyZWUgZ2V0Q2hhcnRUcmVlTWFwKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSkpIHsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgcmV0dXJuICgoQ2hhcnRUcmVlKSBfY2hhcnR0eXBlXzEpOworICAgIH0KKyAgICByZXR1cm4gbnVsbDsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBjcmVhdGVGaWxlbmFtZVBvc3RGaXgoZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgaWYgKChfY2hhcnR0eXBlIGluc3RhbmNlb2YgQ2hhcnRUcmVlKSkgeworICAgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZV8xID0gY2hhcnQuZ2V0Q2hhcnR0eXBlKCk7CisgICAgICBmaW5hbCBDaGFydFRyZWUgY2hhcnRUcmVlID0gKChDaGFydFRyZWUpIF9jaGFydHR5cGVfMSk7CisgICAgICBib29sZWFuIF9pc01hcCA9IGNoYXJ0VHJlZS5pc01hcCgpOworICAgICAgaWYgKF9pc01hcCkgeworICAgICAgICByZXR1cm4gIlRyZWVNYXAiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbGVhbiBfaXNDb2xsYXBzaWJsZSA9IGNoYXJ0VHJlZS5pc0NvbGxhcHNpYmxlKCk7CisgICAgICAgIGlmIChfaXNDb2xsYXBzaWJsZSkgeworICAgICAgICAgIHJldHVybiAiQ29sbGFwc2libGVUcmVlIjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzVHJlZU1hcChmaW5hbCBDaGFydCBjaGFydCkgeworICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGUgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICBpZiAoKF9jaGFydHR5cGUgaW5zdGFuY2VvZiBDaGFydFRyZWUpKSB7CisgICAgICBDaGFydE9wdGlvbiBfY2hhcnR0eXBlXzEgPSBjaGFydC5nZXRDaGFydHR5cGUoKTsKKyAgICAgIGZpbmFsIENoYXJ0VHJlZSBjaGFydFRyZWUgPSAoKENoYXJ0VHJlZSkgX2NoYXJ0dHlwZV8xKTsKKyAgICAgIGJvb2xlYW4gX2lzTWFwID0gY2hhcnRUcmVlLmlzTWFwKCk7CisgICAgICBpZiAoX2lzTWFwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzQ29sbGFwc2libGVUcmVlKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgQ2hhcnRPcHRpb24gX2NoYXJ0dHlwZSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgIGlmICgoX2NoYXJ0dHlwZSBpbnN0YW5jZW9mIENoYXJ0VHJlZSkpIHsKKyAgICAgIENoYXJ0T3B0aW9uIF9jaGFydHR5cGVfMSA9IGNoYXJ0LmdldENoYXJ0dHlwZSgpOworICAgICAgZmluYWwgQ2hhcnRUcmVlIGNoYXJ0VHJlZSA9ICgoQ2hhcnRUcmVlKSBfY2hhcnR0eXBlXzEpOworICAgICAgYm9vbGVhbiBfaXNDb2xsYXBzaWJsZSA9IGNoYXJ0VHJlZS5pc0NvbGxhcHNpYmxlKCk7CisgICAgICBpZiAoX2lzQ29sbGFwc2libGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlZnVsbHlRdWFsaWZpZWRGaWxlbmFtZShmaW5hbCBDaGFydCBjaGFydCkgeworICAgIEVPYmplY3QgX2VDb250YWluZXIgPSBjaGFydC5lQ29udGFpbmVyKCk7CisgICAgQ2hhcnRQYWNrYWdlIHBja2cgPSAoKENoYXJ0UGFja2FnZSkgX2VDb250YWluZXIpOworICAgIFN0cmluZyBfbmFtZSA9IHBja2cuZ2V0TmFtZSgpOworICAgIFN0cmluZyBfc3RyaW5nID0gX25hbWUudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgX2NvbmNhdCA9IF9zdHJpbmcuY29uY2F0KCIuIik7CisgICAgU3RyaW5nIF9uYW1lXzEgPSBjaGFydC5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9zdHJpbmdfMSA9IF9uYW1lXzEudG9TdHJpbmcoKTsKKyAgICBTdHJpbmcgX2NvbmNhdF8xID0gX2NvbmNhdC5jb25jYXQoX3N0cmluZ18xKTsKKyAgICBTdHJpbmcgX2NyZWF0ZUZpbGVuYW1lUG9zdEZpeCA9IHRoaXMuY3JlYXRlRmlsZW5hbWVQb3N0Rml4KGNoYXJ0KTsKKyAgICByZXR1cm4gX2NvbmNhdF8xLmNvbmNhdChfY3JlYXRlRmlsZW5hbWVQb3N0Rml4KTsKKyAgfQorICAKKyAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlRmlsZW5hbWUoZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBTdHJpbmcgX25hbWUgPSBjaGFydC5nZXROYW1lKCk7CisgICAgU3RyaW5nIF9zdHJpbmcgPSBfbmFtZS50b1N0cmluZygpOworICAgIFN0cmluZyBfY3JlYXRlRmlsZW5hbWVQb3N0Rml4ID0gdGhpcy5jcmVhdGVGaWxlbmFtZVBvc3RGaXgoY2hhcnQpOworICAgIHJldHVybiBfc3RyaW5nLmNvbmNhdChfY3JlYXRlRmlsZW5hbWVQb3N0Rml4KTsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBjcmVhdGVDaGFydEZpbGVuYW1lKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nIF9jcmVhdGVGaWxlbmFtZSA9IHRoaXMuY3JlYXRlRmlsZW5hbWUoY2hhcnQpOworICAgIHJldHVybiBfY3JlYXRlRmlsZW5hbWUuY29uY2F0KCJKc0NoYXJ0Iik7CisgIH0KKyAgCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlZnVsbHlRdWFsaWZpZWRDaGFydEZpbGVuYW1lKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nIF9jcmVhdGVmdWxseVF1YWxpZmllZEZpbGVuYW1lID0gdGhpcy5jcmVhdGVmdWxseVF1YWxpZmllZEZpbGVuYW1lKGNoYXJ0KTsKKyAgICByZXR1cm4gX2NyZWF0ZWZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUuY29uY2F0KCJKc0NoYXJ0Iik7CisgIH0KKyAgCisgIHB1YmxpYyBTdHJpbmcgY3JlYXRlQ2hhcnRKc0ZpbGVuYW1lKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nIF9jcmVhdGVGaWxlbmFtZSA9IHRoaXMuY3JlYXRlRmlsZW5hbWUoY2hhcnQpOworICAgIHJldHVybiBfY3JlYXRlRmlsZW5hbWUuY29uY2F0KCIuanMiKTsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBjcmVhdGVmdWxseVF1YWxpZmllZFN0YXRlRmlsZW5hbWUoZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBTdHJpbmcgX2NyZWF0ZWZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUgPSB0aGlzLmNyZWF0ZWZ1bGx5UXVhbGlmaWVkRmlsZW5hbWUoY2hhcnQpOworICAgIHJldHVybiBfY3JlYXRlZnVsbHlRdWFsaWZpZWRGaWxlbmFtZS5jb25jYXQoIkpzU3RhdGUiKTsKKyAgfQorICAKKyAgcHVibGljIFN0cmluZyBjcmVhdGVTdGF0ZUZpbGVuYW1lKGZpbmFsIENoYXJ0IGNoYXJ0KSB7CisgICAgU3RyaW5nIF9jcmVhdGVGaWxlbmFtZSA9IHRoaXMuY3JlYXRlRmlsZW5hbWUoY2hhcnQpOworICAgIHJldHVybiBfY3JlYXRlRmlsZW5hbWUuY29uY2F0KCJKc1N0YXRlIik7CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2NvcGluZy9DaGFydFNjb3BlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvc2NvcGluZy9DaGFydFNjb3BlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZThjYTQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC9zY29waW5nL0NoYXJ0U2NvcGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjI4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnNjb3Bpbmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RGF0YW1hcnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5BeGlzRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0QXhpczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0Q3ViZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0Q3ViZUVsZW1lbnQ7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydERlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0TWVtYmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnROYXZpZ2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuZGF0YW1hcnRkc2wuRGF0YW1hcnRPd25lcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0UHJvcGVydHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5kYXRhbWFydGRzbC5EYXRhbWFydFNvdXJjZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLkRhdGFtYXJ0VGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmRhdGFtYXJ0ZHNsLmp2bW1vZGVsLkRhdGFtYXJ0RFNMSnZtTW9kZWxJbmZlcnJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5FT2JqZWN0RGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUVPYmplY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLmltcGwuTWFwQmFzZWRTY29wZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db2xsZWN0aW9uTGl0ZXJhbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkV4dGVuc2lvbjsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQ2hhcnRTY29wZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNCYXRjaFNjb3BlUHJvdmlkZXIgeworICBASW5qZWN0CisgIEBFeHRlbnNpb24KKyAgcHJpdmF0ZSBEYXRhbWFydERTTEp2bU1vZGVsSW5mZXJyZXIgZGF0YW1hcnRJbmZlcnJlcjsKKyAgCisgIEBPdmVycmlkZQorICBwdWJsaWMgSVNjb3BlIGdldFNjb3BlKGZpbmFsIEVPYmplY3QgY29udGV4dCwgZmluYWwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKHJlZmVyZW5jZSwgQ2hhcnREU0xQYWNrYWdlLkxpdGVyYWxzLkNIQVJUX0FYSVNfX0FYSVMpOworICAgIGlmIChfZXF1YWxzKSB7CisgICAgICByZXR1cm4gdGhpcy5nZXRTY29wZV9DaGFydF9BeGlzX2F4aXMoY29udGV4dCk7CisgICAgfQorICAgIHJldHVybiBzdXBlci5nZXRTY29wZShjb250ZXh0LCByZWZlcmVuY2UpOworICB9CisgIAorICBwdWJsaWMgSVNjb3BlIGdldFNjb3BlX0NoYXJ0X0F4aXNfYXhpcyhmaW5hbCBFT2JqZWN0IG9iamVjdCkgeworICAgIEFycmF5TGlzdDxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQgPSBDb2xsZWN0aW9uTGl0ZXJhbHMuPElFT2JqZWN0RGVzY3JpcHRpb24+bmV3QXJyYXlMaXN0KCk7CisgICAgRU9iamVjdCBlT2JqID0gb2JqZWN0OworICAgIHdoaWxlICgoIShlT2JqIGluc3RhbmNlb2YgQ2hhcnREYXRhbWFydCkpKSB7CisgICAgICBFT2JqZWN0IF9lQ29udGFpbmVyID0gZU9iai5lQ29udGFpbmVyKCk7CisgICAgICBlT2JqID0gX2VDb250YWluZXI7CisgICAgfQorICAgIGJvb2xlYW4gX25vdEVxdWFscyA9ICghT2JqZWN0cy5lcXVhbChlT2JqLCBudWxsKSk7CisgICAgaWYgKF9ub3RFcXVhbHMpIHsKKyAgICAgIERhdGFtYXJ0RGVmaW5pdGlvbiBkYXRhbWFydCA9ICgoQ2hhcnREYXRhbWFydCkgZU9iaikuZ2V0RGF0YW1hcnRSZWYoKTsKKyAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzXzEgPSAoIU9iamVjdHMuZXF1YWwoZGF0YW1hcnQsIG51bGwpKTsKKyAgICAgIGlmICghX25vdEVxdWFsc18xKSB7CisgICAgICAgIF9hbmQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERhdGFtYXJ0U291cmNlIF9zb3VyY2UgPSBkYXRhbWFydC5nZXRTb3VyY2UoKTsKKyAgICAgICAgYm9vbGVhbiBfbm90RXF1YWxzXzIgPSAoIU9iamVjdHMuZXF1YWwoX3NvdXJjZSwgbnVsbCkpOworICAgICAgICBfYW5kID0gX25vdEVxdWFsc18yOworICAgICAgfQorICAgICAgaWYgKF9hbmQpIHsKKyAgICAgICAgRGF0YW1hcnRTb3VyY2UgX3NvdXJjZV8xID0gZGF0YW1hcnQuZ2V0U291cmNlKCk7CisgICAgICAgIGlmICgoX3NvdXJjZV8xIGluc3RhbmNlb2YgRGF0YW1hcnRDdWJlKSkgeworICAgICAgICAgIERhdGFtYXJ0U291cmNlIF9zb3VyY2VfMiA9IGRhdGFtYXJ0LmdldFNvdXJjZSgpOworICAgICAgICAgIEVMaXN0PERhdGFtYXJ0Q3ViZUVsZW1lbnQ+IF9heGlzc2xpY2VyID0gKChEYXRhbWFydEN1YmUpIF9zb3VyY2VfMikuZ2V0QXhpc3NsaWNlcigpOworICAgICAgICAgIGZvciAoZmluYWwgRGF0YW1hcnRDdWJlRWxlbWVudCBheGlzIDogX2F4aXNzbGljZXIpIHsKKyAgICAgICAgICAgIGlmICgoYXhpcyBpbnN0YW5jZW9mIERhdGFtYXJ0QXhpcykpIHsKKyAgICAgICAgICAgICAgQXhpc0VudW0gX25hbWUgPSAoKERhdGFtYXJ0QXhpcykgYXhpcykuZ2V0TmFtZSgpOworICAgICAgICAgICAgICBTdHJpbmcgbGl0ZXJhbCA9IF9uYW1lLmdldExpdGVyYWwoKTsKKyAgICAgICAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlID0gRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShsaXRlcmFsLCAoKERhdGFtYXJ0QXhpcykgYXhpcykpOworICAgICAgICAgICAgICByZXN1bHQuYWRkKF9jcmVhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzMgPSBkYXRhbWFydC5nZXRTb3VyY2UoKTsKKyAgICAgICAgICBpZiAoKF9zb3VyY2VfMyBpbnN0YW5jZW9mIERhdGFtYXJ0RW50aXR5KSkgeworICAgICAgICAgICAgRGF0YW1hcnRTb3VyY2UgX3NvdXJjZV80ID0gZGF0YW1hcnQuZ2V0U291cmNlKCk7CisgICAgICAgICAgICB0aGlzLmdldEVudGl0eUF4ZXMoKChEYXRhbWFydEVudGl0eSkgX3NvdXJjZV80KSwgcmVzdWx0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRGF0YW1hcnRTb3VyY2UgX3NvdXJjZV81ID0gZGF0YW1hcnQuZ2V0U291cmNlKCk7CisgICAgICAgICAgICBpZiAoKF9zb3VyY2VfNSBpbnN0YW5jZW9mIERhdGFtYXJ0VGFzaykpIHsKKyAgICAgICAgICAgICAgU3RyaW5nIF9saXRlcmFsID0gQXhpc0VudW0uQ09MVU1OUy5nZXRMaXRlcmFsKCk7CisgICAgICAgICAgICAgIERhdGFtYXJ0U291cmNlIF9zb3VyY2VfNiA9IGRhdGFtYXJ0LmdldFNvdXJjZSgpOworICAgICAgICAgICAgICBJRU9iamVjdERlc2NyaXB0aW9uIF9jcmVhdGVfMSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX2xpdGVyYWwsICgoRGF0YW1hcnRUYXNrKSBfc291cmNlXzYpKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmFkZChfY3JlYXRlXzEpOworICAgICAgICAgICAgICBTdHJpbmcgX2xpdGVyYWxfMSA9IEF4aXNFbnVtLlJPV1MuZ2V0TGl0ZXJhbCgpOworICAgICAgICAgICAgICBEYXRhbWFydFNvdXJjZSBfc291cmNlXzcgPSBkYXRhbWFydC5nZXRTb3VyY2UoKTsKKyAgICAgICAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlXzIgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9saXRlcmFsXzEsICgoRGF0YW1hcnRUYXNrKSBfc291cmNlXzcpKTsKKyAgICAgICAgICAgICAgcmVzdWx0LmFkZChfY3JlYXRlXzIpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTWFwQmFzZWRTY29wZS5jcmVhdGVTY29wZShJU2NvcGUuTlVMTFNDT1BFLCByZXN1bHQpOworICB9CisgIAorICBwdWJsaWMgdm9pZCBnZXRFbnRpdHlBeGVzKGZpbmFsIERhdGFtYXJ0RW50aXR5IGVudGl0eSwgZmluYWwgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCkgeworICAgIEVMaXN0PERhdGFtYXJ0TmF2aWdhdGlvbj4gX25hdmlnYXRpb25zID0gZW50aXR5LmdldE5hdmlnYXRpb25zKCk7CisgICAgZm9yIChmaW5hbCBEYXRhbWFydE5hdmlnYXRpb24gbmF2aWdhdGlvbiA6IF9uYXZpZ2F0aW9ucykgeworICAgICAgeworICAgICAgICBpZiAoKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE1lbWJlcikpIHsKKyAgICAgICAgICBEYXRhbWFydEVudGl0eSBfZGF0YW1hcnRFbnRpdHkgPSAoKERhdGFtYXJ0TWVtYmVyKSBuYXZpZ2F0aW9uKS5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgICAgIHRoaXMuZ2V0RW50aXR5QXhlcyhfZGF0YW1hcnRFbnRpdHksIHJlc3VsdCk7CisgICAgICAgICAgRGF0YW1hcnRFbnRpdHkgX2RhdGFtYXJ0RW50aXR5XzEgPSAoKERhdGFtYXJ0TWVtYmVyKSBuYXZpZ2F0aW9uKS5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgICAgIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IF9wcm9wZXJ0aWVzID0gX2RhdGFtYXJ0RW50aXR5XzEuZ2V0UHJvcGVydGllcygpOworICAgICAgICAgIGZvciAoZmluYWwgRGF0YW1hcnRQcm9wZXJ0eSBwcm9wZXJ0eSA6IF9wcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBBeGlzRW51bSBfYXhpcyA9IHByb3BlcnR5LmdldEF4aXMoKTsKKyAgICAgICAgICAgIFN0cmluZyBfbGl0ZXJhbCA9IF9heGlzLmdldExpdGVyYWwoKTsKKyAgICAgICAgICAgIElFT2JqZWN0RGVzY3JpcHRpb24gX2NyZWF0ZSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX2xpdGVyYWwsIHByb3BlcnR5KTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoX2NyZWF0ZSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgobmF2aWdhdGlvbiBpbnN0YW5jZW9mIERhdGFtYXJ0T3duZXIpKSB7CisgICAgICAgICAgRGF0YW1hcnRFbnRpdHkgX2RhdGFtYXJ0RW50aXR5XzIgPSAoKERhdGFtYXJ0T3duZXIpIG5hdmlnYXRpb24pLmdldERhdGFtYXJ0RW50aXR5KCk7CisgICAgICAgICAgdGhpcy5nZXRFbnRpdHlBeGVzKF9kYXRhbWFydEVudGl0eV8yLCByZXN1bHQpOworICAgICAgICAgIERhdGFtYXJ0RW50aXR5IF9kYXRhbWFydEVudGl0eV8zID0gKChEYXRhbWFydE93bmVyKSBuYXZpZ2F0aW9uKS5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgICAgIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IF9wcm9wZXJ0aWVzXzEgPSBfZGF0YW1hcnRFbnRpdHlfMy5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgZm9yIChmaW5hbCBEYXRhbWFydFByb3BlcnR5IHByb3BlcnR5XzEgOiBfcHJvcGVydGllc18xKSB7CisgICAgICAgICAgICBBeGlzRW51bSBfYXhpc18xID0gcHJvcGVydHlfMS5nZXRBeGlzKCk7CisgICAgICAgICAgICBTdHJpbmcgX2xpdGVyYWxfMSA9IF9heGlzXzEuZ2V0TGl0ZXJhbCgpOworICAgICAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlXzEgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9saXRlcmFsXzEsIHByb3BlcnR5XzEpOworICAgICAgICAgICAgcmVzdWx0LmFkZChfY3JlYXRlXzEpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBFTGlzdDxEYXRhbWFydFByb3BlcnR5PiBfcHJvcGVydGllcyA9IGVudGl0eS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgZm9yIChmaW5hbCBEYXRhbWFydFByb3BlcnR5IHByb3BlcnR5IDogX3Byb3BlcnRpZXMpIHsKKyAgICAgIEF4aXNFbnVtIF9heGlzID0gcHJvcGVydHkuZ2V0QXhpcygpOworICAgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKF9heGlzLCBudWxsKSk7CisgICAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgICBBeGlzRW51bSBfYXhpc18xID0gcHJvcGVydHkuZ2V0QXhpcygpOworICAgICAgICBTdHJpbmcgX2xpdGVyYWwgPSBfYXhpc18xLmdldExpdGVyYWwoKTsKKyAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlID0gRU9iamVjdERlc2NyaXB0aW9uLmNyZWF0ZShfbGl0ZXJhbCwgcHJvcGVydHkpOworICAgICAgICByZXN1bHQuYWRkKF9jcmVhdGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQXhpc0VudW0gX2F4aXNfMiA9IHByb3BlcnR5LmdldEF4aXMoKTsKKyAgICAgICAgU3RyaW5nIF9saXRlcmFsXzEgPSBfYXhpc18yLmdldExpdGVyYWwoKTsKKyAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlXzEgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9saXRlcmFsXzEsIHByb3BlcnR5KTsKKyAgICAgICAgcmVzdWx0LmFkZChfY3JlYXRlXzEpOworICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgZ2V0RW50aXR5UHJvcGVydGllcyhmaW5hbCBEYXRhbWFydEVudGl0eSBlbnRpdHksIGZpbmFsIEFycmF5TGlzdDxJRU9iamVjdERlc2NyaXB0aW9uPiByZXN1bHQsIGZpbmFsIFN0cmluZyByZXF1ZXN0ZWRBeGlzTmFtZSkgeworICAgIEVMaXN0PERhdGFtYXJ0TmF2aWdhdGlvbj4gX25hdmlnYXRpb25zID0gZW50aXR5LmdldE5hdmlnYXRpb25zKCk7CisgICAgZm9yIChmaW5hbCBEYXRhbWFydE5hdmlnYXRpb24gbmF2aWdhdGlvbiA6IF9uYXZpZ2F0aW9ucykgeworICAgICAgeworICAgICAgICBpZiAoKG5hdmlnYXRpb24gaW5zdGFuY2VvZiBEYXRhbWFydE1lbWJlcikpIHsKKyAgICAgICAgICBEYXRhbWFydEVudGl0eSBfZGF0YW1hcnRFbnRpdHkgPSAoKERhdGFtYXJ0TWVtYmVyKSBuYXZpZ2F0aW9uKS5nZXREYXRhbWFydEVudGl0eSgpOworICAgICAgICAgIHRoaXMuZ2V0RW50aXR5UHJvcGVydGllcyhfZGF0YW1hcnRFbnRpdHksIHJlc3VsdCwgcmVxdWVzdGVkQXhpc05hbWUpOworICAgICAgICAgIERhdGFtYXJ0RW50aXR5IF9kYXRhbWFydEVudGl0eV8xID0gKChEYXRhbWFydE1lbWJlcikgbmF2aWdhdGlvbikuZ2V0RGF0YW1hcnRFbnRpdHkoKTsKKyAgICAgICAgICBFTGlzdDxEYXRhbWFydFByb3BlcnR5PiBfcHJvcGVydGllcyA9IF9kYXRhbWFydEVudGl0eV8xLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICBmb3IgKGZpbmFsIERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkgOiBfcHJvcGVydGllcykgeworICAgICAgICAgICAgQXhpc0VudW0gX2F4aXMgPSBwcm9wZXJ0eS5nZXRBeGlzKCk7CisgICAgICAgICAgICBTdHJpbmcgX2xpdGVyYWwgPSBfYXhpcy5nZXRMaXRlcmFsKCk7CisgICAgICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbGl0ZXJhbC5lcXVhbHMocmVxdWVzdGVkQXhpc05hbWUpOworICAgICAgICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgICAgICAgU3RyaW5nIF9wcm9wZXJ0eU5hbWUgPSB0aGlzLmRhdGFtYXJ0SW5mZXJyZXIuZ2V0UHJvcGVydHlOYW1lKHByb3BlcnR5LCBudWxsKTsKKyAgICAgICAgICAgICAgTEVudGl0eUF0dHJpYnV0ZSBfcHJvcGVydHlSZWYgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVJlZigpOworICAgICAgICAgICAgICBJRU9iamVjdERlc2NyaXB0aW9uIF9jcmVhdGUgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9wcm9wZXJ0eU5hbWUsIF9wcm9wZXJ0eVJlZik7CisgICAgICAgICAgICAgIHJlc3VsdC5hZGQoX2NyZWF0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICgobmF2aWdhdGlvbiBpbnN0YW5jZW9mIERhdGFtYXJ0T3duZXIpKSB7CisgICAgICAgICAgRGF0YW1hcnRFbnRpdHkgX2RhdGFtYXJ0RW50aXR5XzIgPSAoKERhdGFtYXJ0T3duZXIpIG5hdmlnYXRpb24pLmdldERhdGFtYXJ0RW50aXR5KCk7CisgICAgICAgICAgdGhpcy5nZXRFbnRpdHlQcm9wZXJ0aWVzKF9kYXRhbWFydEVudGl0eV8yLCByZXN1bHQsIHJlcXVlc3RlZEF4aXNOYW1lKTsKKyAgICAgICAgICBEYXRhbWFydEVudGl0eSBfZGF0YW1hcnRFbnRpdHlfMyA9ICgoRGF0YW1hcnRPd25lcikgbmF2aWdhdGlvbikuZ2V0RGF0YW1hcnRFbnRpdHkoKTsKKyAgICAgICAgICBFTGlzdDxEYXRhbWFydFByb3BlcnR5PiBfcHJvcGVydGllc18xID0gX2RhdGFtYXJ0RW50aXR5XzMuZ2V0UHJvcGVydGllcygpOworICAgICAgICAgIGZvciAoZmluYWwgRGF0YW1hcnRQcm9wZXJ0eSBwcm9wZXJ0eV8xIDogX3Byb3BlcnRpZXNfMSkgeworICAgICAgICAgICAgQXhpc0VudW0gX2F4aXNfMSA9IHByb3BlcnR5XzEuZ2V0QXhpcygpOworICAgICAgICAgICAgU3RyaW5nIF9saXRlcmFsXzEgPSBfYXhpc18xLmdldExpdGVyYWwoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gX2VxdWFsc18xID0gX2xpdGVyYWxfMS5lcXVhbHMocmVxdWVzdGVkQXhpc05hbWUpOworICAgICAgICAgICAgaWYgKF9lcXVhbHNfMSkgeworICAgICAgICAgICAgICBTdHJpbmcgX3Byb3BlcnR5TmFtZV8xID0gdGhpcy5kYXRhbWFydEluZmVycmVyLmdldFByb3BlcnR5TmFtZShwcm9wZXJ0eV8xLCBudWxsKTsKKyAgICAgICAgICAgICAgTEVudGl0eUF0dHJpYnV0ZSBfcHJvcGVydHlSZWZfMSA9IHByb3BlcnR5XzEuZ2V0UHJvcGVydHlSZWYoKTsKKyAgICAgICAgICAgICAgSUVPYmplY3REZXNjcmlwdGlvbiBfY3JlYXRlXzEgPSBFT2JqZWN0RGVzY3JpcHRpb24uY3JlYXRlKF9wcm9wZXJ0eU5hbWVfMSwgX3Byb3BlcnR5UmVmXzEpOworICAgICAgICAgICAgICByZXN1bHQuYWRkKF9jcmVhdGVfMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIEVMaXN0PERhdGFtYXJ0UHJvcGVydHk+IF9wcm9wZXJ0aWVzID0gZW50aXR5LmdldFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKGZpbmFsIERhdGFtYXJ0UHJvcGVydHkgcHJvcGVydHkgOiBfcHJvcGVydGllcykgeworICAgICAgQXhpc0VudW0gX2F4aXMgPSBwcm9wZXJ0eS5nZXRBeGlzKCk7CisgICAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoX2F4aXMsIG51bGwpKTsKKyAgICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICAgIEF4aXNFbnVtIF9heGlzXzEgPSBwcm9wZXJ0eS5nZXRBeGlzKCk7CisgICAgICAgIFN0cmluZyBfbGl0ZXJhbCA9IF9heGlzXzEuZ2V0TGl0ZXJhbCgpOworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbGl0ZXJhbC5lcXVhbHMocmVxdWVzdGVkQXhpc05hbWUpOworICAgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICAgIFN0cmluZyBfcHJvcGVydHlOYW1lID0gdGhpcy5kYXRhbWFydEluZmVycmVyLmdldFByb3BlcnR5TmFtZShwcm9wZXJ0eSwgbnVsbCk7CisgICAgICAgICAgTEVudGl0eUF0dHJpYnV0ZSBfcHJvcGVydHlSZWYgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVJlZigpOworICAgICAgICAgIElFT2JqZWN0RGVzY3JpcHRpb24gX2NyZWF0ZSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX3Byb3BlcnR5TmFtZSwgX3Byb3BlcnR5UmVmKTsKKyAgICAgICAgICByZXN1bHQuYWRkKF9jcmVhdGUpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmcgX3Byb3BlcnR5TmFtZV8xID0gdGhpcy5kYXRhbWFydEluZmVycmVyLmdldFByb3BlcnR5TmFtZShwcm9wZXJ0eSwgbnVsbCk7CisgICAgICAgIExFbnRpdHlBdHRyaWJ1dGUgX3Byb3BlcnR5UmVmXzEgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eVJlZigpOworICAgICAgICBJRU9iamVjdERlc2NyaXB0aW9uIF9jcmVhdGVfMSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX3Byb3BlcnR5TmFtZV8xLCBfcHJvcGVydHlSZWZfMSk7CisgICAgICAgIHJlc3VsdC5hZGQoX2NyZWF0ZV8xKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdmFsaWRhdGlvbi9DaGFydERTTFZhbGlkYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9jaGFydC92YWxpZGF0aW9uL0NoYXJ0RFNMVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU0YWVmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvY2hhcnQvdmFsaWRhdGlvbi9DaGFydERTTFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqICBDb250cmlidXRvcnM6CisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQudmFsaWRhdGlvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC5DaGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0RFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LkNoYXJ0UGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnZhbGlkYXRpb24uQWJzdHJhY3RDaGFydERTTFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkNoZWNrOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYi5Db2xsZWN0aW9uTGl0ZXJhbHM7CisKKy8qKgorICogQ3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCN2YWxpZGF0aW9uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIENoYXJ0RFNMVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFydERTTFZhbGlkYXRvciB7CisgIEBDaGVjaworICBwdWJsaWMgdm9pZCBjaGVja0R1cGxpY2F0ZUNoYXJ0TmFtZXMoZmluYWwgQ2hhcnQgY2hhcnQpIHsKKyAgICBFT2JqZWN0IGVPYmogPSBjaGFydC5lQ29udGFpbmVyKCk7CisgICAgd2hpbGUgKCghKGVPYmogaW5zdGFuY2VvZiBDaGFydFBhY2thZ2UpKSkgeworICAgICAgRU9iamVjdCBfZUNvbnRhaW5lciA9IGVPYmouZUNvbnRhaW5lcigpOworICAgICAgZU9iaiA9IF9lQ29udGFpbmVyOworICAgIH0KKyAgICBib29sZWFuIF9ub3RFcXVhbHMgPSAoIU9iamVjdHMuZXF1YWwoZU9iaiwgbnVsbCkpOworICAgIGlmIChfbm90RXF1YWxzKSB7CisgICAgICBDaGFydFBhY2thZ2UgY2hhcnRQYWNrYWdlID0gKChDaGFydFBhY2thZ2UpIGVPYmopOworICAgICAgRUxpc3Q8Q2hhcnQ+IF9jaGFydHMgPSBjaGFydFBhY2thZ2UuZ2V0Q2hhcnRzKCk7CisgICAgICBTdHJpbmcgX25hbWUgPSBjaGFydC5nZXROYW1lKCk7CisgICAgICBDaGFydCBfZmluZER1cGxpY2F0ZUNoYXJ0TmFtZXMgPSB0aGlzLmZpbmREdXBsaWNhdGVDaGFydE5hbWVzKF9jaGFydHMsIF9uYW1lKTsKKyAgICAgIGJvb2xlYW4gX25vdEVxdWFsc18xID0gKCFPYmplY3RzLmVxdWFsKF9maW5kRHVwbGljYXRlQ2hhcnROYW1lcywgbnVsbCkpOworICAgICAgaWYgKF9ub3RFcXVhbHNfMSkgeworICAgICAgICBTdHJpbmcgX25hbWVfMSA9IGNoYXJ0LmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIF9jb25jYXQgPSAiRHVwbGljYXRlIGNoYXJ0IG5hbWUgXCciLmNvbmNhdChfbmFtZV8xKTsKKyAgICAgICAgU3RyaW5nIF9jb25jYXRfMSA9IF9jb25jYXQuY29uY2F0KCJcJyEiKTsKKyAgICAgICAgdGhpcy5lcnJvcihfY29uY2F0XzEsIENoYXJ0RFNMUGFja2FnZS5MaXRlcmFscy5DSEFSVF9CQVNFX19OQU1FKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgCisgIHByaXZhdGUgQ2hhcnQgZmluZER1cGxpY2F0ZUNoYXJ0TmFtZXMoZmluYWwgRUxpc3Q8Q2hhcnQ+IGNoYXJ0cywgZmluYWwgU3RyaW5nIGNoYXJ0TmFtZSkgeworICAgIEhhc2hTZXQ8U3RyaW5nPiB0ZW1wU2V0ID0gQ29sbGVjdGlvbkxpdGVyYWxzLjxTdHJpbmc+bmV3SGFzaFNldCgpOworICAgIGZvciAoZmluYWwgQ2hhcnQgY2hhcnQgOiBjaGFydHMpIHsKKyAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgU3RyaW5nIF9uYW1lID0gY2hhcnQuZ2V0TmFtZSgpOworICAgICAgYm9vbGVhbiBfYWRkID0gdGVtcFNldC5hZGQoX25hbWUpOworICAgICAgYm9vbGVhbiBfbm90ID0gKCFfYWRkKTsKKyAgICAgIGlmICghX25vdCkgeworICAgICAgICBfYW5kID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdHJpbmcgX25hbWVfMSA9IGNoYXJ0LmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX25hbWVfMS5lcXVhbHMoY2hhcnROYW1lKTsKKyAgICAgICAgX2FuZCA9IF9lcXVhbHM7CisgICAgICB9CisgICAgICBpZiAoX2FuZCkgeworICAgICAgICByZXR1cm4gY2hhcnQ7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxsOworICB9Cit9CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MwMzc1Ci0tLSAvZGV2L251bGwKKysrIGIvcG9tLnhtbApAQCAtMCwwICsxLDk0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpLiAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC5yZWxlbmcubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAucmVsZW5nLm1hdmVuLnBhcmVudC50eWNobzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGgvPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICAgIDx1cmw+JHtvc2JwLnNpdGUucmVwb3NpdG9yeS51cmx9PC91cmw+CisgICAgPHNjbT4KKyAgICAgICAgPHVybD4ke29zYnAuc2NtLnVybH08L3VybD4KKyAgICAgICAgPGNvbm5lY3Rpb24+JHtvc2JwLnNjbS5jb25uZWN0aW9ufTwvY29ubmVjdGlvbj4KKyAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+JHtvc2JwLnNjbS5jb25uZWN0aW9uLmRldn08L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgICAgIDx0YWc+SEVBRDwvdGFnPgorICAgIDwvc2NtPgorICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgICAgICA8c2l0ZT4KKyAgICAgICAgICAgIDxpZD5naC1wYWdlczwvaWQ+CisgICAgICAgICAgICA8bmFtZT5PU0JQIEdpdEh1YiBQYWdlczwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+JHtkaXN0cmlidXRpb24uc2l0ZS51cmx9PC91cmw+CisgICAgICAgIDwvc2l0ZT4KKyAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisKKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmNoYXJ0LnRlc3RzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5jaGFydC51aTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuY2hhcnQuZmVhdHVyZTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGFyZ2V0LXBsYXRmb3JtLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dHljaG8tdmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlc29sdmVyPnAyPC9yZXNvbHZlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwb21EZXBlbmRlbmNpZXM+Y29uc2lkZXI8L3BvbURlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnZpcm9ubWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudmlyb25tZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3M+d2luMzI8L29zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3M+d2luMzI8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5saW51eDwvb3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cz5ndGs8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODY8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5saW51eDwvb3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3cz5ndGs8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW52aXJvbm1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcz5tYWNvc3g8L29zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d3M+Y29jb2E8L3dzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJjaD54ODZfNjQ8L2FyY2g+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnZpcm9ubWVudD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW52aXJvbm1lbnRzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0Pgo=