ZGlmZiAtLWdpdCBhLy5wcm9qZWN0IGIvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiMzQ1ZAotLS0gL2Rldi9udWxsCisrKyBiLy5wcm9qZWN0CkBAIC0wLDAgKzEsMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5hZ2dyZWdhdG9yPC9uYW1lPgorCTxjb21tZW50PjwvY29tbWVudD4KKwk8cHJvamVjdHM+CisJPC9wcm9qZWN0cz4KKwk8YnVpbGRTcGVjPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2Fib3V0Lmh0bWwgYi9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvamVua2lucy5idWlsZC5jb25maWcueG1sIGIvamVua2lucy5idWlsZC5jb25maWcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YjMwYjIKLS0tIC9kZXYvbnVsbAorKysgYi9qZW5raW5zLmJ1aWxkLmNvbmZpZy54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAkJIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Cis8IS0tIyBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIE1vZHVsZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGZvciB0aGUgSmVua2lucyBKb2IgCQkJCQkJIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPGplbmtpbnM+CisJPCEtLSBETyBOT1QgRURJVCBCRUxPVyBUSElTIExJTkUgLS0+CisgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAuYnBtbjIuZWNvcmU8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAuZHNsPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnJ1bnRpbWU8L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8amVua2lucy5idWlsZC5kZXBlbmRlbmN5Pm9yZy5lY2xpcHNlLm9zYnAudWkuYXBpPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnV0aWxzPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmFkZG9uczwvamVua2lucy5idWlsZC5kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxqZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGplbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG48L2plbmtpbnMuYnVpbGQuZGVwZW5kZW5jeT4KKyAgICAgICAgPC9qZW5raW5zLmJ1aWxkLmRlcGVuZGVuY2llcz4KKzwvamVua2lucz4KZGlmZiAtLWdpdCBhL25vdGljZS5odG1sIGIvbm90aWNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMzRjMwotLS0gL2Rldi9udWxsCisrKyBiL25vdGljZS5odG1sCkBAIC0wLDAgKzEsMTA3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgorPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Cis8L2hlYWQ+CisKKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorPHA+QXByaWwgOSwgMjAxNDwvcD4KKworPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCis8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKyAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCisgICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgorICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECisgICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisKKzxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKworPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAorICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KKyAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKKyAgIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgorCis8dWw+CisgICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKyAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisgICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCisgICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKzwvdWw+CisKKzxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCitJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQoraW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCis8dWw+CisgICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisgICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKyAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisgICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KKyAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Cis8L3VsPgorCis8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCitpbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKK2luZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgordGhhdCBkaXJlY3RvcnkuPC9wPgorCis8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisKKzx1bD4KKyAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+CisgICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KKyAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgorICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KKyAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgorPC91bD4KKworPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKK2NvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCisKKzxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQorICAgVXBkYXRlIE1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisgICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorICAgICAgIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisgICAoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuPC9wPgorCis8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCisgICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKyAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCisgICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisKKzxvbD4KKyAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZyBQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisgICAgICAgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCisgICAgICAgcHJvZHVjdC48L2xpPgorICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisgICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKyAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisgICAgICAgU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KKyAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAorICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Cis8L29sPgorCis8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKworPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bworICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCisgICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKworPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlLy5wcm9qZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNjhkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS8ucHJvamVjdApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5zb25hcmxpbnQuZWNsaXBzZS5jb3JlLnNvbmFybGludEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UubTJlLmNvcmUubWF2ZW4yTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvTElDRU5TRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0MmFkNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTYxIEBACitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorCitUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KK09SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKK2kpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCitpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCit3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KK0EgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQorYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCittb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90CitkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgoraXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKK2FuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uCisKK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCithZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKK2FwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCitjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KK2Fzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKK2Jhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCitkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bworZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKworMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKK2kpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCit3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55CitvdGhlciBwYXJ0eTsgYW5kCisKK2l2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKK2luIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgorCithKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCisKK0NvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KKworRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKK290aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAorcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQorIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCit0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcworcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCitVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgorZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKK3dpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCitwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKK1JlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKK25vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKKyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50CitpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAorbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKK3JpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQorbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KKworVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKK29mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQorb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg5MjBmZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyIEBACitiaW4uaW5jbHVkZXMgPSBsaWNlbnNlLmh0bWwsICBlcGwtdjEwLmh0bWwsICBmZWF0dXJlLnhtbCxcCisgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmM0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNjkgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkuCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisjIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisjCisjIENvbnRyaWJ1dG9yczoKKyMgICAgIENyaXN0aWFubyBHYXZp428gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgZmVhdHVyZS5wcm9wZXJ0aWVzCisjIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAorIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgorCisjICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCitmZWF0dXJlTmFtZSA9T1NCUCBEU0w6IEF1dGhvcml6YXRpb24gCisKKyMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKK3Byb3ZpZGVyTmFtZT1FY2xpcHNlIE9TQlAKKworIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKK2Rlc2NyaXB0aW9uPVRoaXMgZmVhdHVyZSBwcm92aWRlcyB0aGUgYnVuZGxlcyBmb3IgdGhlIE9TQlAgQXV0aG9yaXphdGlvbkRTTC4KKworIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQordXBkYXRlU2l0ZU5hbWU9CisKKyMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgorY29weXJpZ2h0PVwKK0NvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIFxuXAorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK1xuXAorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKKyMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQorbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKKworIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKKyMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgorbGljZW5zZT1cCitFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKK0ZlYnJ1YXJ5IDEsIDIwMTFcblwKK1xuXAorVXNhZ2UgT2YgQ29udGVudFxuXAorXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCitPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKK1VTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAorQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCitOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAorQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAorQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKK09SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAorT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1xuXAorQXBwbGljYWJsZSBMaWNlbnNlc1xuXAorXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCitFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAordGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKK3Byb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKK2RvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAorcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAorYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitcblwKKyAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCisgICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCisgICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAorICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCisgICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAorICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCisgICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCisgICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKKyAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorXG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCitjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCitpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCitMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCitpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1xuXAorICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCisgICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCitQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCitVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCitJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKK3lvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKK3RoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKK1N1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKK3Rlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKK2dvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorXG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCitUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKK1NPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1xuXAorICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKyAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCisgICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCisgICAgICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKKyAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCitcblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKK1RPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAoraXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKK2dvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK1xuXAorXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKK2J1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCit0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKK290aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAordGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCitJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAorXG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCitZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCittYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorXG5cCisgICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAorICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAorICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisgICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAorICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCisgICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKKyAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAorICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAorICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKKyAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKKyAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCisgICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorXG5cCitDcnlwdG9ncmFwaHlcblwKK1xuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCitjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCithbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCit1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKK3JlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCityZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorXG5cCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvZmVhdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhZGNiZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorPCEtLSMgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiAtLT4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+CisKKzxmZWF0dXJlCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZSIKKyAgICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKKyAgICAgICAgdmVyc2lvbj0iMC45LjAucXVhbGlmaWVyIgorICAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KKyAgICAgICAgCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICAlZGVzY3JpcHRpb24KKyAgICA8L2Rlc2NyaXB0aW9uPgorICAgICAgICAKKyAgICA8Y29weXJpZ2h0PgorICAgICAgICAlY29weXJpZ2h0CisgICAgPC9jb3B5cmlnaHQ+CisgICAgICAgIAorICAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgorICAgICAgICAlbGljZW5zZQorICAgIDwvbGljZW5zZT4KKyAgICAgICAgCisgICAgPHBsdWdpbgorICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsIgorICAgICAgICBkb3dubG9hZC1zaXplPSIwIgorICAgICAgICBpbnN0YWxsLXNpemU9IjAiCisgICAgICAgIHZlcnNpb249IjAuMC4wIgorICAgICAgICB1bnBhY2s9ImZhbHNlIi8+CisgICAgICAgIAorICAgIDxwbHVnaW4KKyAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cyIKKyAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKKyAgICAgICAgaW5zdGFsbC1zaXplPSIwIgorICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKKyAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgorICAgICAgICAKKyAgICA8cGx1Z2luCisgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkiCisgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCisgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKKyAgICAgICAgdmVyc2lvbj0iMC4wLjAiCisgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KKyAgICAgICAgCis8L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMCwwICsxLDE2NCBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ2YTgwNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL3BvbS54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDwvZ3JvdXBJZD4KKwkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoPi4uPC9yZWxhdGl2ZVBhdGg+CisJPC9wYXJlbnQ+CisKKwk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZTwvYXJ0aWZhY3RJZD4KKwk8cGFja2FnaW5nPmVjbGlwc2UtZmVhdHVyZTwvcGFja2FnaW5nPgorCQorCQk8YnVpbGQ+CisJCTxwbHVnaW5zPgorCQkJPHBsdWdpbj4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNoby5leHRyYXM8L2dyb3VwSWQ+CisJCQkJPGFydGlmYWN0SWQ+dHljaG8tc291cmNlLWZlYXR1cmUtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCTx2ZXJzaW9uPiR7dHljaG9FeHRyYXNWZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5zb3VyY2UtZmVhdHVyZTwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+c291cmNlLWZlYXR1cmU8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQkJPGNvbmZpZ3VyYXRpb24+CisJCQkJCTxsYWJlbFN1ZmZpeD4gKHNvdXJjZSk8L2xhYmVsU3VmZml4PgorCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCTwvcGx1Z2luPgorCQkJPHBsdWdpbj4KKwkJCQk8IS0tIHdvcmthcm91bmQgd2hpbGUgYnVnIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0zOTgyNTAgCisJCQkJCWlzIG5vdCBmaXhlZCAtLT4KKwkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKwkJCQk8YXJ0aWZhY3RJZD50eWNoby1wMi1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPHZlcnNpb24+JHt0eWNoby12ZXJzaW9ufTwvdmVyc2lvbj4KKwkJCQk8ZXhlY3V0aW9ucz4KKwkJCQkJPGV4ZWN1dGlvbj4KKwkJCQkJCTxpZD5hdHRhY2hlZC1wMi1tZXRhZGF0YTwvaWQ+CisJCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisJCQkJCQk8Z29hbHM+CisJCQkJCQkJPGdvYWw+cDItbWV0YWRhdGE8L2dvYWw+CisJCQkJCQk8L2dvYWxzPgorCQkJCQk8L2V4ZWN1dGlvbj4KKwkJCQk8L2V4ZWN1dGlvbnM+CisJCQk8L3BsdWdpbj4KKwkJCTxwbHVnaW4+CisJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisJCQkJPGV4ZWN1dGlvbnM+CisJCQkJCTxleGVjdXRpb24+CisJCQkJCQk8aWQ+amF2YWRvYy1qYXI8L2lkPgorCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorCQkJCQkJPGdvYWxzPgorCQkJCQkJCTxnb2FsPmphcjwvZ29hbD4KKwkJCQkJCTwvZ29hbHM+CisJCQkJCTwvZXhlY3V0aW9uPgorCQkJCTwvZXhlY3V0aW9ucz4KKwkJCTwvcGx1Z2luPgorCQk8L3BsdWdpbnM+CisJPC9idWlsZD4KKworCTxkZXBlbmRlbmNpZXM+CisJCTxkZXBlbmRlbmN5PgorCQkJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsPC9ncm91cElkPgorCQkJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsPC9hcnRpZmFjdElkPgorCQkJPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTwvZGVwZW5kZW5jeT4KKwkJPGRlcGVuZGVuY3k+CisJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w8L2dyb3VwSWQ+CisJCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHM8L2FydGlmYWN0SWQ+CisJCQk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwkJPC9kZXBlbmRlbmN5PgorCQk8ZGVwZW5kZW5jeT4KKwkJCTxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDwvZ3JvdXBJZD4KKwkJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aTwvYXJ0aWZhY3RJZD4KKwkJCTx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCQk8L2RlcGVuZGVuY3k+CisJPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL3NyYy9tYWluL2phdmFkb2MvUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mZWF0dXJlL3NyYy9tYWluL2phdmFkb2MvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzFkYTdlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvc3JjL21haW4vamF2YWRvYy9SRUFETUUudHh0CkBAIC0wLDAgKzEgQEAKK1Jlc291cmNlIGZvbGRlciBmb3IgamF2YWRvYyByZXNvdXJjZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvc3JjL292ZXJ2aWV3Lmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZS9zcmMvb3ZlcnZpZXcuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJkMmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmZlYXR1cmUvc3JjL292ZXJ2aWV3Lmh0bWwKQEAgLTAsMCArMSwxMSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KKzxodG1sPgorPGhlYWQ+CisJPHRpdGxlPk9TQlAgVG9vbHMgR3JhcGhpY2FsIEVudGl0eTwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKzxwPlRoZSA8c3Ryb25nPk9TQlAmbmJzcDtYdGV4dCZuYnNwO0F1dGhvcml6YXRpb24gRFNMPC9zdHJvbmc+IGNvbnRhaW5zIG1ldGhvZHMgZm9yIHRoZSZuYnNwO2F1dGhvcml6YXRpb24gRFNMLjwvcD4KKworPHA+Jm5ic3A7PC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNkay8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5zZGsvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxYTFiZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5zZGsvLnByb2plY3QKQEAgLTAsMCArMSwxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0RGVzY3JpcHRpb24+CisJPG5hbWU+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNkazwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJPC9idWlsZFNwZWM+CisJPG5hdHVyZXM+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODc0NWUxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzLy5wcm9qZWN0CkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0czwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyMzBkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDI2IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK1JlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0O2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgY29tLmdvb2dsZS5pbmplY3Q7YnVuZGxlLXZlcnNpb249IjMuMC4wIiwKKyBvcmcub2JqZWN0d2ViLmFzbTtidW5kbGUtdmVyc2lvbj0iWzUuMC4xLDYuMC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIKK0ltcG9ydC1QYWNrYWdlOiBqYXZheC52YWxpZGF0aW9uLAorIGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMsCisgb3JnLmFwYWNoZS5sb2c0aiwKKyBvcmcuaGFtY3Jlc3QuY29yZSwKKyBvcmcuanVuaXQ7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXI7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXIubWFuaXB1bGF0aW9uO3ZlcnNpb249IjQuNS4wIiwKKyBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbjt2ZXJzaW9uPSI0LjUuMCIsCisgb3JnLmp1bml0LnJ1bm5lcnM7dmVyc2lvbj0iNC41LjAiLAorIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249IjQuNS4wIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7dmVyc2lvbj0iMC45LjAiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjY3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQuaW5pCkBAIC0wLDAgKzEsMTcgQEAKKyMgYWJvdXQuaW5pCisjIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcworIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCisjIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKK2Fib3V0VGV4dD0lZmVhdHVyZVRleHQKKworIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQorZmVhdHVyZUltYWdlPQorCisjIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKK2FwcE5hbWU9JWZlYXR1cmVOYW1lCisKKyMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQord2VsY29tZVBhZ2U9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYWJvdXQubWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9hYm91dC5tYXBwaW5ncwpAQCAtMCwwICsxLDYgQEAKKyMgYWJvdXQubWFwcGluZ3MKKyMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworMD1xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL2Fib3V0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiZDVmNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9hYm91dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIworCisjIE5MU19NRVNTQUdFRk9STUFUX1ZBUgorCitmZWF0dXJlTmFtZT1vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOThjNzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgIHNyYy1nZW4vCitiaW4uaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgTUVUQS1JTkYvLFwKKyAgICAgICAgICAgICAgIC4sXAorICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwKK3NyYy5pbmNsdWRlcyA9IGFib3V0LnByb3BlcnRpZXMsICBhYm91dC5tYXBwaW5ncywgIGFib3V0LmluaSwgIGFib3V0Lmh0bWwsICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCQkJICAgCisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/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+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMubGF1bmNoIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy5sYXVuY2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmYTlhMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMubGF1bmNoCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxhdW5jaGNvbmZpZyI+Cis8bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KKzxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMiLz4KKzwvbGlzdEF0dHJpYnV0ZT4KKzxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgorPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgorPC9saXN0QXR0cmlidXRlPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSI9b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzIi8+Cis8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDQiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLm0yZS5sYXVuY2hjb25maWcuY2xhc3NwYXRoUHJvdmlkZXIiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cyIvPgorPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5tMmUubGF1bmNoY29uZmlnLnNvdXJjZXBhdGhQcm92aWRlciIvPgorPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTlkYmM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL3BvbS54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAtLT4KKzwhLS0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgLS0+Cis8IS0tIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgLS0+Cis8IS0tIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAtLT4KKzwhLS0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIC0tPgorPCEtLSMgLS0+Cis8IS0tIyBDb250cmlidXRvcnM6IC0tPgorPCEtLSMgICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzPC9hcnRpZmFjdElkPgorICA8cGFyZW50PgorICAJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsPC9ncm91cElkPgorICAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgIAk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgCTxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKyAgPC9wYXJlbnQ+CisgIDxwYWNrYWdpbmc+ZWNsaXBzZS1wbHVnaW48L3BhY2thZ2luZz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMSW5qZWN0b3JQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xJbmplY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBkNzljZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC50ZXN0cy9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMSW5qZWN0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0Lkdsb2JhbFJlZ2lzdHJpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuanVuaXQ0Lkdsb2JhbFJlZ2lzdHJpZXMuR2xvYmFsU3RhdGVNZW1lbnRvOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JSW5qZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5qdW5pdDQuSVJlZ2lzdHJ5Q29uZmlndXJhdG9yOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMSW5qZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIElJbmplY3RvclByb3ZpZGVyLCBJUmVnaXN0cnlDb25maWd1cmF0b3IgeworCQorICAgIHByb3RlY3RlZCBHbG9iYWxTdGF0ZU1lbWVudG8gc3RhdGVCZWZvcmVJbmplY3RvckNyZWF0aW9uOworCXByb3RlY3RlZCBHbG9iYWxTdGF0ZU1lbWVudG8gc3RhdGVBZnRlckluamVjdG9yQ3JlYXRpb247CisJcHJvdGVjdGVkIEluamVjdG9yIGluamVjdG9yOworCisJc3RhdGljIHsKKwkJR2xvYmFsUmVnaXN0cmllcy5pbml0aWFsaXplRGVmYXVsdHMoKTsKKwl9CisKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKQorCXsKKwkJaWYgKGluamVjdG9yID09IG51bGwpIHsKKwkJCXN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbiA9IEdsb2JhbFJlZ2lzdHJpZXMubWFrZUNvcHlPZkdsb2JhbFN0YXRlKCk7CisJCQl0aGlzLmluamVjdG9yID0gaW50ZXJuYWxDcmVhdGVJbmplY3RvcigpOworCQkJc3RhdGVBZnRlckluamVjdG9yQ3JlYXRpb24gPSBHbG9iYWxSZWdpc3RyaWVzLm1ha2VDb3B5T2ZHbG9iYWxTdGF0ZSgpOworCQl9CisJCXJldHVybiBpbmplY3RvcjsKKwl9CisJCisJcHJvdGVjdGVkIEluamVjdG9yIGludGVybmFsQ3JlYXRlSW5qZWN0b3IoKSB7CisJICAgIHJldHVybiBuZXcgQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cCgpLmNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKTsKKwl9CisKKwlwdWJsaWMgdm9pZCByZXN0b3JlUmVnaXN0cnkoKSB7CisJCXN0YXRlQmVmb3JlSW5qZWN0b3JDcmVhdGlvbi5yZXN0b3JlR2xvYmFsU3RhdGUoKTsKKwl9CisKKwlwdWJsaWMgdm9pZCBzZXR1cFJlZ2lzdHJ5KCkgeworCQlnZXRJbmplY3RvcigpOworCQlzdGF0ZUFmdGVySW5qZWN0b3JDcmVhdGlvbi5yZXN0b3JlR2xvYmFsU3RhdGUoKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHMvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTFVpSW5qZWN0b3JQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xVaUluamVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWUwOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnRlc3RzL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xVaUluamVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lmp1bml0NC5JSW5qZWN0b3JQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdG9yOworCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFVpSW5qZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIElJbmplY3RvclByb3ZpZGVyIHsKKwkKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuaW50ZXJuYWwuQXV0aG9yaXphdGlvbkRTTEFjdGl2YXRvci5nZXRJbnN0YW5jZSgpLmdldEluamVjdG9yKCJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIpOworCX0KKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS8ucHJvamVjdCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS8ucHJvamVjdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmZlZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLy5wcm9qZWN0CkBAIC0wLDAgKzEsNTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8cHJvamVjdERlc2NyaXB0aW9uPgorCTxuYW1lPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aTwvbmFtZT4KKwk8Y29tbWVudD48L2NvbW1lbnQ+CisJPHByb2plY3RzPgorCTwvcHJvamVjdHM+CisJPGJ1aWxkU3BlYz4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5iYWJlbC5lZGl0b3IucmJlQnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuc29uYXJsaW50LmVjbGlwc2UuY29yZS5zb25hcmxpbnRCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMkJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCTwvYnVpbGRTcGVjPgorCTxuYXR1cmVzPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLm0yZS5jb3JlLm1hdmVuMk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZU5hdHVyZTwvbmF0dXJlPgorCTwvbmF0dXJlcz4KKzwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL0xJQ0VOU0UudHh0IGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL0xJQ0VOU0UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNDJhZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvTElDRU5TRS50eHQKQEAgLTAsMCArMSwxNjEgQEAKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgLXYgMS4wCisKK1RIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgiQUdSRUVNRU5UIikuIEFOWSBVU0UsIFJFUFJPRFVDVElPTgorT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UgT0YgVEhJUyBBR1JFRU1FTlQuCisKKzEuIERFRklOSVRJT05TCisKKyJDb250cmlidXRpb24iIG1lYW5zOgorCithKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbiBkaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kCisKK2IpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjoKKworaSkgY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kCisKK2lpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisKK3doZXJlIHN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLgorQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvciBpZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lCithY3Rpbmcgb24gc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUKK21vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QKK2Rlcml2YXRpdmUgd29ya3Mgb2YgdGhlIFByb2dyYW0uCisKKyJDb250cmlidXRvciIgbWVhbnMgYW55IHBlcnNvbiBvciBlbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS4KKworIkxpY2Vuc2VkIFBhdGVudHMgIiBtZWFuIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZSBvciBzYWxlIG9mCitpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4KKworIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC4KKworIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuCisKKzIuIEdSQU5UIE9GIFJJR0hUUworCithKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwKK3JveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZQorYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQorZm9ybS4KKworYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZQorQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZCBieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2gKK2FkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24gdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdAorYXBwbHkgdG8gYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcyBsaWNlbnNlZCBoZXJldW5kZXIuCisKK2MpIFJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubworYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yIHRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eQorYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCitsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eSB0byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQorcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwgaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZSB0aGUKK1Byb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uCisKK2QpIEVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0IHJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvCitncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LgorCiszLiBSRVFVSVJFTUVOVFMKKworQSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0OgorCithKSBpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kCisKK2IpIGl0cyBsaWNlbnNlIGFncmVlbWVudDoKKworaSkgZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKK3dhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQKK2ZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOworCitpaSkgZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCitpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOworCitpaWkpIHN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQgQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkKK290aGVyIHBhcnR5OyBhbmQKKworaXYpIHN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQgaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdAoraW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLgorCitXaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZSBjb2RlIGZvcm06CisKK2EpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBhIGNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4KKworQ29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLgorCitFYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZSBvcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cworc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uCisKKzQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OCisKK0NvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzIGFuZAordGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcwordGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwgbGlhYmlsaXR5IGZvcgorb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKygiQ29tbWVyY2lhbCBDb250cmlidXRvciIpIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpCithZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zCiticm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8gdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2gKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcuIFRoZQorb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcyByZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsCitwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAorQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZQorQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kIGFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCitGb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMKK3RoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZSBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzCityZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4KK1VuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvCit0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhIGNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsCit0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLgorCis1LiBOTyBXQVJSQU5UWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SCitDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLAorTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkgcmVzcG9uc2libGUgZm9yCitkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMKK2V4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywgY29tcGxpYW5jZQord2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yIGVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLgorCis2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCitFWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTIEFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUiBBTlkKK0RJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksCitIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRAorSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworNy4gR0VORVJBTAorCitJZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQgb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKK2VuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2gKK3Byb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUgbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLgorCitJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCithbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaAorUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCitsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCitBbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCitjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUgcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaAorbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZCBkaXN0cmlidXRpb24KK29mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwgUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcworIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLgorCitFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQKK2lzIGNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoCituZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzIHRoZQorcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heQorYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0byBzZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlCitBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbSAoaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUKK2Rpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCit0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlCituZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQgaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwordGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3IKK290aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLgorCitUaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUgU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcworb2YgQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzIEFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlCitvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzIGl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYzMmM0MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDQ0IEBACitNYW5pZmVzdC1WZXJzaW9uOiAxLjAKK0J1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKK0J1bmRsZS1OYW1lOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkKK0J1bmRsZS1WZW5kb3I6IEVjbGlwc2UgT1NCUAorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK1JlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmxvZzRqO2J1bmRsZS12ZXJzaW9uPSIxLjIuMTUiLAorIG9yZy5zbGY0ai5hcGk7YnVuZGxlLXZlcnNpb249IjEuNy4yIiwKKyBjb20uZ29vZ2xlLmluamVjdDtidW5kbGUtdmVyc2lvbj0iMy4wLjAiLAorIGphdmF4LmFubm90YXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLnVpLAorIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMsCisgb3JnLmVjbGlwc2UudWkuaWRlO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnVpO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQ7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIiwKKyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvZGV0ZW1wbGF0ZXMudWk7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpYjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmFudGxyLnJ1bnRpbWUsCisgb3JnLmVjbGlwc2UuY29tcGFyZSwKKyBvcmcuZWNsaXBzZS5qZHQuZGVidWcudWksCisgb3JnLmVjbGlwc2Uub3NicC5icG1uMi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmVudGl0eS54dGV4dDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5kdG8ueHRleHQ7YnVuZGxlLXZlcnNpb249IjAuOS4wIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0O3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdC5hbnRscjt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5pbnRlcm5hbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmxhYmVsaW5nO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkub3V0bGluZTt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLnF1aWNrZml4O3ZlcnNpb249IjAuOS4wIgorQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmludGVybmFsLkF1dGhvcml6YXRpb25EU0xBY3RpdmF0b3IKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLmNvbnN0YW50czt2ZXJzaW9uPSIwLjkuMCIsCisgamF2YXgudmFsaWRhdGlvbiwKKyBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLAorIG9yZy5hcGFjaGUubG9nNGoKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2Fib3V0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRjMDU5OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5odG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCisgICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Cis8dGl0bGU+QWJvdXQ8L3RpdGxlPgorPC9oZWFkPgorPGJvZHkgbGFuZz0iRU4tVVMiPgorPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+CisgCis8cD5KdW5lIDEsIDIwMTY8L3A+CQorPGgzPkxpY2Vuc2U8L2gzPgorCis8cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKK2luZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKK0VjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCithdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgorRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKworPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKK2JlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKK2FwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKK3Byb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQoraW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKK2FuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgorCis8L2JvZHk+Cis8L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2Fib3V0LmluaSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5pbmkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RmNjcxZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5pbmkKQEAgLTAsMCArMSwxNyBAQAorIyBhYm91dC5pbmkKKyMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCisjIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCisjICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCisjIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCisKKyMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQorYWJvdXRUZXh0PSVmZWF0dXJlVGV4dAorCisjIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCitmZWF0dXJlSW1hZ2U9CisKKyMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uICh0cmFuc2xhdGVkKQorYXBwTmFtZT0lZmVhdHVyZU5hbWUKKworIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCit3ZWxjb21lUGFnZT0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5tYXBwaW5ncyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9hYm91dC5tYXBwaW5ncwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTExYTBhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2Fib3V0Lm1hcHBpbmdzCkBAIC0wLDAgKzEsNiBAQAorIyBhYm91dC5tYXBwaW5ncworIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcworIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCiswPXF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2Fib3V0LnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvYWJvdXQucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDBlYmI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2Fib3V0LnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIChIZWlkZWxiZXJnKQorIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisjIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIworIyBDb250cmlidXRvcnM6CisjICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCisjCisKKyMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCisKK2ZlYXR1cmVOYW1lPW9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aQorCisjIyMjIyMjIyMjIyMjIyMjIGJsdXJiIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworZmVhdHVyZVRleHQ9XAorQ29weXJpZ2h0IChjKSAyMDEyLTIwMTYgLSBMb2V0eiBHbWJIJkNvLktHIFxuXAorQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAorYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCit3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAoraHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKK1xuXAorQ29udHJpYnV0b3JzOlxuXAorICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxuCisjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2J1aWxkLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAwY2NjZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9idWlsZC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKK3NvdXJjZS4uID0gc3JjLyxcCisgICAgICAgICAgIHNyYy1nZW4vLFwKKyAgICAgICAgICAgeHRlbmQtZ2VuLworYmluLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIE1FVEEtSU5GLyxcCisgICAgICAgICAgICAgICAuLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAorICAgICAgICAgICAgICAgLmNsYXNzcGF0aCxcCisgICAgICAgICAgICAgICAucHJvamVjdCxcCisgICAgICAgICAgICAgICAuc2V0dGluZ3MvLFwKKyAgICAgICAgICAgICAgIGkxOG4vLFwKKyAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCisgICAgICAgICAgICAgICBMSUNFTlNFLnR4dCxcCisgICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAorICAgICAgICAgICAgICAgaWNvbnMvCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCisgICAgICAgICAgICAgICBpY29ucy8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvZXBsLXYxMC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzOThhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvZXBsLXYxMC5odG1sCkBAIC0wLDAgKzEsMjU5IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2kxOG4vSTE4Ti5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZTYwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaTE4bi9JMThOLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NCBAQAorIworI01vbiBEZWMgMTkgMTQ6MTc6MDcgQ0VUIDIwMTYKK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uSW1wb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25JbXBvcnQuaW1wb3J0PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZS5wYWNrYWdlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlF1YWxpZmllZE5hbWU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlLnJvbGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW49CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW4uYmVhbj0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZS5wcm9wZXJ0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkZlYXR1cmU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5SZWZlcmVuY2U9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5SZWZlcmVuY2UucmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwLnByb2Nlc3M9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3M9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3MuYWxsPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwQWxsVXNlclRhc2tzLnVzZXJ0YXNrPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwQWxsVXNlclRhc2tzLnVzZXJ0YXNrcz0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEVudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBFbnVtLmV4ZWN1dGFibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzcy5hbGw9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzLmlzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzcy5wcm9jZXNzPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzcy51c2VydGFza3M9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3NFbnVtLnN0YXJ0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sudXNlcnRhc2s9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW09CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW0uZXhlY3V0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG8uZHRvPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0F0dHJpYnV0ZS5wcm9wZXJ0eT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvRmVhdHVyZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9SZWZlcmVuY2UucmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbGVtZW50PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eS5lbnRpdHk9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5QXR0cmlidXRlLnByb3BlcnR5PQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlFbnVtLmFueT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RW51bS5jcmVhdGFibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUVudW0uZGVsZXRhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlFbnVtLnJlYWRhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlFbnVtLnVwZGF0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RmVhdHVyZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5UHJvcGVydHlFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlQcm9wZXJ0eUVudW0uZGlzYWJsZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVByb3BlcnR5RW51bS5pbnZpc2libGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVByb3BlcnR5RW51bS5ub25lZGl0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5UmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UucmVmZXJlbmNlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtLmFueT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bS5jcmVhdGFibGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW0uZGVsZXRhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtLnJlYWRhYmxlPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtLnVwZGF0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtPQorb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0uZGlzYWJsZWQ9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bS5pbnZpc2libGU9CitvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bS5ub25lZGl0YWJsZT0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5UUkFOU0xBVEFCTEVJRD0KK29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5WYWxpZElEPQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9hdXRob3JpemF0aW9uLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfYXV0aG9yaXphdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNTZiNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfYXV0aG9yaXphdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9hdXRob3JpemF0aW9uMi5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaWNvbnMvZHNsX2F1dGhvcml6YXRpb24yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2QyNGRiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9hdXRob3JpemF0aW9uMi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9ibGlwLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfYmxpcC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3MDgxYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfYmxpcC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9pbXBvcnQucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZmRjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaWNvbnMvZHNsX2ltcG9ydC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL2RzbF9yb2xlLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfcm9sZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI3YjA3OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9kc2xfcm9sZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL21vZGVsLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9tb2RlbC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmYjg1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9tb2RlbC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3BhY2thZ2UuZ2lmIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3BhY2thZ2UuZ2lmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTA2ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaWNvbnMvcGFja2FnZS5naWYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5LnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI0NzU0NgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X2F0dHJpYnV0ZS5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaWNvbnMvcm9sZV9lbnRpdHlfYXR0cmlidXRlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTcxOGVhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X2F0dHJpYnV0ZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X2F0dHJpYnV0ZV9hdXRob3JpemF0aW9uLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eV9hdHRyaWJ1dGVfYXV0aG9yaXphdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2YWY5MQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eV9hdHRyaWJ1dGVfYXV0aG9yaXphdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X3JlZmVyZW5jZS5wbmcgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvaWNvbnMvcm9sZV9lbnRpdHlfcmVmZXJlbmNlLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmRkYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X3JlZmVyZW5jZS5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2ljb25zL3JvbGVfZW50aXR5X3JlZmVyZW5jZV9hdXRob3JpemF0aW9uLnBuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eV9yZWZlcmVuY2VfYXV0aG9yaXphdGlvbi5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdlMzA4ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9pY29ucy9yb2xlX2VudGl0eV9yZWZlcmVuY2VfYXV0aG9yaXphdGlvbi5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9saWNlbnNlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1NzlhNQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9saWNlbnNlLmh0bWwKQEAgLTAsMCArMSwxNjQgQEAKKzwhLS0/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+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9wbHVnaW4ueG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3BsdWdpbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwZWJmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9wbHVnaW4ueG1sCkBAIC0wLDAgKzEsMzMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgorCis8cGx1Z2luPgorCisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgorICAgICAgICA8ZWRpdG9yCisgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5YdGV4dEVkaXRvciIKKyAgICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciIKKyAgICAgICAgICAgICAgZGVmYXVsdD0idHJ1ZSIKKyAgICAgICAgICAgICAgZXh0ZW5zaW9ucz0iYXV0aG9yaXphdGlvbiIKKyAgICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2F1dGhvcml6YXRpb24ucG5nIgorICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiCisgICAgICAgICAgICAgIG1hdGNoaW5nU3RyYXRlZ3k9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuZWRpdG9yLkphdmFFZGl0b3JJbnB1dE1hdGNoZXIiCisgICAgICAgICAgICAgIG5hbWU9Ik9TQlAgQXV0aG9yaXphdGlvbkRTTCBFZGl0b3IiPgorICAgICAgICA8L2VkaXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLk9wZW5EZWNsYXJhdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oeXBlcmxpbmtpbmcuT3BlbkRlY2xhcmF0aW9uIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmhhbmRsZXIuVmFsaWRhdGVBY3Rpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC52YWxpZGF0ZSI+CisgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgCTwvaGFuZGxlcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLmRlZmluaXRpb25zIj4KKyAgICAgICAgPGRlZmluaXRpb24gaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0iaXNBY3RpdmVFZGl0b3JBbkluc3RhbmNlT2ZYdGV4dEVkaXRvciIvPgorICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yLmxhbmd1YWdlTmFtZSIgCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgCisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9kZWZpbml0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2F1dGhvcml6YXRpb24ucG5nIgorICAgICAgICAgICAgbmFtZT0iT1NCUCBBdXRob3JpemF0aW9uRFNMIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5zeW50YXhjb2xvcmluZy5TeW50YXhDb2xvcmluZ1ByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLmNvbG9yaW5nIgorICAgICAgICAgICAgaWNvbj0iaWNvbnMvZHNsX2F1dGhvcml6YXRpb24ucG5nIgorICAgICAgICAgICAgbmFtZT0iU3ludGF4IENvbG9yaW5nIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci50ZW1wbGF0ZXMuWHRleHRUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnRlbXBsYXRlcyIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9hdXRob3JpemF0aW9uLnBuZyIKKyAgICAgICAgICAgIG5hbWU9IlRlbXBsYXRlcyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmtleXdvcmRfQXV0aG9yaXphdGlvbkRTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuTGFuZ3VhZ2VSb290UHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICAgIGljb249Imljb25zL2RzbF9hdXRob3JpemF0aW9uLnBuZyIKKyAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgICBuYW1lPSJPU0JQIEF1dGhvcml6YXRpb25EU0wiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KKyAgICAgICAgPGtleXdvcmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgbGFiZWw9Ik9TQlAgQXV0aG9yaXphdGlvbiBEU0wiLz4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGUiPgorICAgICAgPC9jb21tYW5kPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgPG1lbnVDb250cmlidXRpb24KKyAgICAgICAgICAgIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/YWZ0ZXI9Z3JvdXAuZWRpdCI+CisgICAgICAgICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC52YWxpZGF0ZSIKKyAgICAgICAgICAgICAgICAgc3R5bGU9InB1c2giCisgICAgICAgICAgICAgICAgIHRvb2x0aXA9IlRyaWdnZXIgZXhwZW5zaXZlIHZhbGlkYXRpb24iPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDojVGV4dEVkaXRvckNvbnRleHQ/ZW5kb2Y9Z3JvdXAuZmluZCI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5GaW5kUmVmZXJlbmNlcyI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgIAk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgCTwvcmVmZXJlbmNlPgorICAgICAgICAgICAgCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuZmluZHJlZnMuRmluZFJlZmVyZW5jZXNIYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgPC9leHRlbnNpb24+ICAgCisKKzwhLS0gYWRkaW5nIHJlc291cmNlIGZhY3RvcmllcyAtLT4KKworCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5leHRlbnNpb25fcGFyc2VyIj4KKwkJPHBhcnNlcgorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeSIKKwkJCXR5cGU9ImF1dGhvcml6YXRpb24iPgorCQk8L3BhcnNlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS54dGV4dC5leHRlbnNpb25fcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIiPgorICAgICAgICA8cmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlc291cmNlLklSZXNvdXJjZVVJU2VydmljZVByb3ZpZGVyIgorICAgICAgICAgICAgdXJpRXh0ZW5zaW9uPSJhdXRob3JpemF0aW9uIj4KKyAgICAgICAgPC9yZXNvdXJjZVNlcnZpY2VQcm92aWRlcj4KKyAgICA8L2V4dGVuc2lvbj4KKworCisJPCEtLSBtYXJrZXIgZGVmaW5pdGlvbnMgZm9yIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIC0tPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJhdXRob3JpemF0aW9uZHNsLmNoZWNrLmZhc3QiCisJICAgICAgICBuYW1lPSJPU0JQIEF1dGhvcml6YXRpb25EU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmZhc3QiLz4KKwkgICAgPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiLz4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0iYXV0aG9yaXphdGlvbmRzbC5jaGVjay5ub3JtYWwiCisJICAgICAgICBuYW1lPSJPU0JQIEF1dGhvcml6YXRpb25EU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLm5vcm1hbCIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJhdXRob3JpemF0aW9uZHNsLmNoZWNrLmV4cGVuc2l2ZSIKKwkgICAgICAgIG5hbWU9Ik9TQlAgQXV0aG9yaXphdGlvbkRTTCBQcm9ibGVtIgorCSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorCSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuY2hlY2suZXhwZW5zaXZlIi8+CisJICAgIDxwZXJzaXN0ZW50IHZhbHVlPSJ0cnVlIi8+CisJPC9leHRlbnNpb24+CisKKyAgIDxleHRlbnNpb24KKyAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnBhcnRpY2lwYW50Ij4KKyAgICAgIDxwYXJ0aWNpcGFudAorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5JWHRleHRCdWlsZGVyUGFydGljaXBhbnQiPgorICAgICAgPC9wYXJ0aWNpcGFudD4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnByZWZlcmVuY2VzLkJ1aWxkZXJQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5jb21waWxlci5wcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGljb249Imljb25zL2RzbF9hdXRob3JpemF0aW9uLnBuZyIKKyAgICAgICAgICAgIG5hbWU9IkNvbXBpbGVyIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wcmVmZXJlbmNlcy5CdWlsZGVyUHJlZmVyZW5jZVBhZ2UiCisgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5jb21waWxlci5wcm9wZXJ0eVBhZ2UiCisgICAgICAgICAgICAgIGljb249Imljb25zL2RzbF9hdXRob3JpemF0aW9uLnBuZyIKKyAgICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorCisJPCEtLSBRdWljayBPdXRsaW5lIC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5xdWlja291dGxpbmUuU2hvd1F1aWNrT3V0bGluZUFjdGlvbkhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+CisJCTxjb21tYW5kCisJCQlkZXNjcmlwdGlvbj0iT3BlbiB0aGUgcXVpY2sgb3V0bGluZS4iCisJCQlpZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIgorCQkJbmFtZT0iUXVpY2sgT3V0bGluZSI+CisJCTwvY29tbWFuZD4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBRdWljayBPdXRsaW5lIj4KKwkJCQk8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisJCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIi8+CisJCQkJPC92aXNpYmxlV2hlbj4KKwkJCTwvY29tbWFuZD4KKwkJPC9tZW51Q29udHJpYnV0aW9uPgorCTwvZXh0ZW5zaW9uPgorICAgIDwhLS0gcXVpY2tmaXggbWFya2VyIHJlc29sdXRpb24gZ2VuZXJhdG9yIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCAtLT4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaWRlLm1hcmtlclJlc29sdXRpb24iPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuYXV0aG9yaXphdGlvbmRzbC5jaGVjay5mYXN0Ij4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuYXV0aG9yaXphdGlvbmRzbC5jaGVjay5ub3JtYWwiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgICAgIDxtYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguTWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvciIKKyAgICAgICAgICAgIG1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5hdXRob3JpemF0aW9uZHNsLmNoZWNrLmV4cGVuc2l2ZSI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICA8L2V4dGVuc2lvbj4KKyAgIAk8IS0tIFJlbmFtZSBSZWZhY3RvcmluZyAtLT4KKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuSVJlbmFtZUVsZW1lbnRIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCTwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm1lbnVzIj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy5SZW5hbWVFbGVtZW50IgorICAgICAgICAgICAgICAgc3R5bGU9InB1c2giPgorICAgICAgICAgICAgPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICAgPHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorICAgICAgICAgICAgPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIDwvY29tbWFuZD4KKyAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKwkgICAgPHBhZ2UKKwkgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKwkgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLlJlZmFjdG9yaW5nUHJlZmVyZW5jZVBhZ2UiCisJICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wucmVmYWN0b3JpbmciCisgICAgICAgICAgICBpY29uPSJpY29ucy9kc2xfYXV0aG9yaXphdGlvbi5wbmciCisJICAgICAgICBuYW1lPSJSZWZhY3RvcmluZyI+CisJICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmtleXdvcmRfQXV0aG9yaXphdGlvbkRTTCIvPgorCSAgICA8L3BhZ2U+CisJPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50Vmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuY29tcGFyZS5jb250ZW50Vmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJhdXRob3JpemF0aW9uIj4KKyAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5JbmplY3RhYmxlVmlld2VyQ3JlYXRvciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImF1dGhvcml6YXRpb24iIGxhYmVsPSJBdXRob3JpemF0aW9uRFNMIENvbXBhcmUiPgorICAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5tb2RlbC5YdGV4dERvY3VtZW50UHJvdmlkZXIiCisgICAgICAgICAgICBleHRlbnNpb25zPSJhdXRob3JpemF0aW9uIj4KKyAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvcGx1Z2luLnhtbF9nZW4gYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvcGx1Z2luLnhtbF9nZW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyNTY3YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9wbHVnaW4ueG1sX2dlbgpAQCAtMCwwICsxLDU2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KKyAgICAgICAgPGVkaXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIgorICAgICAgICAgICAgY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3JBY3Rpb25Db250cmlidXRvciIKKyAgICAgICAgICAgIGRlZmF1bHQ9InRydWUiCisgICAgICAgICAgICBleHRlbnNpb25zPSJhdXRob3JpemF0aW9uIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgbWF0Y2hpbmdTdHJhdGVneT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5lZGl0b3IuSmF2YUVkaXRvcklucHV0TWF0Y2hlciIKKyAgICAgICAgICAgIG5hbWU9IkF1dGhvcml6YXRpb25EU0wgRWRpdG9yIj4KKyAgICAgICAgPC9lZGl0b3I+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbgorICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmh5cGVybGlua2luZy5PcGVuRGVjbGFyYXRpb25IYW5kbGVyIgorICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaHlwZXJsaW5raW5nLk9wZW5EZWNsYXJhdGlvbiI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L2FjdGl2ZVdoZW4+CisgICAgICAgIDwvaGFuZGxlcj4KKyAgICAgICAgPGhhbmRsZXIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5oYW5kbGVyLlZhbGlkYXRlQWN0aW9uSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wudmFsaWRhdGUiPgorICAgICAgICAgPGFjdGl2ZVdoZW4+CisgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgIAk8L2hhbmRsZXI+CisgICAgICAJPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIiAvPgorICAgICAgICAgICAgPC9hY3RpdmVXaGVuPgorICAgICAgICA8L2hhbmRsZXI+CisgICAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLk91dGxpbmVDb3B5UXVhbGlmaWVkTmFtZSI+CisgICAgICAgICAgICA8YWN0aXZlV2hlbj4KKyAgICAgICAgICAgIAk8YW5kPgorICAgICAgICAgICAgCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuWHRleHRFZGl0b3Iub3BlbmVkIiAvPgorCSAgICAgICAgICAgICAgICA8aXRlcmF0ZT4KKwkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5JT3V0bGluZU5vZGUiIC8+CisJCQkJCTwvaXRlcmF0ZT4KKwkJCQk8L2FuZD4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuZGVmaW5pdGlvbnMiPgorICAgICAgICA8ZGVmaW5pdGlvbiBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICA8YW5kPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UgZGVmaW5pdGlvbklkPSJpc0FjdGl2ZUVkaXRvckFuSW5zdGFuY2VPZlh0ZXh0RWRpdG9yIi8+CisgICAgICAgICAgICAgICAgPHdpdGggdmFyaWFibGU9ImFjdGl2ZUVkaXRvciI+CisgICAgICAgICAgICAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3IubGFuZ3VhZ2VOYW1lIiAKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiLz4KKyAgICAgICAgICAgICAgICA8L3dpdGg+ICAgICAgICAKKyAgICAgICAgICAgIDwvYW5kPgorICAgICAgICA8L2RlZmluaXRpb24+CisgICAgICAgIDxkZWZpbml0aW9uIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5YdGV4dEVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgPGFuZD4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0iaXNYdGV4dEVkaXRvckFjdGl2ZSIvPgorICAgICAgICAgICAgICAgIDx3aXRoIHZhcmlhYmxlPSJhY3RpdmVFZGl0b3IiPgorICAgICAgICAgICAgICAgICAgICA8dGVzdCBwcm9wZXJ0eT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yLmxhbmd1YWdlTmFtZSIgCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiIAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPC93aXRoPiAgICAgICAgCisgICAgICAgICAgICA8L2FuZD4KKyAgICAgICAgPC9kZWZpbml0aW9uPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgorICAgICAgICA8cGFnZQorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnByZWZlcmVuY2VzLkxhbmd1YWdlUm9vdFByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgbmFtZT0iQXV0aG9yaXphdGlvbkRTTCI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmtleXdvcmRfQXV0aG9yaXphdGlvbkRTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iuc3ludGF4Y29sb3JpbmcuU3ludGF4Q29sb3JpbmdQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5jb2xvcmluZyIKKyAgICAgICAgICAgIG5hbWU9IlN5bnRheCBDb2xvcmluZyI+CisgICAgICAgICAgICA8a2V5d29yZFJlZmVyZW5jZSBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmtleXdvcmRfQXV0aG9yaXphdGlvbkRTTCIvPgorICAgICAgICA8L3BhZ2U+CisgICAgICAgIDxwYWdlCisgICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IudGVtcGxhdGVzLlh0ZXh0VGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC50ZW1wbGF0ZXMiCisgICAgICAgICAgICBuYW1lPSJUZW1wbGF0ZXMiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5wcmVmZXJlbmNlcy5MYW5ndWFnZVJvb3RQcmVmZXJlbmNlUGFnZSIKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgIG5hbWU9IkF1dGhvcml6YXRpb25EU0wiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKyAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KKwkgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiLz4KKwkJCTwvZW5hYmxlZFdoZW4+CisJICAgICAgICA8ZmlsdGVyIG5hbWU9InByb2plY3ROYXR1cmUiIHZhbHVlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQueHRleHROYXR1cmUiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmtleXdvcmRzIj4KKyAgICAgICAgPGtleXdvcmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgbGFiZWw9IkF1dGhvcml6YXRpb25EU0wiLz4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnZhbGlkYXRlIgorICAgICAgICAgICAgbmFtZT0iVmFsaWRhdGUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPCEtLSBjb3B5IHF1YWxpZmllZCBuYW1lIC0tPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICBjYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgorICAgICAgICAgICAgZGVzY3JpcHRpb249IkNvcHkgdGhlIHF1YWxpZmllZCBuYW1lIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudCIKKyAgICAgICAgICAgIG5hbWU9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgPC9jb21tYW5kPgorICAgICAgPGNvbW1hbmQKKyAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuT3V0bGluZUNvcHlRdWFsaWZpZWROYW1lIgorICAgICAgICAgICAgY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uPSJDb3B5IHRoZSBxdWFsaWZpZWQgbmFtZSBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQiCisgICAgICAgICAgICBuYW1lPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgIDwvY29tbWFuZD4KKyAgICA8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLmVkaXQiPgorICAgICAgICAgICAgIDxjb21tYW5kCisgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wudmFsaWRhdGUiCisgICAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIgorICAgICAgICAgICAgICAgICB0b29sdGlwPSJUcmlnZ2VyIGV4cGVuc2l2ZSB2YWxpZGF0aW9uIj4KKyAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPiAgCisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgICAgICA8IS0tIGNvcHkgcXVhbGlmaWVkIG5hbWUgLS0+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWNvcHkiPgorICAgICAgICAgCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvcHlxdWFsaWZpZWRuYW1lLkVkaXRvckNvcHlRdWFsaWZpZWROYW1lIiAKKyAgICAgICAgIAkJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJtZW51OmVkaXQ/YWZ0ZXI9Y29weSI+CisgICAgICAgICAJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29weXF1YWxpZmllZG5hbWUuRWRpdG9yQ29weVF1YWxpZmllZE5hbWUiCisgICAgICAgICAgICAJc3R5bGU9InB1c2giIHRvb2x0aXA9IkNvcHkgUXVhbGlmaWVkIE5hbWUiPgorICAgICAgICAgICAgCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiIC8+CisgICAgICAgICAgICAJPC92aXNpYmxlV2hlbj4KKyAgICAgICAgIAk8L2NvbW1hbmQ+ICAKKyAgICAgICAgIDwvbWVudUNvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDxtZW51Q29udHJpYnV0aW9uIGxvY2F0aW9uVVJJPSJwb3B1cDpvcmcuZWNsaXBzZS54dGV4dC51aS5vdXRsaW5lP2FmdGVyPWFkZGl0aW9ucyI+CisJCQk8Y29tbWFuZCBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb3B5cXVhbGlmaWVkbmFtZS5PdXRsaW5lQ29weVF1YWxpZmllZE5hbWUiIAorCQkJCXN0eWxlPSJwdXNoIiB0b29sdGlwPSJDb3B5IFF1YWxpZmllZCBOYW1lIj4KKyAgICAgICAgIAkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCSAgICAgICAgICAgIAk8YW5kPgorCSAgICAgICAgICAgIAkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLlh0ZXh0RWRpdG9yLm9wZW5lZCIgLz4KKwkJCQkJCTxpdGVyYXRlPgorCQkJCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5JT3V0bGluZU5vZGUiIC8+CisJCQkJCQk8L2l0ZXJhdGU+CisJCQkJCTwvYW5kPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisgICAgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICAgPC9leHRlbnNpb24+CisgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbiBsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2VuZG9mPWdyb3VwLmZpbmQiPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRmluZFJlZmVyZW5jZXMiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgICAJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgIAk8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIAk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCSAgICA8aGFuZGxlcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmZpbmRyZWZzLkZpbmRSZWZlcmVuY2VzSGFuZGxlciIKKyAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLkZpbmRSZWZlcmVuY2VzIj4KKyAgICAgICAgICAgIDxhY3RpdmVXaGVuPgorICAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKyAgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvYWN0aXZlV2hlbj4KKyAgICAgICAgPC9oYW5kbGVyPgorICAgIDwvZXh0ZW5zaW9uPiAgIAorCis8IS0tIGFkZGluZyByZXNvdXJjZSBmYWN0b3JpZXMgLS0+CisKKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+CisJCTxwYXJzZXIKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZUZhY3RvcnkiCisJCQl0eXBlPSJhdXRob3JpemF0aW9uIj4KKwkJPC9wYXJzZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuZXh0ZW5zaW9uX3Jlc291cmNlU2VydmljZVByb3ZpZGVyIj4KKyAgICAgICAgPHJlc291cmNlU2VydmljZVByb3ZpZGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZXNvdXJjZS5JUmVzb3VyY2VVSVNlcnZpY2VQcm92aWRlciIKKyAgICAgICAgICAgIHVyaUV4dGVuc2lvbj0iYXV0aG9yaXphdGlvbiI+CisgICAgICAgIDwvcmVzb3VyY2VTZXJ2aWNlUHJvdmlkZXI+CisgICAgPC9leHRlbnNpb24+CisKKworCTwhLS0gbWFya2VyIGRlZmluaXRpb25zIGZvciBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCAtLT4KKwk8ZXh0ZW5zaW9uCisJICAgICAgICBpZD0iYXV0aG9yaXphdGlvbmRzbC5jaGVjay5mYXN0IgorCSAgICAgICAgbmFtZT0iQXV0aG9yaXphdGlvbkRTTCBQcm9ibGVtIgorCSAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgorCSAgICA8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuY2hlY2suZmFzdCIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJhdXRob3JpemF0aW9uZHNsLmNoZWNrLm5vcm1hbCIKKwkgICAgICAgIG5hbWU9IkF1dGhvcml6YXRpb25EU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLm5vcm1hbCIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCTxleHRlbnNpb24KKwkgICAgICAgIGlkPSJhdXRob3JpemF0aW9uZHNsLmNoZWNrLmV4cGVuc2l2ZSIKKwkgICAgICAgIG5hbWU9IkF1dGhvcml6YXRpb25EU0wgUHJvYmxlbSIKKwkgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5tYXJrZXJzIj4KKwkgICAgPHN1cGVyIHR5cGU9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNoZWNrLmV4cGVuc2l2ZSIvPgorCSAgICA8cGVyc2lzdGVudCB2YWx1ZT0idHJ1ZSIvPgorCTwvZXh0ZW5zaW9uPgorCisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5wYXJ0aWNpcGFudCI+CisgICAgICA8cGFydGljaXBhbnQKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuSVh0ZXh0QnVpbGRlclBhcnRpY2lwYW50IgorICAgICAgICAgICAgZmlsZUV4dGVuc2lvbnM9ImF1dGhvcml6YXRpb24iCisgICAgICAgICAgICA+CisgICAgICA8L3BhcnRpY2lwYW50PgorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLmNvbXBpbGVyLnByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgbmFtZT0iQ29tcGlsZXIiPgorICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKyAgICAgICAgPC9wYWdlPgorICAgIDwvZXh0ZW5zaW9uPgorICAgIDxleHRlbnNpb24KKyAgICAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KKyAgICAgICAgPHBhZ2UKKyAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIucHJlZmVyZW5jZXMuQnVpbGRlclByZWZlcmVuY2VQYWdlIgorICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLmNvbXBpbGVyLnByb3BlcnR5UGFnZSIKKyAgICAgICAgICAgIG5hbWU9IkNvbXBpbGVyIj4KKyAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkua2V5d29yZF9BdXRob3JpemF0aW9uRFNMIi8+CisgICAgICAgICAgICA8ZW5hYmxlZFdoZW4+CisJICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0Ii8+CisJCQk8L2VuYWJsZWRXaGVuPgorCSAgICAgICAgPGZpbHRlciBuYW1lPSJwcm9qZWN0TmF0dXJlIiB2YWx1ZT0ib3JnLmVjbGlwc2UueHRleHQudWkuc2hhcmVkLnh0ZXh0TmF0dXJlIi8+CisgICAgICAgIDwvcGFnZT4KKyAgICA8L2V4dGVuc2lvbj4KKworCTwhLS0gUXVpY2sgT3V0bGluZSAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUucXVpY2tvdXRsaW5lLlNob3dRdWlja091dGxpbmVBY3Rpb25IYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5RdWlja091dGxpbmUiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbgorCQlwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgorCQk8Y29tbWFuZAorCQkJZGVzY3JpcHRpb249Ik9wZW4gdGhlIHF1aWNrIG91dGxpbmUuIgorCQkJaWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5vdXRsaW5lLlF1aWNrT3V0bGluZSIKKwkJCW5hbWU9IlF1aWNrIE91dGxpbmUiPgorCQk8L2NvbW1hbmQ+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLm91dGxpbmUuUXVpY2tPdXRsaW5lIgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gUXVpY2sgT3V0bGluZSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8IS0tIHF1aWNrZml4IG1hcmtlciByZXNvbHV0aW9uIGdlbmVyYXRvciBmb3Igb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wgLS0+CisgICAgPGV4dGVuc2lvbgorICAgICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmlkZS5tYXJrZXJSZXNvbHV0aW9uIj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmF1dGhvcml6YXRpb25kc2wuY2hlY2suZmFzdCI+CisgICAgICAgICAgICA8YXR0cmlidXRlCisgICAgICAgICAgICAgICAgbmFtZT0iRklYQUJMRV9LRVkiCisgICAgICAgICAgICAgICAgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPC9hdHRyaWJ1dGU+CisgICAgICAgIDwvbWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcj4KKyAgICAgICAgPG1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5NYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yIgorICAgICAgICAgICAgbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmF1dGhvcml6YXRpb25kc2wuY2hlY2subm9ybWFsIj4KKyAgICAgICAgICAgIDxhdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICBuYW1lPSJGSVhBQkxFX0tFWSIKKyAgICAgICAgICAgICAgICB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPC9tYXJrZXJSZXNvbHV0aW9uR2VuZXJhdG9yPgorICAgICAgICA8bWFya2VyUmVzb2x1dGlvbkdlbmVyYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLnF1aWNrZml4Lk1hcmtlclJlc29sdXRpb25HZW5lcmF0b3IiCisgICAgICAgICAgICBtYXJrZXJUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuYXV0aG9yaXphdGlvbmRzbC5jaGVjay5leHBlbnNpdmUiPgorICAgICAgICAgICAgPGF0dHJpYnV0ZQorICAgICAgICAgICAgICAgIG5hbWU9IkZJWEFCTEVfS0VZIgorICAgICAgICAgICAgICAgIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDwvYXR0cmlidXRlPgorICAgICAgICA8L21hcmtlclJlc29sdXRpb25HZW5lcmF0b3I+CisgICAgPC9leHRlbnNpb24+CisgICAJPCEtLSBSZW5hbWUgUmVmYWN0b3JpbmcgLS0+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuaGFuZGxlcnMiPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLnJlZmFjdG9yaW5nLnVpLkRlZmF1bHRSZW5hbWVFbGVtZW50SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudCI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcuUmVuYW1lRWxlbWVudCIKKyAgICAgICAgICAgICAgIHN0eWxlPSJwdXNoIj4KKyAgICAgICAgICAgIDx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKyAgICAgICAgICAgICAgIDxyZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgICA8L3JlZmVyZW5jZT4KKyAgICAgICAgICAgIDwvdmlzaWJsZVdoZW4+CisgICAgICAgICA8L2NvbW1hbmQ+CisgICAgICA8L21lbnVDb250cmlidXRpb24+CisgICA8L2V4dGVuc2lvbj4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+CisJICAgIDxwYWdlCisJICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiCisJICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC51aS5yZWZhY3RvcmluZy51aS5SZWZhY3RvcmluZ1ByZWZlcmVuY2VQYWdlIgorCSAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnJlZmFjdG9yaW5nIgorCSAgICAgICAgbmFtZT0iUmVmYWN0b3JpbmciPgorCSAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5rZXl3b3JkX0F1dGhvcml6YXRpb25EU0wiLz4KKwkgICAgPC9wYWdlPgorCTwvZXh0ZW5zaW9uPgorCis8IS0tIFR5cGUgSGllcmFyY2h5ICAtLT4KKwk8ZXh0ZW5zaW9uCisJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+CisJCTxoYW5kbGVyIAorCQkJY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5SGFuZGxlciIKKwkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5Ij4KKwkJCTxhY3RpdmVXaGVuPgorCQkJCTxyZWZlcmVuY2UKKwkJCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTC5FZGl0b3Iub3BlbmVkIj4KKwkJCQk8L3JlZmVyZW5jZT4KKwkJCTwvYWN0aXZlV2hlbj4KKwkJPC9oYW5kbGVyPgorCQk8aGFuZGxlciAKKwkJCWNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5RdWlja1R5cGVIaWVyYXJjaHlIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEub3Blbi5oaWVyYXJjaHkiPgorCQkJPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorCQk8L2hhbmRsZXI+CisJPC9leHRlbnNpb24+CisJPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorCQk8bWVudUNvbnRyaWJ1dGlvbgorCQkJbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5vcGVuIj4KKwkJCTxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuaGllcmFyY2h5Lk9wZW5UeXBlSGllcmFyY2h5IgorCQkJCXN0eWxlPSJwdXNoIgorCQkJCXRvb2x0aXA9Ik9wZW4gVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEub3Blbi5oaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iUXVpY2sgVHlwZSBIaWVyYXJjaHkiPgorCQkJCTx2aXNpYmxlV2hlbiBjaGVja0VuYWJsZWQ9ImZhbHNlIj4KKwkJCQkJPHJlZmVyZW5jZSBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiLz4KKwkJCQk8L3Zpc2libGVXaGVuPgorCQkJPC9jb21tYW5kPgorCQk8L21lbnVDb250cmlidXRpb24+CisJPC9leHRlbnNpb24+CisJPCEtLSBDYWxsIEhpZXJhY2h5IC0tPgorCTxleHRlbnNpb24KKwkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYWNoeUhhbmRsZXIiCisJCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmhpZXJhcmNoeS5PcGVuQ2FsbEhpZXJhcmNoeSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKwkKKwk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisJCTxtZW51Q29udHJpYnV0aW9uCisJCQlsb2NhdGlvblVSST0icG9wdXA6I1RleHRFZGl0b3JDb250ZXh0P2FmdGVyPWdyb3VwLm9wZW4iPgorCQkJPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5oaWVyYXJjaHkuT3BlbkNhbGxIaWVyYXJjaHkiCisJCQkJc3R5bGU9InB1c2giCisJCQkJdG9vbHRpcD0iT3BlbiBDYWxsIEhpZXJhcmNoeSI+CisJCQkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorCQkJCQk8cmVmZXJlbmNlIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCIvPgorCQkJCTwvdmlzaWJsZVdoZW4+CisJCQk8L2NvbW1hbmQ+CisJCTwvbWVudUNvbnRyaWJ1dGlvbj4KKwk8L2V4dGVuc2lvbj4KKwk8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0ZXJzIj4KKyAgICAgIDxmYWN0b3J5IGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuc21hcC5TdHJhdHVtQnJlYWtwb2ludEFkYXB0ZXJGYWN0b3J5IgorICAgICAgICAgYWRhcHRhYmxlVHlwZT0ib3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLlh0ZXh0RWRpdG9yIj4KKyAgICAgICAgIDxhZGFwdGVyIHR5cGU9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0Ii8+CisgICAgICA8L2ZhY3Rvcnk+IAorICAgPC9leHRlbnNpb24+CisgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KKyAgICAgIDxlZGl0b3JDb250cmlidXRpb24gdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnJ1bGVyQWN0aW9ucyI+CisJICAgICA8YWN0aW9uCisJICAgICAgICAgICAgIGxhYmVsPSJOb3QgVXNlZCIKKwkgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5SdWxlclRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25EZWxlZ2F0ZSIKKwkgICAgICAgICAgICAgc3R5bGU9InB1c2giCisJICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgorCSAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuZG91YmxlQ2xpY2tCcmVha3BvaW50QWN0aW9uIi8+CisJICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+CisgICAgICA8dmlld2VyQ29udHJpYnV0aW9uCisgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuUnVsZXJDb250ZXh0IgorICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLlJ1bGVyUG9wdXBBY3Rpb25zIj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgIGxhYmVsPSJUb2dnbGUgQnJlYWtwb2ludCIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuUnVsZXJUb2dnbGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgICBtZW51YmFyUGF0aD0iZGVidWciCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wucnVsZXJDb250ZXh0TWVudS50b2dnbGVCcmVha3BvaW50QWN0aW9uIj4KKyAgICAgICAgIDwvYWN0aW9uPgorICAgICAgICAgPGFjdGlvbgorICAgICAgICAgICAgbGFiZWw9Ik5vdCB1c2VkIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5SdWxlckVuYWJsZURpc2FibGVCcmVha3BvaW50QWN0aW9uRGVsZWdhdGUiCisgICAgICAgICAgICBtZW51YmFyUGF0aD0iZGVidWciCisgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wucnVsZXJDb250ZXh0TWVudS5lbmFibGVEaXNhYmxlQnJlYWtwb2ludEFjdGlvbiI+CisgICAgICAgICA8L2FjdGlvbj4KKyAgICAgICAgIDxhY3Rpb24KKyAgICAgICAgICAgbGFiZWw9IkJyZWFrcG9pbnQgUHJvcGVydGllcyIKKyAgICAgICAgICAgaGVscENvbnRleHRJZD0iYnJlYWtwb2ludF9wcm9wZXJ0aWVzX2FjdGlvbl9jb250ZXh0IgorICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkuYWN0aW9ucy5KYXZhQnJlYWtwb2ludFByb3BlcnRpZXNSdWxlckFjdGlvbkRlbGVnYXRlIgorICAgICAgICAgICBtZW51YmFyUGF0aD0iZ3JvdXAucHJvcGVydGllcyIKKyAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLnJ1bGVyQ29udGV4dE1lbnUub3BlbkJyZWFwb2ludFByb3BlcnRpZXNBY3Rpb24iPgorICAgICAgICAgPC9hY3Rpb24+CisgICAgICA8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgIDwhLS0gSW50cm9kdWNlIExvY2FsIFZhcmlhYmxlIFJlZmFjdG9yaW5nIC0tPgorCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKwkJPGhhbmRsZXIgCisJCQljbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0VmFyaWFibGVIYW5kbGVyIgorCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5yZWZhY3RvcmluZy5FeHRyYWN0TG9jYWxWYXJpYWJsZSI+CisJCQk8YWN0aXZlV2hlbj4KKwkJCQk8cmVmZXJlbmNlCisJCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisJCQkJPC9yZWZlcmVuY2U+CisJCQk8L2FjdGl2ZVdoZW4+CisJCTwvaGFuZGxlcj4KKwk8L2V4dGVuc2lvbj4KKyAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+CisgICAgICAgICA8bWVudUNvbnRyaWJ1dGlvbgorICAgICAgICAgICAgbG9jYXRpb25VUkk9InBvcHVwOiNUZXh0RWRpdG9yQ29udGV4dD9hZnRlcj1ncm91cC5lZGl0Ij4KKyAgICAgICAgIDxjb21tYW5kIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkucmVmYWN0b3JpbmcuRXh0cmFjdExvY2FsVmFyaWFibGUiCisgICAgICAgICAgICAgICBzdHlsZT0icHVzaCI+CisgICAgICAgICAgICA8dmlzaWJsZVdoZW4gY2hlY2tFbmFibGVkPSJmYWxzZSI+CisgICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorICAgICAgICAgICAgICAgPC9yZWZlcmVuY2U+CisgICAgICAgICAgICA8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPgorICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+ICAKKyAgIDwhLS0gT3BlbiBpbXBsZW1lbnRhdGlvbiAtLT4KKyAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmhhbmRsZXJzIj4KKyAgICAgIDxoYW5kbGVyCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLkF1dGhvcml6YXRpb25EU0xFeGVjdXRhYmxlRXh0ZW5zaW9uRmFjdG9yeTpvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5uYXZpZ2F0aW9uLk9wZW5JbXBsZW1lbnRhdGlvbkhhbmRsZXIiCisgICAgICAgICAgICBjb21tYW5kSWQ9Im9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLk9wZW5JbXBsZW1lbnRhdGlvbkNvbW1hbmQiPgorICAgICAgICAgICAgPGFjdGl2ZVdoZW4+CisJCQkJPHJlZmVyZW5jZQorCQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMLkVkaXRvci5vcGVuZWQiPgorCQkJCTwvcmVmZXJlbmNlPgorCQkJPC9hY3RpdmVXaGVuPgorICAgICAgPC9oYW5kbGVyPgorICAgPC9leHRlbnNpb24+CisgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubWVudXMiPgorICAgICAgIDxtZW51Q29udHJpYnV0aW9uCisgICAgICAgICAgICBsb2NhdGlvblVSST0ibWVudTpuYXZpZ2F0ZT9hZnRlcj1vcGVuLmV4dDQiPgorICAgICAgICAgPGNvbW1hbmQgY29tbWFuZElkPSJvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5PcGVuSW1wbGVtZW50YXRpb25Db21tYW5kIj4KKwkJPHZpc2libGVXaGVuIGNoZWNrRW5hYmxlZD0iZmFsc2UiPgorICAgICAgICAgICAgICA8cmVmZXJlbmNlCisgICAgICAgICAgICAgICAgIGRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuRWRpdG9yLm9wZW5lZCI+CisgICAgICAgICAgICAgIDwvcmVmZXJlbmNlPgorCQk8L3Zpc2libGVXaGVuPgorICAgICAgICAgPC9jb21tYW5kPgorICAgICAgPC9tZW51Q29udHJpYnV0aW9uPgorICAgPC9leHRlbnNpb24+CisKKyAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29tcGFyZS5jb250ZW50Vmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuY29tcGFyZS5jb250ZW50Vmlld2VycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmNvbXBhcmUuSW5qZWN0YWJsZVZpZXdlckNyZWF0b3IiCisgICAgICAgICAgICBleHRlbnNpb25zPSJhdXRob3JpemF0aW9uIj4KKyAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvbXBhcmUuY29udGVudE1lcmdlVmlld2VycyI+CisgICAgPHZpZXdlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuY29tcGFyZS5jb250ZW50TWVyZ2VWaWV3ZXJzIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3Rvcnk6b3JnLmVjbGlwc2UueHRleHQudWkuY29tcGFyZS5JbmplY3RhYmxlVmlld2VyQ3JlYXRvciIKKyAgICAgICAgICAgIGV4dGVuc2lvbnM9ImF1dGhvcml6YXRpb24iIGxhYmVsPSJBdXRob3JpemF0aW9uRFNMIENvbXBhcmUiPgorICAgICA8L3ZpZXdlcj4KKyAgPC9leHRlbnNpb24+CisgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgorICAgIDxwcm92aWRlciBpZD0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyIKKyAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5Om9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5tb2RlbC5YdGV4dERvY3VtZW50UHJvdmlkZXIiCisgICAgICAgICAgICBleHRlbnNpb25zPSJhdXRob3JpemF0aW9uIj4KKyAgICA8L3Byb3ZpZGVyPgorICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkOTgyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvcG9tLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk8L2FydGlmYWN0SWQ+CisgIDxwYXJlbnQ+CisgIAk8Z3JvdXBJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w8L2dyb3VwSWQ+CisgIAk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgCTx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAJPHJlbGF0aXZlUGF0aD4uLjwvcmVsYXRpdmVQYXRoPgorICA8L3BhcmVudD4KKyAgPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFVpTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMVWlNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWFiMWJlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFVpTW9kdWxlLmphdmEKQEAgLTAsMCArMSwzNzUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuRGVmYXVsdFVpTW9kdWxlOworaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOworCisvKioKKyAqIE1hbnVhbCBtb2RpZmljYXRpb25zIGdvIHRvIHtvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTFVpTW9kdWxlfQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEF1dGhvcml6YXRpb25EU0xVaU1vZHVsZSBleHRlbmRzIERlZmF1bHRVaU1vZHVsZSB7CisJCisJcHVibGljIEFic3RyYWN0QXV0aG9yaXphdGlvbkRTTFVpTW9kdWxlKEFic3RyYWN0VUlQbHVnaW4gcGx1Z2luKSB7CisJCXN1cGVyKHBsdWdpbik7CisJfQorCQorCQorCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5JbXBsaWNpdFVpRnJhZ21lbnQKKwlwdWJsaWMgY29tLmdvb2dsZS5pbmplY3QuUHJvdmlkZXI8b3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5JQWxsQ29udGFpbmVyc1N0YXRlPiBwcm92aWRlSUFsbENvbnRhaW5lcnNTdGF0ZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC5BY2Nlc3MuZ2V0SmF2YVByb2plY3RzU3RhdGUoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuSW1wbGljaXRVaUZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuWHRleHRFZGl0b3I+IGJpbmRYdGV4dEVkaXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmVkaXRvci5YYmFzZUVkaXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuSW1wbGljaXRVaUZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IubW9kZWwuWHRleHREb2N1bWVudFByb3ZpZGVyPiBiaW5kWHRleHREb2N1bWVudFByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudWkuZWRpdG9yLlhiYXNlRG9jdW1lbnRQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSVByb3Bvc2FsQ29uZmxpY3RIZWxwZXI+IGJpbmRJUHJvcG9zYWxDb25mbGljdEhlbHBlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkFudGxyUHJvcG9zYWxDb25mbGljdEhlbHBlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUhpZ2hsaWdodGluZ0xleGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQudWkuTGV4ZXJVSUJpbmRpbmdzLkhJR0hMSUdIVElORykpLnRvKG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5wYXJzZXIuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSGlnaGxpZ2h0aW5nVG9rZW5EZWZQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JVG9rZW5EZWZQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLkxleGVyVUlCaW5kaW5ncy5ISUdITElHSFRJTkcpKS50byhvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJUb2tlbkRlZlByb3ZpZGVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUlSZXNvdXJjZURlc2NyaXB0aW9uc0J1aWxkZXJTY29wZShjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcykuYW5ub3RhdGVkV2l0aChjb20uZ29vZ2xlLmluamVjdC5uYW1lLk5hbWVzLm5hbWVkKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VEZXNjcmlwdGlvbnNQcm92aWRlci5OQU1FRF9CVUlMREVSX1NDT1BFKSkudG8ob3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5jbHVzdGVyaW5nLkN1cnJlbnREZXNjcmlwdGlvbnMuUmVzb3VyY2VTZXRBd2FyZS5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5JWHRleHRFZGl0b3JDYWxsYmFjaz4gYmluZElYdGV4dEVkaXRvckNhbGxiYWNrKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuYnVpbGRlci5uYXR1cmUuTmF0dXJlQWRkaW5nRWRpdG9yQ2FsbGJhY2suY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUmVzb3VyY2VEZXNjcmlwdGlvbnNQZXJzaXN0ZWQoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlRGVzY3JpcHRpb25zUHJvdmlkZXIuUEVSU0lTVEVEX0RFU0NSSVBUSU9OUykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuYnVpbGRlclN0YXRlLklCdWlsZGVyU3RhdGUuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuRG9jdW1lbnRCYXNlZERpcnR5UmVzb3VyY2U+IGJpbmREb2N1bWVudEJhc2VkRGlydHlSZXNvdXJjZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuaW1wbC5QZXJzaXN0ZW50RGF0YUF3YXJlRGlydHlSZXNvdXJjZS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLklYdGV4dEJ1aWxkZXJQYXJ0aWNpcGFudD4gYmluZElYdGV4dEJ1aWxkZXJQYXJ0aWNpcGFudCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmJ1aWxkZXIuQnVpbGRlclBhcnRpY2lwYW50LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5nZW5lcmF0b3IuR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3QgYmluZElXb3Jrc3BhY2VSb290VG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmdlbmVyYXRvci5HZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJ1aWxkZXJQcmVmZXJlbmNlU3RvcmVJbml0aWFsaXplcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZCgiYnVpbGRlclByZWZlcmVuY2VJbml0aWFsaXplciIpKS50byhvcmcuZWNsaXBzZS54dGV4dC5idWlsZGVyLnByZWZlcmVuY2VzLkJ1aWxkZXJQcmVmZXJlbmNlQWNjZXNzLkluaXRpYWxpemVyLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IubGFiZWxpbmcuTGFiZWxQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyPiBiaW5kSUxhYmVsUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkubGFiZWxpbmcuQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmxhYmVsaW5nLkxhYmVsUHJvdmlkZXJGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZVJlc291cmNlVUlTZXJ2aWNlTGFiZWxQcm92aWRlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgob3JnLmVjbGlwc2UueHRleHQudWkucmVzb3VyY2UuUmVzb3VyY2VTZXJ2aWNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmNsYXNzKS50byhvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkubGFiZWxpbmcuQXV0aG9yaXphdGlvbkRTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLm91dGxpbmUuT3V0bGluZVRyZWVQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5JT3V0bGluZVRyZWVQcm92aWRlcj4gYmluZElPdXRsaW5lVHJlZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLm91dGxpbmUuQXV0aG9yaXphdGlvbkRTTE91dGxpbmVUcmVlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLm91dGxpbmUuT3V0bGluZVRyZWVQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLklPdXRsaW5lVHJlZVN0cnVjdHVyZVByb3ZpZGVyPiBiaW5kSU91dGxpbmVUcmVlU3RydWN0dXJlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkub3V0bGluZS5BdXRob3JpemF0aW9uRFNMT3V0bGluZVRyZWVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IucXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucXVpY2tmaXguSXNzdWVSZXNvbHV0aW9uUHJvdmlkZXI+IGJpbmRJc3N1ZVJlc29sdXRpb25Qcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5xdWlja2ZpeC5BdXRob3JpemF0aW9uRFNMUXVpY2tmaXhQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuY29udGVudEFzc2lzdC5Db250ZW50QXNzaXN0RnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb250ZW50UHJvcG9zYWxQcm92aWRlcj4gYmluZElDb250ZW50UHJvcG9zYWxQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LkF1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsclVpR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0LkZhY3Rvcnk+IGJpbmRDb250ZW50QXNzaXN0Q29udGV4dCRGYWN0b3J5KCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuUGFyc2VyQmFzZWRDb250ZW50QXNzaXN0Q29udGV4dEZhY3RvcnkuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuYW50bHIuSUNvbnRlbnRBc3Npc3RQYXJzZXI+IGJpbmRJQ29udGVudEFzc2lzdFBhcnNlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLkF1dGhvcml6YXRpb25EU0xQYXJzZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbnRlbnRBc3Npc3RMZXhlclByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuY2xhc3MpLnRvUHJvdmlkZXIob3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyUHJvdmlkZXIuY3JlYXRlKG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyLmNsYXNzKSk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyVWlHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUNvbnRlbnRBc3Npc3RMZXhlcihjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkxleGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQudWkuTGV4ZXJVSUJpbmRpbmdzLkNPTlRFTlRfQVNTSVNUKSkudG8ob3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmdlbmVyYXRvci5yZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUHJlZmVyZW5jZVN0b3JlSW5pdGlhbGl6ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VTdG9yZUluaXRpYWxpemVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXMubmFtZWQoIlJlZmFjdG9yaW5nUHJlZmVyZW5jZXMiKSkudG8ob3JnLmVjbGlwc2UueHRleHQudWkucmVmYWN0b3JpbmcudWkuUmVmYWN0b3JpbmdQcmVmZXJlbmNlcy5Jbml0aWFsaXplci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLnJlZmFjdG9yaW5nLlJlZmFjdG9yRWxlbWVudE5hbWVGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/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+IGJpbmRJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5QYXJ0aWFsQXV0aG9yaXphdGlvbkRTTENvbnRlbnRBc3Npc3RQYXJzZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQudWkuZ2VuZXJhdG9yLmNvbXBhcmUuQ29tcGFyZUZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5jb21wYXJlLklWaWV3ZXJDcmVhdG9yPiBiaW5kSVZpZXdlckNyZWF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC51aS5jb21wYXJlLkRlZmF1bHRWaWV3ZXJDcmVhdG9yLmNsYXNzOworCX0KKworCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTYzZGVjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmd1aWNlLkFic3RyYWN0R3VpY2VBd2FyZUV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5pbnRlcm5hbC5BdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3Mgd2FzIGdlbmVyYXRlZC4gQ3VzdG9taXphdGlvbnMgc2hvdWxkIG9ubHkgaGFwcGVuIGluIGEgbmV3bHkKKyAqIGludHJvZHVjZWQgc3ViY2xhc3MuIAorICovCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTEV4ZWN1dGFibGVFeHRlbnNpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RHdWljZUF3YXJlRXhlY3V0YWJsZUV4dGVuc2lvbkZhY3RvcnkgeworCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEJ1bmRsZSBnZXRCdW5kbGUoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yLmdldEluc3RhbmNlKCkuZ2V0QnVuZGxlKCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBJbmplY3RvciBnZXRJbmplY3RvcigpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xBY3RpdmF0b3IuZ2V0SW5zdGFuY2UoKS5nZXRJbmplY3RvcihBdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yLk9SR19FQ0xJUFNFX09TQlBfWFRFWFRfQVVUSE9SSVpBVElPTkRTTF9BVVRIT1JJWkFUSU9ORFNMKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdEF1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9BYnN0cmFjdEF1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjMTcyMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworCisvKioKKyAqIFJlcHJlc2VudHMgYSBnZW5lcmF0ZWQsIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Ygc3VwZXJjbGFzcyB7QGxpbmsgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkuY29udGVudGFzc2lzdC5YYmFzZVdpdGhBbm5vdGF0aW9uc1Byb3Bvc2FsUHJvdmlkZXJ9LgorICogTWV0aG9kcyBhcmUgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBvbiB0aGUgZmlyc3QgcGFyYW1ldGVyLCBpLmUuLCB5b3UgY2FuIG92ZXJyaWRlIHRoZW0gCisgKiB3aXRoIGEgbW9yZSBjb25jcmV0ZSBzdWJ0eXBlLiAKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnVpLmNvbnRlbnRhc3Npc3QuWGJhc2VXaXRoQW5ub3RhdGlvbnNQcm9wb3NhbFByb3ZpZGVyIHsKKwkJCisJcHVibGljIHZvaWQgY29tcGxldGVBdXRob3JpemF0aW9uTW9kZWxfUGNrZyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZUF1dGhvcml6YXRpb25QYWNrYWdlX05hbWUoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVBdXRob3JpemF0aW9uUGFja2FnZV9JbXBvcnRzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlQXV0aG9yaXphdGlvblBhY2thZ2VfUm9sZXMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVBdXRob3JpemF0aW9uSW1wb3J0X0ltcG9ydGVkTmFtZXNwYWNlKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZV9OYW1lKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZV9Sb2xlRWxlbWVudHMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRW50aXR5X0VudGl0eVJlZihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRW50aXR5X0VudGl0eUF1dGhvcml6ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRW50aXR5X0VudGl0eUZlYXR1cmVzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZUJlYW5fQmVhblJlZihFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmVhbl9CZWFuQXV0aG9yaXplZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVCZWFuX0JlYW5GZWF0dXJlcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVEdG9fRHRvUmVmKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVEdG9fRHRvQXV0aG9yaXplZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVEdG9fRHRvRmVhdHVyZXMoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmxpcEFsbFVzZXJUYXNrc19BdXRob3JpemVkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZUJsaXBVc2VyVGFza19Vc2VyVGFzayhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmxpcFVzZXJUYXNrX0F1dGhvcml6ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmxpcFByb2Nlc3NfUHJvY2VzcyhFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmxpcFByb2Nlc3NfUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVCbGlwUHJvY2Vzc19BbGxVc2VyVGFza3MoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmxpcFByb2Nlc3NfVXNlclRhc2tzKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZUVudGl0eUF0dHJpYnV0ZV9FbnRpdHlBdHRyaUNvbChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRW50aXR5QXR0cmlidXRlX0VudGl0eUF0dHJpVW5hdXRob3JpemVkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZUVudGl0eVJlZmVyZW5jZV9FbnRpdHlBdHRyaUNvbChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRW50aXR5UmVmZXJlbmNlX0VudGl0eUF0dHJpVW5hdXRob3JpemVkKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWNvbXBsZXRlUnVsZUNhbGwoKChSdWxlQ2FsbClhc3NpZ25tZW50LmdldFRlcm1pbmFsKCkpLCBjb250ZXh0LCBhY2NlcHRvcik7CisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlUm9sZUJlYW5BdHRyaWJ1dGVfQmVhbkF0dHJpQ29sKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVCZWFuQXR0cmlidXRlX0JlYW5BdHRyaVVuYXV0aG9yaXplZChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQljb21wbGV0ZVJ1bGVDYWxsKCgoUnVsZUNhbGwpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVCZWFuUmVmZXJlbmNlX0JlYW5BdHRyaUNvbChFT2JqZWN0IG1vZGVsLCBBc3NpZ25tZW50IGFzc2lnbm1lbnQsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQlsb29rdXBDcm9zc1JlZmVyZW5jZSgoKENyb3NzUmVmZXJlbmNlKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlQmVhblJlZmVyZW5jZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRHRvQXR0cmlidXRlX0R0b0F0dHJpQ29sKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVEdG9BdHRyaWJ1dGVfRHRvQXR0cmlVbmF1dGhvcml6ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVSb2xlRHRvUmVmZXJlbmNlX0R0b0F0dHJpQ29sKEVPYmplY3QgbW9kZWwsIEFzc2lnbm1lbnQgYXNzaWdubWVudCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCWxvb2t1cENyb3NzUmVmZXJlbmNlKCgoQ3Jvc3NSZWZlcmVuY2UpYXNzaWdubWVudC5nZXRUZXJtaW5hbCgpKSwgY29udGV4dCwgYWNjZXB0b3IpOworCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZVJvbGVEdG9SZWZlcmVuY2VfRHRvQXR0cmlVbmF1dGhvcml6ZWQoRU9iamVjdCBtb2RlbCwgQXNzaWdubWVudCBhc3NpZ25tZW50LCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJY29tcGxldGVSdWxlQ2FsbCgoKFJ1bGVDYWxsKWFzc2lnbm1lbnQuZ2V0VGVybWluYWwoKSksIGNvbnRleHQsIGFjY2VwdG9yKTsKKwl9CisgICAgCisJcHVibGljIHZvaWQgY29tcGxldGVfQXV0aG9yaXphdGlvbk1vZGVsKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfQXV0aG9yaXphdGlvblBhY2thZ2UoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9BdXRob3JpemF0aW9uSW1wb3J0KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVFbGVtZW50KEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUVudGl0eShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVCZWFuKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUR0byhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVCbGlwQWxsVXNlclRhc2tzKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUJsaXBVc2VyVGFzayhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVCbGlwUHJvY2VzcyhFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVFbnRpdHlGZWF0dXJlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUVudGl0eUF0dHJpYnV0ZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVFbnRpdHlSZWZlcmVuY2UoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Sb2xlQmVhbkZlYXR1cmUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Sb2xlQmVhbkF0dHJpYnV0ZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVCZWFuUmVmZXJlbmNlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUR0b0ZlYXR1cmUoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Sb2xlRHRvQXR0cmlidXRlKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZUR0b1JlZmVyZW5jZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVFbnVtKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUm9sZVByb3BlcnR5RW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1JvbGVCbGlwUHJvY2Vzc0VudW0oRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9Sb2xlQmxpcFVzZXJUYXNrRW51bShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX0F1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKKwl9CisJcHVibGljIHZvaWQgY29tcGxldGVfUXVhbGlmaWVkTmFtZShFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorCXB1YmxpYyB2b2lkIGNvbXBsZXRlX1ZhbGlkSUQoRU9iamVjdCBtb2RlbCwgUnVsZUNhbGwgcnVsZUNhbGwsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworCQkvLyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZQorCX0KKwlwdWJsaWMgdm9pZCBjb21wbGV0ZV9UUkFOU0xBVEFCTEVJRChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZmE3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9BdXRob3JpemF0aW9uRFNMUGFyc2VyLmphdmEKQEAgLTAsMCArMSw1MzkgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuUmVjb2duaXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuQWJzdHJhY3RFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLkFic3RyYWN0Q29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5Gb2xsb3dFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFBhcnNlciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFBhcnNlciB7CisJCisJQEluamVjdAorCXByaXZhdGUgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlwcml2YXRlIE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4gbmFtZU1hcHBpbmdzOworCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIgY3JlYXRlUGFyc2VyKCkgeworCQlvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIgcmVzdWx0ID0gbmV3IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihudWxsKTsKKwkJcmVzdWx0LnNldEdyYW1tYXJBY2Nlc3MoZ3JhbW1hckFjY2Vzcyk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBTdHJpbmcgZ2V0UnVsZU5hbWUoQWJzdHJhY3RFbGVtZW50IGVsZW1lbnQpIHsKKwkJaWYgKG5hbWVNYXBwaW5ncyA9PSBudWxsKSB7CisJCQluYW1lTWFwcGluZ3MgPSBuZXcgSGFzaE1hcDxBYnN0cmFjdEVsZW1lbnQsIFN0cmluZz4oKSB7CisJCQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisJCQkJeworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Sb2xlRHRvRmVhdHVyZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc181XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc181XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc182XzEoKSwgInJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc182XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8wXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMF8wXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMV8xXzNfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8xXzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSwgInJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMigpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zKCksICJydWxlX19YQ2FzZVBhcnRfX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfM18xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0FsdGVybmF0aXZlc18zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFsdGVybmF0aXZlc180XzEoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FsdGVybmF0aXZlc180XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMygpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc18zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMCgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xXzFfMSgpLCAicnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzIoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzFfMF8zKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xXzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpLCAicnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCksICJydWxlX19Sb2xlUHJvcGVydHlFbnVtX19BbHRlcm5hdGl2ZXMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Sb2xlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRHcm91cF80KCksICJydWxlX19Sb2xlRW50aXR5X19Hcm91cF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEdyb3VwXzQoKSwgInJ1bGVfX1JvbGVCZWFuX19Hcm91cF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUR0b19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldEdyb3VwXzQoKSwgInJ1bGVfX1JvbGVEdG9fX0dyb3VwXzRfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0R3JvdXBfNCgpLCAicnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUJlYW5SZWZlcmVuY2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fUm9sZUR0b0F0dHJpYnV0ZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzYoKSwgInJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCksICJydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcm91cF8xKCksICJydWxlX19PcENvbXBhcmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzVfMV8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF81XzFfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNV8xXzBfMCgpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNV8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNigpLCAicnVsZV9fT3BPdGhlcl9fR3JvdXBfNl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNl8xXzAoKSwgInJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMF8wKCksICJydWxlX19PcE90aGVyX19Hcm91cF82XzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCksICJydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hDYXN0ZWRFeHByZXNzaW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fR3JvdXBfMV8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzAoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8xXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzFfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMygpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzFfM18xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwXzFfMV8zXzFfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YQ2xvc3VyZV9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSwgInJ1bGVfX1hDbG9zdXJlX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMSgpLCAicnVsZV9fWENsb3N1cmVfX0dyb3VwXzFfMF8wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwXzBfMF8xKCksICJydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF8wXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXBfMF8wXzFfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfMF8wXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF82KCksICJydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF82X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzBfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8wXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMV8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzFfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfMl8xXzBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzUoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF81X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwXzIoKSwgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSwgInJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfM18wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF8zX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfM18xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfNygpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwXzdfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF83XzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF83XzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMF8wKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfMl8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8xXzIoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzMoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF8zXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMV8xKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwXzNfMV8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMygpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfM19fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18yKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF8zXzJfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzQoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwXzRfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwXzRfMV8xKCksICJydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfNF8xXzFfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YTnVtYmVyTGl0ZXJhbF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFN0cmluZ0xpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFJldHVybkV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMF8xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18wXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF8zXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMCgpLCAicnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF8wXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEdyb3VwXzFfMSgpLCAicnVsZV9fTnVtYmVyX19Hcm91cF8xXzFfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1N0YXRpY1F1YWxpZmllcl9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSwgInJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0dyb3VwXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wXzFfMCgpLCAicnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fR3JvdXBfMF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSwgInJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwXzBfMV8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV8yKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80KCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfMV80X18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8wXzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMF8wX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMV80XzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzFfNF8yXzIoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF8xXzRfMl8yX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzJfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Hcm91cF9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpLCAicnVsZV9fSnZtVHlwZVBhcmFtZXRlcl9fR3JvdXBfMV9fMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSwgInJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsQWNjZXNzKCkuZ2V0UGNrZ0Fzc2lnbm1lbnQoKSwgInJ1bGVfX0F1dGhvcml6YXRpb25Nb2RlbF9fUGNrZ0Fzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yKCksICJydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fTmFtZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNBc3NpZ25tZW50XzQoKSwgInJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0Um9sZXNBc3NpZ25tZW50XzUoKSwgInJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Sb2xlc0Fzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0QWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19Sb2xlX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVBY2Nlc3MoKS5nZXRSb2xlRWxlbWVudHNBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1JvbGVfX1JvbGVFbGVtZW50c0Fzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5UmVmQXNzaWdubWVudF8yKCksICJydWxlX19Sb2xlRW50aXR5X19FbnRpdHlSZWZBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1JvbGVFbnRpdHlfX0VudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEoKSwgInJ1bGVfX1JvbGVFbnRpdHlfX0VudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuUmVmQXNzaWdubWVudF8yKCksICJydWxlX19Sb2xlQmVhbl9fQmVhblJlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5BdXRob3JpemVkQXNzaWdubWVudF8zKCksICJydWxlX19Sb2xlQmVhbl9fQmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpLCAicnVsZV9fUm9sZUJlYW5fX0JlYW5GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9SZWZBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1JvbGVEdG9fX0R0b1JlZkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMygpLCAicnVsZV9fUm9sZUR0b19fRHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpLCAicnVsZV9fUm9sZUR0b19fRHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19BdXRob3JpemVkQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRVc2VyVGFza0Fzc2lnbm1lbnRfMigpLCAicnVsZV9fUm9sZUJsaXBVc2VyVGFza19fVXNlclRhc2tBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldEF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0F1dGhvcml6ZWRBc3NpZ25tZW50XzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0Fzc2lnbm1lbnRfMigpLCAicnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Qcm9jZXNzQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFByb2Nlc3NTdGFydEF1dGhvcml6ZWRBc3NpZ25tZW50XzRfMSgpLCAicnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Qcm9jZXNzU3RhcnRBdXRob3JpemVkQXNzaWdubWVudF80XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0QWxsVXNlclRhc2tzQXNzaWdubWVudF81KCksICJydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0FsbFVzZXJUYXNrc0Fzc2lnbm1lbnRfNSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRVc2VyVGFza3NBc3NpZ25tZW50XzYoKSwgInJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fVXNlclRhc2tzQXNzaWdubWVudF82Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSgpLCAicnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fRW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCksICJydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19FbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0VudGl0eUF0dHJpQ29sQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpLCAicnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19CZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19CZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19CZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19CZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpQ29sQXNzaWdubWVudF8xKCksICJydWxlX19Sb2xlRHRvQXR0cmlidXRlX19EdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlQWNjZXNzKCkuZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0R0b0F0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXREdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSgpLCAicnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fRHRvQXR0cmlDb2xBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCksICJydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19EdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlQXNzaWdubWVudF8yKCksICJydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25fX0VsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8xXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpLCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCksICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fRWxlbWVudHNBc3NpZ25tZW50XzBfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8wXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCksICJydWxlX19YQXNzaWdubWVudF9fVmFsdWVBc3NpZ25tZW50XzBfMyIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSgpLCAicnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hBc3NpZ25tZW50X19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3JFeHByZXNzaW9uX19GZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQW5kRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19UeXBlQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSwgInJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCksICJydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEoKSwgInJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19SaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpLCAicnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzBfMSgpLCAicnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19GZWF0dXJlQXNzaWdubWVudF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCkuZ2V0T3BlcmFuZEFzc2lnbm1lbnRfMF8yKCksICJydWxlX19YVW5hcnlPcGVyYXRpb25fX09wZXJhbmRBc3NpZ25tZW50XzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX1R5cGVBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMF8xKCksICJydWxlX19YUG9zdGZpeE9wZXJhdGlvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0V4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8wXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xXzBfMSgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19WYWx1ZUFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TnVsbFNhZmVBc3NpZ25tZW50XzFfMV8wXzBfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRFeHBsaWNpdFN0YXRpY0Fzc2lnbm1lbnRfMV8xXzBfMF8xXzIoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzFfMV8yXzEoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzFfMV8yKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0ZlYXR1cmVBc3NpZ25tZW50XzFfMV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfMV8xXzNfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19FeHBsaWNpdE9wZXJhdGlvbkNhbGxBc3NpZ25tZW50XzFfMV8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzNfMV8wKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCgpLCAicnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19NZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzFfMV8xKCksICJydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0TWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQoKSwgInJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fTWVtYmVyQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8xXzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YU2V0TGl0ZXJhbF9fRWxlbWVudHNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8zXzFfMSgpLCAicnVsZV9fWFNldExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfM18wKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YTGlzdExpdGVyYWxfX0VsZW1lbnRzQXNzaWdubWVudF8zXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCgpLCAicnVsZV9fWENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldERlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMV8wXzBfMV8xKCksICJydWxlX19YQ2xvc3VyZV9fRGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8xXzBfMF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hDbG9zdXJlX19FeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMV8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YQ2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEV4cHJlc3Npb25zQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXREZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnNBc3NpZ25tZW50XzBfMF8xXzAoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzQXNzaWdubWVudF8wXzBfMV8xXzEoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0RlY2xhcmVkRm9ybWFsUGFyYW1ldGVyc0Fzc2lnbm1lbnRfMF8wXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRFeHBsaWNpdFN5bnRheEFzc2lnbm1lbnRfMF8wXzIoKSwgInJ1bGVfX1hTaG9ydENsb3N1cmVfX0V4cGxpY2l0U3ludGF4QXNzaWdubWVudF8wXzBfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWFNob3J0Q2xvc3VyZV9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SWZBc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0lmQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF81KCksICJydWxlX19YSWZFeHByZXNzaW9uX19UaGVuQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFbHNlQXNzaWdubWVudF82XzEoKSwgInJ1bGVfX1hJZkV4cHJlc3Npb25fX0Vsc2VBc3NpZ25tZW50XzZfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0RlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzJfMF8wXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldFN3aXRjaEFzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Td2l0Y2hBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMl8xXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U3dpdGNoQXNzaWdubWVudF8yXzFfMSgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX1N3aXRjaEFzc2lnbm1lbnRfMl8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRDYXNlc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0Nhc2VzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVmYXVsdEFzc2lnbm1lbnRfNV8yKCksICJydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fRGVmYXVsdEFzc2lnbm1lbnRfNV8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldFR5cGVHdWFyZEFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UeXBlR3VhcmRBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0Q2FzZUFzc2lnbm1lbnRfMl8xKCksICJydWxlX19YQ2FzZVBhcnRfX0Nhc2VBc3NpZ25tZW50XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRUaGVuQXNzaWdubWVudF8zXzBfMSgpLCAicnVsZV9fWENhc2VQYXJ0X19UaGVuQXNzaWdubWVudF8zXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRGYWxsVGhyb3VnaEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMoKSwgInJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMF8wXzMiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Rm9yRXhwcmVzc2lvbkFzc2lnbm1lbnRfMSgpLCAicnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Gb3JFeHByZXNzaW9uQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zKCksICJydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0VhY2hFeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5pdEV4cHJlc3Npb25zQXNzaWdubWVudF8zXzAoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEluaXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfM18xXzEoKSwgInJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Jbml0RXhwcmVzc2lvbnNBc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RXhwcmVzc2lvbkFzc2lnbm1lbnRfNSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzUiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRVcGRhdGVFeHByZXNzaW9uc0Fzc2lnbm1lbnRfN18wKCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fVXBkYXRlRXhwcmVzc2lvbnNBc3NpZ25tZW50XzdfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFVwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSgpLCAicnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX1VwZGF0ZUV4cHJlc3Npb25zQXNzaWdubWVudF83XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEVhY2hFeHByZXNzaW9uQXNzaWdubWVudF85KCksICJydWxlX19YQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9fRWFjaEV4cHJlc3Npb25Bc3NpZ25tZW50XzkiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldFByZWRpY2F0ZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRCb2R5QXNzaWdubWVudF81KCksICJydWxlX19YV2hpbGVFeHByZXNzaW9uX19Cb2R5QXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEJvZHlBc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fQm9keUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRQcmVkaWNhdGVBc3NpZ25tZW50XzUoKSwgInJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fUHJlZGljYXRlQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wKCksICJydWxlX19YQmxvY2tFeHByZXNzaW9uX19FeHByZXNzaW9uc0Fzc2lnbm1lbnRfMl8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Xcml0ZWFibGVBc3NpZ25tZW50XzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzJfMF8wXzAoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19UeXBlQXNzaWdubWVudF8yXzBfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8wXzBfMSgpLCAicnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX05hbWVBc3NpZ25tZW50XzJfMF8wXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSwgInJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19OYW1lQXNzaWdubWVudF8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSaWdodEFzc2lnbm1lbnRfM18xKCksICJydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fUmlnaHRBc3NpZ25tZW50XzNfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX1BhcmFtZXRlclR5cGVBc3NpZ25tZW50XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRQYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19QYXJhbWV0ZXJUeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCksICJydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19UeXBlQXJndW1lbnRzQXNzaWdubWVudF8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0VHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wKCksICJydWxlX19YRmVhdHVyZUNhbGxfX0V4cGxpY2l0T3BlcmF0aW9uQ2FsbEFzc2lnbm1lbnRfM18wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF8zXzFfMCgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAoKSwgInJ1bGVfX1hGZWF0dXJlQ2FsbF9fRmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8xXzFfMSgpLCAicnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzFfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80KCksICJydWxlX19YRmVhdHVyZUNhbGxfX0ZlYXR1cmVDYWxsQXJndW1lbnRzQXNzaWdubWVudF80Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRDb25zdHJ1Y3RvckFzc2lnbm1lbnRfMigpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQ29uc3RydWN0b3JBc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFR5cGVBcmd1bWVudHNBc3NpZ25tZW50XzNfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRUeXBlQXJndW1lbnRzQXNzaWdubWVudF8zXzJfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fVHlwZUFyZ3VtZW50c0Fzc2lnbm1lbnRfM18yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0V4cGxpY2l0Q29uc3RydWN0b3JDYWxsQXNzaWdubWVudF80XzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSwgInJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzFfMCgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8xXzFfMSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF80XzFfMV8xXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNSgpLCAicnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fQXJndW1lbnRzQXNzaWdubWVudF81Iik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YQm9vbGVhbkxpdGVyYWxfX0lzVHJ1ZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hOdW1iZXJMaXRlcmFsX19WYWx1ZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8xKCksICJydWxlX19YU3RyaW5nTGl0ZXJhbF9fVmFsdWVBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMygpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19UeXBlQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEFycmF5RGltZW5zaW9uc0Fzc2lnbm1lbnRfNCgpLCAicnVsZV9fWFR5cGVMaXRlcmFsX19BcnJheURpbWVuc2lvbnNBc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0V4cHJlc3Npb25Bc3NpZ25tZW50XzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF8yKCksICJydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fRXhwcmVzc2lvbkFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8yIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0Q2F0Y2hDbGF1c2VzQXNzaWdubWVudF8zXzBfMCgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0NhdGNoQ2xhdXNlc0Fzc2lnbm1lbnRfM18wXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGaW5hbGx5RXhwcmVzc2lvbkFzc2lnbm1lbnRfM18wXzFfMSgpLCAicnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0ZpbmFsbHlFeHByZXNzaW9uQXNzaWdubWVudF8zXzBfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xKCksICJydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fRmluYWxseUV4cHJlc3Npb25Bc3NpZ25tZW50XzNfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1Bc3NpZ25tZW50XzEoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19QYXJhbUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25Bc3NpZ25tZW50XzMoKSwgInJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19FeHByZXNzaW9uQXNzaWdubWVudF8zIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZUFjY2VzcygpLmdldERlY2xhcmVkUGFyYW1Bc3NpZ25tZW50XzIoKSwgInJ1bGVfX1hDYXRjaENsYXVzZV9fRGVjbGFyZWRQYXJhbUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uQXNzaWdubWVudF80KCksICJydWxlX19YQ2F0Y2hDbGF1c2VfX0V4cHJlc3Npb25Bc3NpZ25tZW50XzQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldFBhcmFtVHlwZXNBc3NpZ25tZW50XzBfMV8wKCksICJydWxlX19YRnVuY3Rpb25UeXBlUmVmX19QYXJhbVR5cGVzQXNzaWdubWVudF8wXzFfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSgpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUGFyYW1UeXBlc0Fzc2lnbm1lbnRfMF8xXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUFzc2lnbm1lbnRfMigpLCAicnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fUmV0dXJuVHlwZUFzc2lnbm1lbnRfMiIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFR5cGVBc3NpZ25tZW50XzAoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzQXNzaWdubWVudF8xXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV8yXzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Bcmd1bWVudHNBc3NpZ25tZW50XzFfMl8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV80XzEoKSwgInJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19UeXBlQXNzaWdubWVudF8xXzRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSgpLCAicnVsZV9fSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfX0FyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfMV80XzJfMl8xKCksICJydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fQXJndW1lbnRzQXNzaWdubWVudF8xXzRfMl8yXzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8wKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzBfMCIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMl8wXzEoKSwgInJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fQ29uc3RyYWludHNBc3NpZ25tZW50XzJfMF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldENvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMCgpLCAicnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMl8xXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNBc3NpZ25tZW50XzJfMV8xKCksICJydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0NvbnN0cmFpbnRzQXNzaWdubWVudF8yXzFfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtVXBwZXJCb3VuZF9fVHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRUeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xKCksICJydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEoKSwgInJ1bGVfX0p2bUxvd2VyQm91bmRfX1R5cGVSZWZlcmVuY2VBc3NpZ25tZW50XzEiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0VHlwZVJlZmVyZW5jZUFzc2lnbm1lbnRfMSgpLCAicnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19UeXBlUmVmZXJlbmNlQXNzaWdubWVudF8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19OYW1lQXNzaWdubWVudF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xKCksICJydWxlX19Kdm1UeXBlUGFyYW1ldGVyX19Db25zdHJhaW50c0Fzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0RGVjbGFyYXRpb25zQXNzaWdubWVudCgpLCAicnVsZV9fWEltcG9ydFNlY3Rpb25fX0ltcG9ydERlY2xhcmF0aW9uc0Fzc2lnbm1lbnQiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U3RhdGljQXNzaWdubWVudF8xXzBfMCgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19TdGF0aWNBc3NpZ25tZW50XzFfMF8wIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEV4dGVuc2lvbkFzc2lnbm1lbnRfMV8wXzEoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fRXh0ZW5zaW9uQXNzaWdubWVudF8xXzBfMSIpOworCQkJCQlwdXQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMF8yKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8wXzIiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fV2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAiKTsKKwkJCQkJcHV0KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TWVtYmVyTmFtZUFzc2lnbm1lbnRfMV8wXzNfMSgpLCAicnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xKCksICJydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkVHlwZUFzc2lnbm1lbnRfMV8xIik7CisJCQkJCXB1dChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSwgInJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMiIpOworCQkJCX0KKwkJCX07CisJCX0KKwkJcmV0dXJuIG5hbWVNYXBwaW5ncy5nZXQoZWxlbWVudCk7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBDb2xsZWN0aW9uPEZvbGxvd0VsZW1lbnQ+IGdldEZvbGxvd0VsZW1lbnRzKEFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyIHBhcnNlcikgeworCQl0cnkgeworCQkJb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWwuSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMUGFyc2VyIHR5cGVkUGFyc2VyID0gKG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcikgcGFyc2VyOworCQkJdHlwZWRQYXJzZXIuZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsKCk7CisJCQlyZXR1cm4gdHlwZWRQYXJzZXIuZ2V0Rm9sbG93RWxlbWVudHMoKTsKKwkJfSBjYXRjaChSZWNvZ25pdGlvbkV4Y2VwdGlvbiBleCkgeworCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworCQl9CQkKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIFN0cmluZ1tdIGdldEluaXRpYWxIaWRkZW5Ub2tlbnMoKSB7CisJCXJldHVybiBuZXcgU3RyaW5nW10geyAiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIiB9OworCX0KKwkKKwlwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ3JhbW1hckFjY2VzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisJCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbEF1dGhvcml6YXRpb25EU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9QYXJ0aWFsQXV0aG9yaXphdGlvbkRTTENvbnRlbnRBc3Npc3RQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTE2ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvUGFydGlhbEF1dGhvcml6YXRpb25EU0xDb250ZW50QXNzaXN0UGFyc2VyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuY29udGVudGFzc2lzdC5hbnRscjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkFic3RyYWN0UnVsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5jb2RldGVtcGxhdGVzLnVpLnBhcnRpYWxFZGl0aW5nLklQYXJ0aWFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5Gb2xsb3dFbGVtZW50OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsLkFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnV0aWwuUG9seW1vcnBoaWNEaXNwYXRjaGVyOworCisvKioKKyAqIEBhdXRob3IgU2ViYXN0aWFuIFphcm5la293IC0gSW5pdGlhbCBjb250cmlidXRpb24gYW5kIEFQSQorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIFBhcnRpYWxBdXRob3JpemF0aW9uRFNMQ29udGVudEFzc2lzdFBhcnNlciBleHRlbmRzIEF1dGhvcml6YXRpb25EU0xQYXJzZXIgaW1wbGVtZW50cyBJUGFydGlhbENvbnRlbnRBc3Npc3RQYXJzZXIgeworCisJcHJpdmF0ZSBBYnN0cmFjdFJ1bGUgcnVsZTsKKworCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3IoQWJzdHJhY3RSdWxlIHJ1bGUpIHsKKwkJdGhpcy5ydWxlID0gcnVsZTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4gZ2V0Rm9sbG93RWxlbWVudHMoQWJzdHJhY3RJbnRlcm5hbENvbnRlbnRBc3Npc3RQYXJzZXIgcGFyc2VyKSB7CisJCWlmIChydWxlID09IG51bGwgfHwgcnVsZS5lSXNQcm94eSgpKQorCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworCQlTdHJpbmcgbWV0aG9kTmFtZSA9ICJlbnRyeVJ1bGUiICsgcnVsZS5nZXROYW1lKCk7CisJCVBvbHltb3JwaGljRGlzcGF0Y2hlcjxDb2xsZWN0aW9uPEZvbGxvd0VsZW1lbnQ+PiBkaXNwYXRjaGVyID0gCisJCQluZXcgUG9seW1vcnBoaWNEaXNwYXRjaGVyPENvbGxlY3Rpb248Rm9sbG93RWxlbWVudD4+KG1ldGhvZE5hbWUsIDAsIDAsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocGFyc2VyKSk7CisJCWRpc3BhdGNoZXIuaW52b2tlKCk7CisJCXJldHVybiBwYXJzZXIuZ2V0Rm9sbG93RWxlbWVudHMoKTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZjNzA1OAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nCkBAIC0wLDAgKzEsMTAwMTUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK2dyYW1tYXIgSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMOworCitvcHRpb25zIHsKKwlzdXBlckNsYXNzPUFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyOworCWJhY2t0cmFjaz10cnVlOworCQorfQorCitAbGV4ZXI6OmhlYWRlciB7CitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKK30KKworQHBhcnNlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5ERkE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworIAorIAlwcml2YXRlIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgCQorICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJBY2Nlc3MoQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgIAl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgR3JhbW1hciBnZXRHcmFtbWFyKCkgeworICAgIAlyZXR1cm4gZ3JhbW1hckFjY2Vzcy5nZXRHcmFtbWFyKCk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVGb3JUb2tlbk5hbWUoU3RyaW5nIHRva2VuTmFtZSkgeworICAgIAlyZXR1cm4gdG9rZW5OYW1lOworICAgIH0KKworfQorCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUF1dGhvcml6YXRpb25Nb2RlbAorZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uTW9kZWxSdWxlKCkpOyB9CisJIHJ1bGVBdXRob3JpemF0aW9uTW9kZWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uTW9kZWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQXV0aG9yaXphdGlvbk1vZGVsCitydWxlQXV0aG9yaXphdGlvbk1vZGVsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbEFjY2VzcygpLmdldFBja2dBc3NpZ25tZW50KCkpOyB9CisocnVsZV9fQXV0aG9yaXphdGlvbk1vZGVsX19QY2tnQXNzaWdubWVudCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uTW9kZWxBY2Nlc3MoKS5nZXRQY2tnQXNzaWdubWVudCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlCitlbnRyeVJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VSdWxlKCkpOyB9CisJIHJ1bGVBdXRob3JpemF0aW9uUGFja2FnZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEF1dGhvcml6YXRpb25QYWNrYWdlCitydWxlQXV0aG9yaXphdGlvblBhY2thZ2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydAorZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydFJ1bGUoKSk7IH0KKwkgcnVsZUF1dGhvcml6YXRpb25JbXBvcnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEF1dGhvcml6YXRpb25JbXBvcnQKK3J1bGVBdXRob3JpemF0aW9uSW1wb3J0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGUKK2VudHJ5UnVsZVJvbGUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpOyB9CisJIHJ1bGVSb2xlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlCitydWxlUm9sZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlRWxlbWVudAorZW50cnlSdWxlUm9sZUVsZW1lbnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50UnVsZSgpKTsgfQorCSBydWxlUm9sZUVsZW1lbnQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRWxlbWVudAorcnVsZVJvbGVFbGVtZW50CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVFbnRpdHkKK2VudHJ5UnVsZVJvbGVFbnRpdHkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSdWxlKCkpOyB9CisJIHJ1bGVSb2xlRW50aXR5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRW50aXR5CitydWxlUm9sZUVudGl0eQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmVhbgorZW50cnlSdWxlUm9sZUJlYW4gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUnVsZSgpKTsgfQorCSBydWxlUm9sZUJlYW4KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmVhbgorcnVsZVJvbGVCZWFuCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVEdG8KK2VudHJ5UnVsZVJvbGVEdG8gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SdWxlKCkpOyB9CisJIHJ1bGVSb2xlRHRvCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRHRvCitydWxlUm9sZUR0bworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlRHRvX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcworZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzUnVsZSgpKTsgfQorCSBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmxpcEFsbFVzZXJUYXNrcworcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVCbGlwVXNlclRhc2sKK2VudHJ5UnVsZVJvbGVCbGlwVXNlclRhc2sgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tSdWxlKCkpOyB9CisJIHJ1bGVSb2xlQmxpcFVzZXJUYXNrCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmxpcFVzZXJUYXNrCitydWxlUm9sZUJsaXBVc2VyVGFzaworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmxpcFByb2Nlc3MKK2VudHJ5UnVsZVJvbGVCbGlwUHJvY2VzcyAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsgfQorCSBydWxlUm9sZUJsaXBQcm9jZXNzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVCbGlwUHJvY2VzcworcnVsZVJvbGVCbGlwUHJvY2VzcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlRW50aXR5RmVhdHVyZQorZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlUnVsZSgpKTsgfQorCSBydWxlUm9sZUVudGl0eUZlYXR1cmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRW50aXR5RmVhdHVyZQorcnVsZVJvbGVFbnRpdHlGZWF0dXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUKK2VudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVSdWxlKCkpOyB9CisJIHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRW50aXR5QXR0cmlidXRlCitydWxlUm9sZUVudGl0eUF0dHJpYnV0ZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlCitlbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUVudGl0eVJlZmVyZW5jZQorcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUJlYW5GZWF0dXJlCitlbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSk7IH0KKwkgcnVsZVJvbGVCZWFuRmVhdHVyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmVhbkZlYXR1cmUKK3J1bGVSb2xlQmVhbkZlYXR1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUJlYW5BdHRyaWJ1dGUKK2VudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZVJ1bGUoKSk7IH0KKwkgcnVsZVJvbGVCZWFuQXR0cmlidXRlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUJlYW5BdHRyaWJ1dGUKK3J1bGVSb2xlQmVhbkF0dHJpYnV0ZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZQorZW50cnlSdWxlUm9sZUJlYW5SZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBydWxlUm9sZUJlYW5SZWZlcmVuY2UKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmVhblJlZmVyZW5jZQorcnVsZVJvbGVCZWFuUmVmZXJlbmNlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVEdG9GZWF0dXJlCitlbnRyeVJ1bGVSb2xlRHRvRmVhdHVyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVSdWxlKCkpOyB9CisJIHJ1bGVSb2xlRHRvRmVhdHVyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVEdG9GZWF0dXJlCitydWxlUm9sZUR0b0ZlYXR1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19Sb2xlRHRvRmVhdHVyZV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUR0b0F0dHJpYnV0ZQorZW50cnlSdWxlUm9sZUR0b0F0dHJpYnV0ZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZVJ1bGUoKSk7IH0KKwkgcnVsZVJvbGVEdG9BdHRyaWJ1dGUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVEdG9BdHRyaWJ1dGUKK3J1bGVSb2xlRHRvQXR0cmlidXRlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UKK2VudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VSdWxlKCkpOyB9CisJIHJ1bGVSb2xlRHRvUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRHRvUmVmZXJlbmNlCitydWxlUm9sZUR0b1JlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorZW50cnlSdWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUnVsZSgpKTsgfQorCSBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVF1YWxpZmllZE5hbWUKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWUgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVSdWxlKCkpOyB9CisJIHJ1bGVRdWFsaWZpZWROYW1lCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lCitydWxlUXVhbGlmaWVkTmFtZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVWYWxpZElECitlbnRyeVJ1bGVWYWxpZElEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEUnVsZSgpKTsgfQorCSBydWxlVmFsaWRJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVmFsaWRJRAorcnVsZVZhbGlkSUQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorCVJVTEVfSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IH0KKwkgcnVsZVRSQU5TTEFUQUJMRUlECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVFJBTlNMQVRBQkxFSUQKK3J1bGVUUkFOU0xBVEFCTEVJRAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorCVJVTEVfSUQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uCitlbnRyeVJ1bGVYQW5ub3RhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uCitydWxlWEFubm90YXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCitlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IH0KKwkgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdAorZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7IH0KKwkgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKK3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCitlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOyB9CisJIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCitydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KK2VudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFubm90YXRpb25PckV4cHJlc3Npb24KK3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXhwcmVzc2lvbgorZW50cnlSdWxlWEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRXhwcmVzc2lvbgorcnVsZVhFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgfQorCXJ1bGVYQXNzaWdubWVudAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBc3NpZ25tZW50CitlbnRyeVJ1bGVYQXNzaWdubWVudCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyB9CisJIHJ1bGVYQXNzaWdubWVudAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBc3NpZ25tZW50CitydWxlWEFzc2lnbm1lbnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24KK2VudHJ5UnVsZU9wU2luZ2xlQXNzaWduIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IH0KKwkgcnVsZU9wU2luZ2xlQXNzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BTaW5nbGVBc3NpZ24KK3J1bGVPcFNpbmdsZUFzc2lnbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyB9CisKKwknPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aUFzc2lnbgorZW50cnlSdWxlT3BNdWx0aUFzc2lnbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IH0KKwkgcnVsZU9wTXVsdGlBc3NpZ24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wTXVsdGlBc3NpZ24KK3J1bGVPcE11bHRpQXNzaWduCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhPckV4cHJlc3Npb24KK2VudHJ5UnVsZVhPckV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYT3JFeHByZXNzaW9uCitydWxlWE9yRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVPcE9yCitlbnRyeVJ1bGVPcE9yIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgfQorCSBydWxlT3BPcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3JSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BPcgorcnVsZU9wT3IKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IH0KKworCSd8fCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yQWNjZXNzKCkuZ2V0VmVydGljYWxMaW5lVmVydGljYWxMaW5lS2V5d29yZCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uCitlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYQW5kRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhBbmRFeHByZXNzaW9uCitydWxlWEFuZEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BBbmQKK2VudHJ5UnVsZU9wQW5kIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IH0KKwkgcnVsZU9wQW5kCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBbmRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BBbmQKK3J1bGVPcEFuZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZEFjY2VzcygpLmdldEFtcGVyc2FuZEFtcGVyc2FuZEtleXdvcmQoKSk7IH0KKworCScmJicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZEFjY2VzcygpLmdldEFtcGVyc2FuZEFtcGVyc2FuZEtleXdvcmQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uCitlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEVxdWFsaXR5RXhwcmVzc2lvbgorcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BFcXVhbGl0eQorZW50cnlSdWxlT3BFcXVhbGl0eSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eVJ1bGUoKSk7IH0KKwkgcnVsZU9wRXF1YWxpdHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wRXF1YWxpdHkKK3J1bGVPcEVxdWFsaXR5CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFJlbGF0aW9uYWxFeHByZXNzaW9uCitydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wQ29tcGFyZQorZW50cnlSdWxlT3BDb21wYXJlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyB9CisJIHJ1bGVPcENvbXBhcmUKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BDb21wYXJlCitydWxlT3BDb21wYXJlCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCitydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wT3RoZXIKK2VudHJ5UnVsZU9wT3RoZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyB9CisJIHJ1bGVPcE90aGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcE90aGVyCitydWxlT3BPdGhlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCitlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEFkZGl0aXZlRXhwcmVzc2lvbgorcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BBZGQKK2VudHJ5UnVsZU9wQWRkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZFJ1bGUoKSk7IH0KKwkgcnVsZU9wQWRkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgT3BBZGQKK3J1bGVPcEFkZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uCitlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbgorcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BNdWx0aQorZW50cnlSdWxlT3BNdWx0aSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IH0KKwkgcnVsZU9wTXVsdGkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIE9wTXVsdGkKK3J1bGVPcE11bHRpCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbgorZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpOyB9CisJIHJ1bGVYVW5hcnlPcGVyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFVuYXJ5T3BlcmF0aW9uCitydWxlWFVuYXJ5T3BlcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZU9wVW5hcnkKK2VudHJ5UnVsZU9wVW5hcnkgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyB9CisJIHJ1bGVPcFVuYXJ5Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFVuYXJ5CitydWxlT3BVbmFyeQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgorZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWENhc3RlZEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2FzdGVkRXhwcmVzc2lvbgorcnVsZVhDYXN0ZWRFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uCitlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkpOyB9CisJIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhQb3N0Zml4T3BlcmF0aW9uCitydWxlWFBvc3RmaXhPcGVyYXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlT3BQb3N0Zml4CitlbnRyeVJ1bGVPcFBvc3RmaXggCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IH0KKwkgcnVsZU9wUG9zdGZpeAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBPcFBvc3RmaXgKK3J1bGVPcFBvc3RmaXgKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsCitlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IH0KKwkgcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYTWVtYmVyRmVhdHVyZUNhbGwKK3J1bGVYTWVtYmVyRmVhdHVyZUNhbGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uCitlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhQcmltYXJ5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUHJpbWFyeUV4cHJlc3Npb24KK3J1bGVYUHJpbWFyeUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fWFByaW1hcnlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWExpdGVyYWwKK2VudHJ5UnVsZVhMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWExpdGVyYWwKK3J1bGVYTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwKK2VudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWENvbGxlY3Rpb25MaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDb2xsZWN0aW9uTGl0ZXJhbAorcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19YQ29sbGVjdGlvbkxpdGVyYWxfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU2V0TGl0ZXJhbAorZW50cnlSdWxlWFNldExpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWFNldExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU2V0TGl0ZXJhbAorcnVsZVhTZXRMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhMaXN0TGl0ZXJhbAorZW50cnlSdWxlWExpc3RMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYTGlzdExpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWExpc3RMaXRlcmFsCitydWxlWExpc3RMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhDbG9zdXJlCitlbnRyeVJ1bGVYQ2xvc3VyZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVSdWxlKCkpOyB9CisJIHJ1bGVYQ2xvc3VyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDbG9zdXJlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDbG9zdXJlCitydWxlWENsb3N1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hDbG9zdXJlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUKK2VudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZVJ1bGUoKSk7IH0KKwkgcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEV4cHJlc3Npb25JbkNsb3N1cmUKK3J1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlCitlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlUnVsZSgpKTsgfQorCSBydWxlWFNob3J0Q2xvc3VyZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFNob3J0Q2xvc3VyZQorcnVsZVhTaG9ydENsb3N1cmUKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uCitlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KK3J1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWElmRXhwcmVzc2lvbgorZW50cnlSdWxlWElmRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhJZkV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJZkV4cHJlc3Npb24KK3J1bGVYSWZFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uCitlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYU3dpdGNoRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhTd2l0Y2hFeHByZXNzaW9uCitydWxlWFN3aXRjaEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhc2VQYXJ0CitlbnRyeVJ1bGVYQ2FzZVBhcnQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IH0KKwkgcnVsZVhDYXNlUGFydAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQ2FzZVBhcnQKK3J1bGVYQ2FzZVBhcnQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uCitlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhGb3JMb29wRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRm9yTG9vcEV4cHJlc3Npb24KK3J1bGVYRm9yTG9vcEV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK2VudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uCitlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFdoaWxlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFdoaWxlRXhwcmVzc2lvbgorcnVsZVhXaGlsZUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uCitlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhEb1doaWxlRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRG9XaGlsZUV4cHJlc3Npb24KK3J1bGVYRG9XaGlsZUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbgorZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhCbG9ja0V4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhCbG9ja0V4cHJlc3Npb24KK3J1bGVYQmxvY2tFeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbgorZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkpOyB9CisJIHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCitydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCitlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25SdWxlKCkpOyB9CisJIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhWYXJpYWJsZURlY2xhcmF0aW9uCitydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyCitlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0KKwkgcnVsZUp2bUZvcm1hbFBhcmFtZXRlcgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Gb3JtYWxQYXJhbWV0ZXIKK3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcgorZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlclJ1bGUoKSk7IH0KKwkgcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIKK3J1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhGZWF0dXJlQ2FsbAorZW50cnlSdWxlWEZlYXR1cmVDYWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOyB9CisJIHJ1bGVYRmVhdHVyZUNhbGwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEZlYXR1cmVDYWxsCitydWxlWEZlYXR1cmVDYWxsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUZlYXR1cmVDYWxsSUQKK2VudHJ5UnVsZUZlYXR1cmVDYWxsSUQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyB9CisJIHJ1bGVGZWF0dXJlQ2FsbElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJRFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBGZWF0dXJlQ2FsbElECitydWxlRmVhdHVyZUNhbGxJRAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVJZE9yU3VwZXIKK2VudHJ5UnVsZUlkT3JTdXBlciAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgfQorCSBydWxlSWRPclN1cGVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIElkT3JTdXBlcgorcnVsZUlkT3JTdXBlcgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKyhydWxlX19JZE9yU3VwZXJfX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsCitlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsUnVsZSgpKTsgfQorCSBydWxlWENvbnN0cnVjdG9yQ2FsbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENvbnN0cnVjdG9yQ2FsbAorcnVsZVhDb25zdHJ1Y3RvckNhbGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsCitlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhCb29sZWFuTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQm9vbGVhbkxpdGVyYWwKK3J1bGVYQm9vbGVhbkxpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE51bGxMaXRlcmFsCitlbnRyeVJ1bGVYTnVsbExpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhOdWxsTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYTnVsbExpdGVyYWwKK3J1bGVYTnVsbExpdGVyYWwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWE51bWJlckxpdGVyYWwKK2VudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSk7IH0KKwkgcnVsZVhOdW1iZXJMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWE51bWJlckxpdGVyYWwKK3J1bGVYTnVtYmVyTGl0ZXJhbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbAorZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpKTsgfQorCSBydWxlWFN0cmluZ0xpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYU3RyaW5nTGl0ZXJhbAorcnVsZVhTdHJpbmdMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhUeXBlTGl0ZXJhbAorZW50cnlSdWxlWFR5cGVMaXRlcmFsIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOyB9CisJIHJ1bGVYVHlwZUxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFR5cGVMaXRlcmFsCitydWxlWFR5cGVMaXRlcmFsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24KK2VudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYVGhyb3dFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYVGhyb3dFeHByZXNzaW9uCitydWxlWFRocm93RXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbgorZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24gCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpKTsgfQorCSBydWxlWFJldHVybkV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYUmV0dXJuRXhwcmVzc2lvbgorcnVsZVhSZXR1cm5FeHByZXNzaW9uCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCitlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkpOyB9CisJIHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uCitydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24KK2VudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSk7IH0KKwkgcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWFN5bmNocm9uaXplZEV4cHJlc3Npb24KK3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UKK2VudHJ5UnVsZVhDYXRjaENsYXVzZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgfQorCSBydWxlWENhdGNoQ2xhdXNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhDYXRjaENsYXVzZQorcnVsZVhDYXRjaENsYXVzZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVOdW1iZXIKK2VudHJ5UnVsZU51bWJlciAKK0Bpbml0IHsKKwlIaWRkZW5Ub2tlbnMgbXlIaWRkZW5Ub2tlblN0YXRlID0gKChYdGV4dFRva2VuU3RyZWFtKWlucHV0KS5zZXRIaWRkZW5Ub2tlbnMoKTsKK30KKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyUnVsZSgpKTsgfQorCSBydWxlTnVtYmVyCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyUnVsZSgpKTsgfSAKKwkgRU9GIAorOworZmluYWxseSB7CisJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKK30KKworLy8gUnVsZSBOdW1iZXIKK3J1bGVOdW1iZXIKKyAgICBAaW5pdCB7CisJCUhpZGRlblRva2VucyBteUhpZGRlblRva2VuU3RhdGUgPSAoKFh0ZXh0VG9rZW5TdHJlYW0paW5wdXQpLnNldEhpZGRlblRva2VucygpOworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKK30KKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIHJ1bGVKdm1UeXBlUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1UeXBlUmVmZXJlbmNlCitydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzCitlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgfQorCSBydWxlQXJyYXlCcmFja2V0cworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgQXJyYXlCcmFja2V0cworcnVsZUFycmF5QnJhY2tldHMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZgorZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7IH0KKwkgcnVsZVhGdW5jdGlvblR5cGVSZWYKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhGdW5jdGlvblR5cGVSZWYKK3J1bGVYRnVuY3Rpb25UeXBlUmVmCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCitydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorCToKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVXBwZXJCb3VuZAorZW50cnlSdWxlSnZtVXBwZXJCb3VuZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IH0KKwkgcnVsZUp2bVVwcGVyQm91bmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVVwcGVyQm91bmQKK3J1bGVKdm1VcHBlckJvdW5kCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZAorZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIAorOgoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpOyB9CisJIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpOyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVXBwZXJCb3VuZEFuZGVkCitydWxlSnZtVXBwZXJCb3VuZEFuZGVkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyB9CisocnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUxvd2VyQm91bmQKK2VudHJ5UnVsZUp2bUxvd2VyQm91bmQgCis6Cit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRSdWxlKCkpOyB9CisJIHJ1bGVKdm1Mb3dlckJvdW5kCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Mb3dlckJvdW5kCitydWxlSnZtTG93ZXJCb3VuZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKK2VudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgfQorCSBydWxlSnZtTG93ZXJCb3VuZEFuZGVkCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUxvd2VyQm91bmRBbmRlZAorcnVsZUp2bUxvd2VyQm91bmRBbmRlZAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZAorZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFJ1bGUoKSk7IH0KKwkgcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKK3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKwk6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24KK2VudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfQorCSBydWxlWEltcG9ydERlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFhJbXBvcnREZWNsYXJhdGlvbgorcnVsZVhJbXBvcnREZWNsYXJhdGlvbgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKK2VudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCAKKzoKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfQorCSBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0UnVsZSgpKTsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CisJOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IH0KKyhydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKy8vIFJ1bGUgUm9sZUVudW0KK3J1bGVSb2xlRW51bQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CisocnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIFJvbGVQcm9wZXJ0eUVudW0KK3J1bGVSb2xlUHJvcGVydHlFbnVtCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVByb3BlcnR5RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgfQorKHJ1bGVfX1JvbGVQcm9wZXJ0eUVudW1fX0FsdGVybmF0aXZlcykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKy8vIFJ1bGUgUm9sZUJsaXBQcm9jZXNzRW51bQorcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NFbnVtQWNjZXNzKCkuZ2V0U3RhcnRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKAknc3RhcnRhYmxlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NFbnVtQWNjZXNzKCkuZ2V0U3RhcnRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisvLyBSdWxlIFJvbGVCbGlwVXNlclRhc2tFbnVtCitydWxlUm9sZUJsaXBVc2VyVGFza0VudW0KKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrRW51bUFjY2VzcygpLmdldEV4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyB9CisoCSdleGVjdXRhYmxlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrRW51bUFjY2VzcygpLmdldEV4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKK3J1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVJvbGVFbnRpdHkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVCZWFuUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVSb2xlQmVhbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUJlYW5QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVEdG9QYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVJvbGVEdG8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVEdG9QYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVCbGlwUHJvY2Vzc1BhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKwlydWxlUm9sZUJsaXBQcm9jZXNzCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlUm9sZUVudGl0eUF0dHJpYnV0ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlUm9sZUVudGl0eVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmVhbkZlYXR1cmVfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJvbGVCZWFuQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVSb2xlQmVhbkF0dHJpYnV0ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJvbGVCZWFuQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVJvbGVCZWFuUmVmZXJlbmNlCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b0F0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlUm9sZUR0b0F0dHJpYnV0ZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b0F0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b1JlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlUm9sZUR0b1JlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b1JlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzNfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhBbm5vdGF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGx1c1NpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknKz0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFBsdXNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorCisJJy09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRBc3Rlcmlza0VxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IH0KKworCScqPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKworCScvPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0U29saWR1c0VxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQZXJjZW50U2lnbkVxdWFsc1NpZ25LZXl3b3JkXzQoKSk7IH0KKworCSclPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKHJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyb3VwXzUoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CisocnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JvdXBfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJz09JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IH0KKworCSchPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEVxdWFsc1NpZ25FcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMigpKTsgfQorCisJJz09PScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8yKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXhjbGFtYXRpb25NYXJrRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzMoKSk7IH0KKworCSchPT0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25FcXVhbHNTaWduS2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CisocnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BDb21wYXJlX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF8wKCkpOyB9CisKKwknPj0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX09wQ29tcGFyZV9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF8zKCkpOyB9CisKKwknPCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IH0KKworCSctPicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0SHlwaGVuTWludXNHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyB9CisKKwknLi48JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wTGVzc1RoYW5TaWduS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfMigpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzJfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRGdWxsU3RvcEZ1bGxTdG9wS2V5d29yZF8zKCkpOyB9CisKKwknLi4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF80KCkpOyB9CisKKwknPT4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEVxdWFsc1NpZ25HcmVhdGVyVGhhblNpZ25LZXl3b3JkXzQoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81KCkpOyB9CisocnVsZV9fT3BPdGhlcl9fR3JvdXBfNV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JvdXBfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyb3VwXzYoKSk7IH0KKyhydWxlX19PcE90aGVyX19Hcm91cF82X18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF83KCkpOyB9CisKKwknPD4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyB9CisKKwknPzonIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0NvbG9uS2V5d29yZF84KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzVfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMCgpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzVfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF81XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8xXzEoKSk7IH0KKworCSc+JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzXzZfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMCgpKTsgfQorKHJ1bGVfX09wT3RoZXJfX0dyb3VwXzZfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcm91cF82XzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IH0KKworCSc8JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IH0KKworCSc9PicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8xXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJysnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorCisJJy0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMCgpKTsgfQorCisJJyonIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tBc3Rlcmlza0tleXdvcmRfMSgpKTsgfQorCisJJyoqJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBc3Rlcmlza0FzdGVyaXNrS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0U29saWR1c0tleXdvcmRfMigpKTsgfQorCisJJy8nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFNvbGlkdXNLZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRQZXJjZW50U2lnbktleXdvcmRfMygpKTsgfQorCisJJyUnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldFBlcmNlbnRTaWduS2V5d29yZF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CisocnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtLZXl3b3JkXzAoKSk7IH0KKworCSchJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtLZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgfQorCisJJy0nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFVuYXJ5QWNjZXNzKCkuZ2V0UGx1c1NpZ25LZXl3b3JkXzIoKSk7IH0KKworCScrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wUG9zdGZpeF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0UGx1c1NpZ25QbHVzU2lnbktleXdvcmRfMCgpKTsgfQorCisJJysrJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldFBsdXNTaWduUGx1c1NpZ25LZXl3b3JkXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEh5cGhlbk1pbnVzSHlwaGVuTWludXNLZXl3b3JkXzEoKSk7IH0KKworCSctLScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0h5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CisocnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF8xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfMV8wXzBfMF8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMF8wXzBfMV8wKCkpOyB9CisKKwknLicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wXzBfMF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMF8wXzBfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzBfMF8wXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8wXzBfMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMF8wXzFfMCgpKTsgfQorCisJJy4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMV8wXzBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX051bGxTYWZlQXNzaWdubWVudF8xXzFfMF8wXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXROdWxsU2FmZUFzc2lnbm1lbnRfMV8xXzBfMF8xXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fRXhwbGljaXRTdGF0aWNBc3NpZ25tZW50XzFfMV8wXzBfMV8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEV4cGxpY2l0U3RhdGljQXNzaWdubWVudF8xXzFfMF8wXzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fQWx0ZXJuYXRpdmVzXzFfMV8zXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSk7IH0KKyhydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX01lbWJlckNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzFfMV8zXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRNZW1iZXJDYWxsQXJndW1lbnRzQXNzaWdubWVudF8xXzFfM18xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpKTsgfQorKHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfMV8xXzNfMV8xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwXzFfMV8zXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENvbnN0cnVjdG9yQ2FsbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWENvbnN0cnVjdG9yQ2FsbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhDb25zdHJ1Y3RvckNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmxvY2tFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorCXJ1bGVYQmxvY2tFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJsb2NrRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorCXJ1bGVYU3dpdGNoRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhTd2l0Y2hFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8zKCkpOyB9CisoCXJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGZWF0dXJlQ2FsbFBhcnNlclJ1bGVDYWxsXzQoKSk7IH0KKwlydWxlWEZlYXR1cmVDYWxsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEZlYXR1cmVDYWxsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WExpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CisJcnVsZVhMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WExpdGVyYWxQYXJzZXJSdWxlQ2FsbF81KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSWZFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorCXJ1bGVYSWZFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WElmRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzYoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzcoKSk7IH0KKygJcnVsZVhGb3JMb29wRXhwcmVzc2lvbikKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRm9yTG9vcEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF83KCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzgoKSk7IH0KKwlydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmFzaWNGb3JMb29wRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzgoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhXaGlsZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF85KCkpOyB9CisJcnVsZVhXaGlsZUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfOSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTAoKSk7IH0KKwlydWxlWERvV2hpbGVFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WERvV2hpbGVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUaHJvd0V4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMSgpKTsgfQorCXJ1bGVYVGhyb3dFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRocm93RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzExKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYUmV0dXJuRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEyKCkpOyB9CisJcnVsZVhSZXR1cm5FeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFJldHVybkV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xMygpKTsgfQorCXJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMTMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzE0KCkpOyB9CisJcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzE0KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDb2xsZWN0aW9uTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WENsb3N1cmVQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisoCXJ1bGVYQ2xvc3VyZSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhDbG9zdXJlUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYQm9vbGVhbkxpdGVyYWxQYXJzZXJSdWxlQ2FsbF8yKCkpOyB9CisJcnVsZVhCb29sZWFuTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WEJvb2xlYW5MaXRlcmFsUGFyc2VyUnVsZUNhbGxfMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVtYmVyTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzMoKSk7IH0KKwlydWxlWE51bWJlckxpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhOdW1iZXJMaXRlcmFsUGFyc2VyUnVsZUNhbGxfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYTnVsbExpdGVyYWxQYXJzZXJSdWxlQ2FsbF80KCkpOyB9CisJcnVsZVhOdWxsTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WE51bGxMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYU3RyaW5nTGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzUoKSk7IH0KKwlydWxlWFN0cmluZ0xpdGVyYWwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldFhTdHJpbmdMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNSgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxBY2Nlc3MoKS5nZXRYVHlwZUxpdGVyYWxQYXJzZXJSdWxlQ2FsbF82KCkpOyB9CisJcnVsZVhUeXBlTGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0WFR5cGVMaXRlcmFsUGFyc2VyUnVsZUNhbGxfNigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhTZXRMaXRlcmFsCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCkuZ2V0WFNldExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZVhMaXN0TGl0ZXJhbAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbFBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKHJ1bGVfX1hTd2l0Y2hFeHByZXNzaW9uX19Hcm91cF8yXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8yXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8xKCkpOyB9CisocnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwXzJfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzJfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hDYXNlUGFydF9fQWx0ZXJuYXRpdmVzXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKyhydWxlX19YQ2FzZVBhcnRfX0dyb3VwXzNfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKS5nZXRHcm91cF8zXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEoKSk7IH0KKyhydWxlX19YQ2FzZVBhcnRfX0ZhbGxUaHJvdWdoQXNzaWdubWVudF8zXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0QWNjZXNzKCkuZ2V0RmFsbFRocm91Z2hBc3NpZ25tZW50XzNfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFdyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKCkpOyB9CisocnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX1dyaXRlYWJsZUFzc2lnbm1lbnRfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V3JpdGVhYmxlQXNzaWdubWVudF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0VmFsS2V5d29yZF8xXzEoKSk7IH0KKworCSd2YWwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRWYWxLZXl3b3JkXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXNfMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CisocnVsZV9fWFZhcmlhYmxlRGVjbGFyYXRpb25fX0dyb3VwXzJfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwXzJfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFZhcmlhYmxlRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8yXzEoKSk7IH0KKyhydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fTmFtZUFzc2lnbm1lbnRfMl8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMl8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEZlYXR1cmVDYWxsX19BbHRlcm5hdGl2ZXNfM18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkpOyB9CisocnVsZV9fWEZlYXR1cmVDYWxsX19GZWF0dXJlQ2FsbEFyZ3VtZW50c0Fzc2lnbm1lbnRfM18xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxBcmd1bWVudHNBc3NpZ25tZW50XzNfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cF8zXzFfMSgpKTsgfQorKHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfM18xXzFfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlVmFsaWRJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuZHNLZXl3b3JkXzEoKSk7IH0KKworCSdleHRlbmRzJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRFeHRlbmRzS2V5d29yZF8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0U3RhdGljS2V5d29yZF8yKCkpOyB9CisKKwknc3RhdGljJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRTdGF0aWNLZXl3b3JkXzIoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzMoKSk7IH0KKworCSdpbXBvcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMygpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEV4dGVuc2lvbktleXdvcmRfNCgpKTsgfQorCisJJ2V4dGVuc2lvbicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRGZWF0dXJlQ2FsbElEQWNjZXNzKCkuZ2V0RXh0ZW5zaW9uS2V5d29yZF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRGZWF0dXJlQ2FsbElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVGZWF0dXJlQ2FsbElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0RmVhdHVyZUNhbGxJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldFN1cGVyS2V5d29yZF8xKCkpOyB9CisKKwknc3VwZXInIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0U3VwZXJLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQ29uc3RydWN0b3JDYWxsX19BbHRlcm5hdGl2ZXNfNF8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldEFyZ3VtZW50c0Fzc2lnbm1lbnRfNF8xXzAoKSk7IH0KKyhydWxlX19YQ29uc3RydWN0b3JDYWxsX19Bcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxBY2Nlc3MoKS5nZXRBcmd1bWVudHNBc3NpZ25tZW50XzRfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzEoKSk7IH0KKyhydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF80XzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXBfNF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQm9vbGVhbkxpdGVyYWxfX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkuZ2V0RmFsc2VLZXl3b3JkXzFfMCgpKTsgfQorCisJJ2ZhbHNlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEZhbHNlS2V5d29yZF8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldElzVHJ1ZUFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Jc1RydWVBc3NpZ25tZW50XzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKS5nZXRJc1RydWVBc3NpZ25tZW50XzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXNfMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18wKCkpOyB9CisocnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwXzNfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzNfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8zXzEoKSk7IH0KKyhydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfM18xX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRIRVhUZXJtaW5hbFJ1bGVDYWxsXzAoKSk7IH0KKwlSVUxFX0hFWAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEhFWFRlcm1pbmFsUnVsZUNhbGxfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX051bWJlcl9fR3JvdXBfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfMV8wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgfQorCVJVTEVfSU5UCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0REVDSU1BTFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSk7IH0KKwlSVUxFX0RFQ0lNQUwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX051bWJlcl9fQWx0ZXJuYXRpdmVzXzFfMV8xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8wKCkpOyB9CisJUlVMRV9JTlQKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRJTlRUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldERFQ0lNQUxUZXJtaW5hbFJ1bGVDYWxsXzFfMV8xXzEoKSk7IH0KKwlSVUxFX0RFQ0lNQUwKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IH0KKyhydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19Hcm91cF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0WEZ1bmN0aW9uVHlwZVJlZlBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKwlydWxlWEZ1bmN0aW9uVHlwZVJlZgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRYRnVuY3Rpb25UeXBlUmVmUGFyc2VyUnVsZUNhbGxfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlSnZtVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyB9CisJcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CisocnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF8yXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXBfMl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKyhydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwXzJfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cF8yXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0FsdGVybmF0aXZlc18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVBc3NpZ25tZW50XzFfMSgpKTsgfQorKHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fSW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xXzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzFfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzXzFfMF8zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0V2lsZGNhcmRBc3NpZ25tZW50XzFfMF8zXzAoKSk7IH0KKyhydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX1dpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldFdpbGRjYXJkQXNzaWdubWVudF8xXzBfM18wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRNZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKCkpOyB9CisocnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19NZW1iZXJOYW1lQXNzaWdubWVudF8xXzBfM18xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVBc3NpZ25tZW50XzFfMF8zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRBbnlFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKygJJ2FueScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRBbnlFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0Q3JlYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CisoCSdjcmVhdGFibGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0Q3JlYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldFJlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkpOyB9CisoCSdyZWFkYWJsZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRSZWFkYWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCisgICAgfCgKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRVcGRhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKygJJ3VwZGF0YWJsZScgCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRVcGRhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0RGVsZXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CisoCSdkZWxldGFibGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0RGVsZXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZVByb3BlcnR5RW51bV9fQWx0ZXJuYXRpdmVzCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVByb3BlcnR5RW51bUFjY2VzcygpLmdldEludmlzaWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgfQorKAknaW52aXNpYmxlJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0SW52aXNpYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyB9CispCisKKyAgICB8KAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0RGlzYWJsZWRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKygJJ2Rpc2FibGVkJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0RGlzYWJsZWRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKSk7IH0KKykKKworICAgIHwoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKS5nZXROb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKAknbm9uZWRpdGFibGUnIAorKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKS5nZXROb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCitydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRQYWNrYWdlS2V5d29yZF8xKCkpOyB9CisKKwkncGFja2FnZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldFBhY2thZ2VLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19OYW1lQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzNfX0ltcGwKKwlydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8zKCkpOyB9CisKKwkneycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX180X19JbXBsCisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0SW1wb3J0c0Fzc2lnbm1lbnRfNCgpKTsgfQorKHJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19JbXBvcnRzQXNzaWdubWVudF80KSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEltcG9ydHNBc3NpZ25tZW50XzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX181X19JbXBsCisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX182Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0Um9sZXNBc3NpZ25tZW50XzUoKSk7IH0KKyhydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fUm9sZXNBc3NpZ25tZW50XzUpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0Um9sZXNBc3NpZ25tZW50XzUoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX182X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fNl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworCisKKworCitydWxlX19BdXRob3JpemF0aW9uSW1wb3J0X19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19BdXRob3JpemF0aW9uSW1wb3J0X19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19BdXRob3JpemF0aW9uSW1wb3J0X19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7IH0KKworCSdpbXBvcnQnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1JvbGVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJvbGVLZXl3b3JkXzAoKSk7IH0KKworCSdyb2xlJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVBY2Nlc3MoKS5nZXRSb2xlS2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVBY2Nlc3MoKS5nZXROYW1lQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fUm9sZV9fTmFtZUFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0TmFtZUFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUm9sZV9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsgfQorCisJJ3snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlX19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX1JvbGVfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJvbGVFbGVtZW50c0Fzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1JvbGVfX1JvbGVFbGVtZW50c0Fzc2lnbm1lbnRfMykqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJvbGVFbGVtZW50c0Fzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZV9fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVfX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVfX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOyB9CisKKwknfScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0Um9sZUVudGl0eUFjdGlvbl8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0Um9sZUVudGl0eUFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlLZXl3b3JkXzEoKSk7IH0KKworCSdlbnRpdHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5UmVmQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUm9sZUVudGl0eV9fRW50aXR5UmVmQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlSZWZBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX180Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKyhydWxlX19Sb2xlRW50aXR5X19FbnRpdHlBdXRob3JpemVkQXNzaWdubWVudF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlBdXRob3JpemVkQXNzaWdubWVudF8zKCkpOyB9CispCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlBdXRob3JpemVkQXNzaWdubWVudF8zKCkpOyB9CisocnVsZV9fUm9sZUVudGl0eV9fRW50aXR5QXV0aG9yaXplZEFzc2lnbm1lbnRfMykqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKykKKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX180CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fNF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRHcm91cF80KCkpOyB9CisocnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEdyb3VwXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwXzRfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVFbnRpdHlfX0dyb3VwXzRfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwXzRfXzFfX0ltcGwKKwlydWxlX19Sb2xlRW50aXR5X19Hcm91cF80X18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVFbnRpdHlfX0dyb3VwXzRfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5RmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpKTsgfQorKHJ1bGVfX1JvbGVFbnRpdHlfX0VudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEoKSk7IH0KKyhydWxlX19Sb2xlRW50aXR5X19FbnRpdHlGZWF0dXJlc0Fzc2lnbm1lbnRfNF8xKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5RmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfNF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5X19Hcm91cF80X18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIoKSk7IH0KKworCSd9JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldFJvbGVCZWFuQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0Um9sZUJlYW5BY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuS2V5d29yZF8xKCkpOyB9CisKKwknYmVhbicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5LZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18yX19JbXBsCisJcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhblJlZkFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1JvbGVCZWFuX19CZWFuUmVmQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhblJlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzNfX0ltcGwKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuQXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1JvbGVCZWFuX19CZWFuQXV0aG9yaXplZEFzc2lnbm1lbnRfMykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5BdXRob3JpemVkQXNzaWdubWVudF8zKCkpOyB9CispCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKyhydWxlX19Sb2xlQmVhbl9fQmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzMpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKykKKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF9fNAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJlYW5fX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF9fNF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0R3JvdXBfNCgpKTsgfQorKHJ1bGVfX1JvbGVCZWFuX19Hcm91cF80X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEdyb3VwXzQoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCisKKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwXzRfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCZWFuX19Hcm91cF80X18wX19JbXBsCisJcnVsZV9fUm9sZUJlYW5fX0dyb3VwXzRfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5fX0dyb3VwXzRfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsgfQorCisJJ3snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF80X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfNF9fMV9fSW1wbAorCXJ1bGVfX1JvbGVCZWFuX19Hcm91cF80X18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF80X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpKTsgfQorKHJ1bGVfX1JvbGVCZWFuX19CZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xKCkpOyB9CispCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkZlYXR1cmVzQXNzaWdubWVudF80XzEoKSk7IH0KKyhydWxlX19Sb2xlQmVhbl9fQmVhbkZlYXR1cmVzQXNzaWdubWVudF80XzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkZlYXR1cmVzQXNzaWdubWVudF80XzEoKSk7IH0KKykKKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCZWFuX19Hcm91cF80X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbl9fR3JvdXBfNF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmVhbl9fR3JvdXBfNF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpKTsgfQorCisJJ30nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19Sb2xlRHRvX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUR0b19fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19Sb2xlRHRvX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRSb2xlRHRvQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRSb2xlRHRvQWN0aW9uXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVEdG9fX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRHRvX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1JvbGVEdG9fX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVEdG9fX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0tleXdvcmRfMSgpKTsgfQorCisJJ2R0bycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvS2V5d29yZF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlRHRvX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUR0b19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19Sb2xlRHRvX19Hcm91cF9fMworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9SZWZBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19Sb2xlRHRvX19EdG9SZWZBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b1JlZkFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUR0b19fR3JvdXBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVEdG9fX0dyb3VwX18zX19JbXBsCisJcnVsZV9fUm9sZUR0b19fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUR0b19fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1JvbGVEdG9fX0R0b0F1dGhvcml6ZWRBc3NpZ25tZW50XzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0F1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0F1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKyhydWxlX19Sb2xlRHRvX19EdG9BdXRob3JpemVkQXNzaWdubWVudF8zKSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUR0b19fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVEdG9fX0dyb3VwX180X19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVEdG9fX0dyb3VwX180X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldEdyb3VwXzQoKSk7IH0KKyhydWxlX19Sb2xlRHRvX19Hcm91cF80X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0R3JvdXBfNCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKKworCitydWxlX19Sb2xlRHRvX19Hcm91cF80X18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRHRvX19Hcm91cF80X18wX19JbXBsCisJcnVsZV9fUm9sZUR0b19fR3JvdXBfNF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvX19Hcm91cF80X18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsgfQorCisJJ3snIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUR0b19fR3JvdXBfNF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUR0b19fR3JvdXBfNF9fMV9fSW1wbAorCXJ1bGVfX1JvbGVEdG9fX0dyb3VwXzRfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUR0b19fR3JvdXBfNF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xKCkpOyB9CisocnVsZV9fUm9sZUR0b19fRHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpKTsgfQorKQorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpKTsgfQorKHJ1bGVfX1JvbGVEdG9fX0R0b0ZlYXR1cmVzQXNzaWdubWVudF80XzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xKCkpOyB9CispCispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlRHRvX19Hcm91cF80X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRHRvX19Hcm91cF80X18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVEdG9fX0dyb3VwXzRfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpKTsgfQorCisJJ30nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEFsbEtleXdvcmRfMSgpKTsgfQorCisJJ2FsbCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEFsbEtleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzJfX0ltcGwKKwlydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRVc2VydGFza3NLZXl3b3JkXzIoKSk7IH0KKworCSd1c2VydGFza3MnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRVc2VydGFza3NLZXl3b3JkXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0QXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19BdXRob3JpemVkQXNzaWdubWVudF8zKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0QXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKK3J1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFJvbGVCbGlwVXNlclRhc2tBY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFJvbGVCbGlwVXNlclRhc2tBY3Rpb25fMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0VXNlcnRhc2tLZXl3b3JkXzEoKSk7IH0KKworCSd1c2VydGFzaycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0VXNlcnRhc2tLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMl9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFVzZXJUYXNrQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUm9sZUJsaXBVc2VyVGFza19fVXNlclRhc2tBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFVzZXJUYXNrQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzNfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0QXV0aG9yaXplZEFzc2lnbm1lbnRfMygpKTsgfQorKHJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0F1dGhvcml6ZWRBc3NpZ25tZW50XzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldEF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKKworCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0Um9sZUJsaXBQcm9jZXNzQWN0aW9uXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFJvbGVCbGlwUHJvY2Vzc0FjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0tleXdvcmRfMSgpKTsgfQorCisJJ3Byb2Nlc3MnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0tleXdvcmRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMl9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFByb2Nlc3NBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19Sb2xlQmxpcFByb2Nlc3NfX1Byb2Nlc3NBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0Fzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMworICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fM19fSW1wbAorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzQKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fM19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7IH0KKworCSd7JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzQKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzRfX0ltcGwKKwlydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX181Cis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzRfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRHcm91cF80KCkpOyB9CisocnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF80X18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRHcm91cF80KCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX181CisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX181X19JbXBsCisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fNgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX181X19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0QWxsVXNlclRhc2tzQXNzaWdubWVudF81KCkpOyB9CisocnVsZV9fUm9sZUJsaXBQcm9jZXNzX19BbGxVc2VyVGFza3NBc3NpZ25tZW50XzUpPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldEFsbFVzZXJUYXNrc0Fzc2lnbm1lbnRfNSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fNgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fNl9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzcKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fNl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFVzZXJUYXNrc0Fzc2lnbm1lbnRfNigpKTsgfQorKHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fVXNlclRhc2tzQXNzaWdubWVudF82KSoKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRVc2VyVGFza3NBc3NpZ25tZW50XzYoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzcKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzdfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fN19fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83KCkpOyB9CisKKwknfScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwXzRfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfNF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfNF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwXzRfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRJc0tleXdvcmRfNF8wKCkpOyB9CisKKwknaXMnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0SXNLZXl3b3JkXzRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF80X18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwXzRfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF80X18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZEFzc2lnbm1lbnRfNF8xKCkpOyB9CisocnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Qcm9jZXNzU3RhcnRBdXRob3JpemVkQXNzaWdubWVudF80XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZEFzc2lnbm1lbnRfNF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOyB9CisKKwkncHJvcGVydHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0VudGl0eUF0dHJpQ29sQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSZWZlcmVuY2VLZXl3b3JkXzAoKSk7IH0KKworCSdyZWZlcmVuY2UnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldFJlZmVyZW5jZUtleXdvcmRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19FbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0VudGl0eUF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUtleXdvcmRfMCgpKTsgfQorCisJJ3Byb3BlcnR5JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0QmVhbkF0dHJpQ29sQXNzaWdubWVudF8xKCkpOyB9CisocnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0JlYW5BdHRyaUNvbEFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEJlYW5BdHRyaUNvbEFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fQmVhbkF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldFJlZmVyZW5jZUtleXdvcmRfMCgpKTsgfQorCisJJ3JlZmVyZW5jZScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldFJlZmVyZW5jZUtleXdvcmRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUJlYW5SZWZlcmVuY2VfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUJlYW5SZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fQmVhbkF0dHJpQ29sQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QmVhbkF0dHJpQ29sQXNzaWdubWVudF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldEJlYW5BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19CZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOyB9CisKKwkncHJvcGVydHknIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUR0b0F0dHJpYnV0ZV9fR3JvdXBfXzFfX0ltcGwKKwlydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXREdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0R0b0F0dHJpQ29sQXNzaWdubWVudF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXREdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUR0b0F0dHJpYnV0ZV9fR3JvdXBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkpOyB9CisocnVsZV9fUm9sZUR0b0F0dHJpYnV0ZV9fRHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXRSZWZlcmVuY2VLZXl3b3JkXzAoKSk7IH0KKworCSdyZWZlcmVuY2UnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldFJlZmVyZW5jZUtleXdvcmRfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1JvbGVEdG9SZWZlcmVuY2VfX0dyb3VwX18xX19JbXBsCisJcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RHRvQXR0cmlDb2xBc3NpZ25tZW50XzEoKSk7IH0KKyhydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19EdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RHRvQXR0cmlDb2xBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1JvbGVEdG9SZWZlcmVuY2VfX0dyb3VwX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXREdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpKTsgfQorKHJ1bGVfX1JvbGVEdG9SZWZlcmVuY2VfX0R0b0F0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXREdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVRdWFsaWZpZWROYW1lCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgfQorCisJJy4nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEFzdGVyaXNrS2V5d29yZF8xXzEoKSk7IH0KKworCScqJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzBfX0ltcGwKKwlydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVWYWxpZElECit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXBfMSgpKTsgfQorKHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzApKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwKKwlydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgfQorKAorCScuJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8xXzEoKSk7IH0KKwlydWxlVmFsaWRJRAoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25BY3Rpb25fMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1lcmNpYWxBdEtleXdvcmRfMSgpKTsgfQorCisJJ0AnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tZXJjaWFsQXRLZXl3b3JkXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18yX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fQW5ub3RhdGlvblR5cGVBc3NpZ25tZW50XzIpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUFzc2lnbm1lbnRfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzNfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzApPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfMygpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMCgpKTsgfQorKAorCScoJyAKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfXzFfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzXzNfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18zXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zX18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM19fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yKCkpOyB9CisKKwknKScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEVsZW1lbnRWYWx1ZVBhaXJzQXNzaWdubWVudF8zXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwXzNfMV8wXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cF8zXzFfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8zXzFfMF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uX19FbGVtZW50VmFsdWVQYWlyc0Fzc2lnbm1lbnRfM18xXzBfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNBc3NpZ25tZW50XzNfMV8wXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fVmFsdWVBc3NpZ25tZW50XzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVBc3NpZ25tZW50XzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFbGVtZW50QXNzaWdubWVudF8wXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fRWxlbWVudEFzc2lnbm1lbnRfMF8wXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEFzc2lnbm1lbnRfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwXzBfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkXzBfMF8xKCkpOyB9CisKKwknPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMCk/Cit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFJpZ2h0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8yKCkpOyB9CisKKwknXScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsQWN0aW9uXzBfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKworCScjJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8wXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IH0KKworCSdbJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzBfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOyB9CisKKwknLCcgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfMV8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wXzFfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0VsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyB9CisJcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzEoKSk7IH0KKykKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEdyb3VwXzFfMV8xKCkpOyB9CisocnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzApKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMSgpKTsgfQorKQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8xXzFfMCgpKTsgfQorCisJJywnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldENvbW1hS2V5d29yZF8xXzFfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xXzFfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV8xXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19FbGVtZW50c0Fzc2lnbm1lbnRfMV8xXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0RWxlbWVudHNBc3NpZ25tZW50XzFfMV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wX19JbXBsCisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMV9fSW1wbAorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgfQorCisJJ10nIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRHcm91cF8wXzBfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzFfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8wXzBfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOyB9CisKKwknIycgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldE51bWJlclNpZ25LZXl3b3JkXzBfMF8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMF8wX18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzBfMF9fMl9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IH0KKworCSdbJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMCgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IH0KKyhydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzApKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0R3JvdXBfMF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzBfX0ltcGwKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgfQorCisJJywnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF8xXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfMV8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19FbGVtZW50c0Fzc2lnbm1lbnRfMF8xXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzQXNzaWdubWVudF8wXzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9fSW1wbAorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFjdGlvbl8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBY3Rpb25fMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzFfX0ltcGwKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMgorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMF8xKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0ZlYXR1cmVBc3NpZ25tZW50XzBfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVBc3NpZ25tZW50XzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzIKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18yX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldE9wU2luZ2xlQXNzaWduUGFyc2VyUnVsZUNhbGxfMF8yKCkpOyB9CisJcnVsZU9wU2luZ2xlQXNzaWduCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRPcFNpbmdsZUFzc2lnblBhcnNlclJ1bGVDYWxsXzBfMigpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzMKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18zX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX1ZhbHVlQXNzaWdubWVudF8wXzMpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfMF8zKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhPckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IH0KKwlydWxlWE9yRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wKT8KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpKTsgfQorKHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyB9CisocnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18wX19JbXBsCisJcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfMV8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xXzFfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzFfMF8wXzEoKSk7IH0KKyhydWxlX19YQXNzaWdubWVudF9fRmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8xXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IH0KKworCSc8JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbAorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzIKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNV9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzVfMSgpKTsgfQorCisJJzwnIAorCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF81X18yX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzVfXzJfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyB9CisKKwknPScgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKKworCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsCisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNl8wKCkpOyB9CisKKwknPicgCisKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwKKwlydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX09wTXVsdGlBc3NpZ25fX0dyb3VwXzZfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzEoKSk7IH0KKygKKwknPicgCispPworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzZfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMgorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fT3BNdWx0aUFzc2lnbl9fR3JvdXBfNl9fMl9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19PcE11bHRpQXNzaWduX19Hcm91cF82X18yX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgfQorCisJJz49JyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25FcXVhbHNTaWduS2V5d29yZF82XzIoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworCisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhBbmRFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYQW5kRXhwcmVzc2lvbgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQW5kRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbAorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgfQorKHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbAorCXJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CisocnVsZV9fWE9yRXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzBfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFcXVhbGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CisJcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFcXVhbGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbAorCXJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWEFuZEV4cHJlc3Npb25fX1JpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgfQorKHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzBfX0ltcGwKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgfQorKAorCispCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YQW5kRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CisocnVsZV9fWEFuZEV4cHJlc3Npb25fX0ZlYXR1cmVBc3NpZ25tZW50XzFfMF8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMF9fSW1wbAorCXJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKwlydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyB9CisocnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMCkqCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbAorCXJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzAoKSk7IH0KKyhydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyB9CisocnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZEFzc2lnbm1lbnRfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgfQorKHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbAorCXJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkpOyB9CisoCisKKykKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKK3J1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMV9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlQXNzaWdubWVudF8xXzBfMF8xKCkpOyB9CisocnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fRmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUFzc2lnbm1lbnRfMV8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisJcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgfQorCXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24KK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXNfMSgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzXzEpKgoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlc18xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMF9fSW1wbAorCXJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18xCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzAoKSk7IH0KKyhydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF9fMQorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlQXNzaWdubWVudF8xXzBfMSgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fVHlwZUFzc2lnbm1lbnRfMV8wXzEpCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0VHlwZUFzc2lnbm1lbnRfMV8wXzEoKSk7IH0KKykKKworOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCisKKworCisKKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF9fMF9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8wXzBfMCgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzBfX0ltcGwKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzBfMF8wX18wX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSk7IH0KKygKKworKQoreyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8wXzBfMF9fMV9fSW1wbAorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMF8wXzBfXzFfX0ltcGwKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorKAoreyBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRJbnN0YW5jZW9mS2V5d29yZF8xXzBfMF8wXzEoKSk7IH0KKworCSdpbnN0YW5jZW9mJyAKKworeyBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEluc3RhbmNlb2ZLZXl3b3JkXzFfMF8wXzBfMSgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKKworCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisJcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzBfX0ltcGwKKwlydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMQorOworZmluYWxseSB7CisJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworfQorCitydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wKCkpOyB9CisocnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMCkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cF8xXzFfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfXzEKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xX18xX19JbXBsCisgICAgQGluaXQgeworCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgIH0KKzoKKygKK3sgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSgpKTsgfQorKHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fUmlnaHRPcGVyYW5kQXNzaWdubWVudF8xXzFfMSkKK3sgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRBc3NpZ25tZW50XzFfMV8xKCkpOyB9CispCisKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworCisKKworCisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzAKKyAgICBAaW5pdCB7CisJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgfQorOgorCXJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfXzBfX0ltcGwKKzsKK2ZpbmFsbHkgeworCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKK30KKworcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF8xXzFfMF9fMF9fSW1wbAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9Cis6CisoCit7IGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwXzFfMV8wXzAoKSk7IH0KKyhydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwXzFfMV8wXzBfXzApCit7IGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXBfMV8xXzBfMCgpKTsgfQorKQorCis7CitmaW5hbGx5IHsKKwlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7Cit9CisKKworCisKK3J1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfMV8xXzBfMF9fMAorICAgIEBpbml0IHsKKwkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wudG9rZW5zIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLnRva2VucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDIwODlhCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLnRva2VucwpAQCAtMCwwICsxLDIwMyBAQAorJyEnPTQyCisnIT0nPTI0CisnIT09Jz0yNgorJyMnPTgwCisnJSc9NDEKKyclPSc9MjIKKycmJic9MTUKKycmJz0xMDQKKycoJz03NgorJyknPTc3CisnKic9MzgKKycqKic9MzkKKycqPSc9MjAKKycrJz0zNgorJysrJz00MworJys9Jz0xOAorJywnPTc4CisnLSc9MzcKKyctLSc9NDQKKyctPSc9MTkKKyctPic9MzAKKycuJz00NQorJy4uJz0zMgorJy4uPCc9MzEKKycvJz00MAorJy89Jz0yMQorJzonPTg4CisnOjonPTEwNQorJzsnPTg0CisnPCc9MjkKKyc8Pic9MzQKKyc9Jz0xMworJz09Jz0yMworJz09PSc9MjUKKyc9Pic9MzMKKyc+Jz0yOAorJz49Jz0yNworJz8nPTEwMworJz8uJz0xMDYKKyc/Oic9MzUKKydAJz03NQorJ1snPTgxCisnXSc9NzkKKydhbGwnPTY4CisnYW55Jz01MworJ2FzJz04MworJ2JlYW4nPTY2CisnY2FzZSc9OTAKKydjYXRjaCc9MTAyCisnY3JlYXRhYmxlJz01NAorJ2RlZmF1bHQnPTg5CisnZGVsZXRhYmxlJz01NworJ2Rpc2FibGVkJz01OQorJ2RvJz05MworJ2R0byc9NjcKKydlbHNlJz04NgorJ2VudGl0eSc9NjUKKydleGVjdXRhYmxlJz0xNworJ2V4dGVuZHMnPTQ3CisnZXh0ZW5zaW9uJz01MAorJ2ZhbHNlJz01MgorJ2ZpbmFsbHknPTEwMAorJ2Zvcic9OTEKKydpZic9ODUKKydpbXBvcnQnPTQ5CisnaW5zdGFuY2VvZic9ODIKKydpbnZpc2libGUnPTU4CisnaXMnPTcyCisnbmV3Jz05NAorJ25vbmVkaXRhYmxlJz02MAorJ251bGwnPTk1CisncGFja2FnZSc9NjEKKydwcm9jZXNzJz03MQorJ3Byb3BlcnR5Jz03MworJ3JlYWRhYmxlJz01NQorJ3JlZmVyZW5jZSc9NzQKKydyZXR1cm4nPTk4Cisncm9sZSc9NjQKKydzdGFydGFibGUnPTE2Cisnc3RhdGljJz00OAorJ3N1cGVyJz01MQorJ3N3aXRjaCc9ODcKKydzeW5jaHJvbml6ZWQnPTEwMQorJ3Rocm93Jz05NworJ3RydWUnPTEwOQorJ3RyeSc9OTkKKyd0eXBlb2YnPTk2CisndXBkYXRhYmxlJz01NgorJ3VzZXJ0YXNrJz03MAorJ3VzZXJ0YXNrcyc9NjkKKyd2YWwnPTQ2CisndmFyJz0xMDgKKyd3aGlsZSc9OTIKKyd7Jz02MgorJ3wnPTEwNworJ3x8Jz0xNAorJ30nPTYzCitSVUxFX0FOWV9PVEhFUj0xMgorUlVMRV9ERUNJTUFMPTcKK1JVTEVfSEVYPTUKK1JVTEVfSUQ9NAorUlVMRV9JTlQ9NgorUlVMRV9NTF9DT01NRU5UPTkKK1JVTEVfU0xfQ09NTUVOVD0xMAorUlVMRV9TVFJJTkc9OAorUlVMRV9XUz0xMQorVF9fMTAwPTEwMAorVF9fMTAxPTEwMQorVF9fMTAyPTEwMgorVF9fMTAzPTEwMworVF9fMTA0PTEwNAorVF9fMTA1PTEwNQorVF9fMTA2PTEwNgorVF9fMTA3PTEwNworVF9fMTA4PTEwOAorVF9fMTA5PTEwOQorVF9fMTM9MTMKK1RfXzE0PTE0CitUX18xNT0xNQorVF9fMTY9MTYKK1RfXzE3PTE3CitUX18xOD0xOAorVF9fMTk9MTkKK1RfXzIwPTIwCitUX18yMT0yMQorVF9fMjI9MjIKK1RfXzIzPTIzCitUX18yND0yNAorVF9fMjU9MjUKK1RfXzI2PTI2CitUX18yNz0yNworVF9fMjg9MjgKK1RfXzI5PTI5CitUX18zMD0zMAorVF9fMzE9MzEKK1RfXzMyPTMyCitUX18zMz0zMworVF9fMzQ9MzQKK1RfXzM1PTM1CitUX18zNj0zNgorVF9fMzc9MzcKK1RfXzM4PTM4CitUX18zOT0zOQorVF9fNDA9NDAKK1RfXzQxPTQxCitUX180Mj00MgorVF9fNDM9NDMKK1RfXzQ0PTQ0CitUX180NT00NQorVF9fNDY9NDYKK1RfXzQ3PTQ3CitUX180OD00OAorVF9fNDk9NDkKK1RfXzUwPTUwCitUX181MT01MQorVF9fNTI9NTIKK1RfXzUzPTUzCitUX181ND01NAorVF9fNTU9NTUKK1RfXzU2PTU2CitUX181Nz01NworVF9fNTg9NTgKK1RfXzU5PTU5CitUX182MD02MAorVF9fNjE9NjEKK1RfXzYyPTYyCitUX182Mz02MworVF9fNjQ9NjQKK1RfXzY1PTY1CitUX182Nj02NgorVF9fNjc9NjcKK1RfXzY4PTY4CitUX182OT02OQorVF9fNzA9NzAKK1RfXzcxPTcxCitUX183Mj03MgorVF9fNzM9NzMKK1RfXzc0PTc0CitUX183NT03NQorVF9fNzY9NzYKK1RfXzc3PTc3CitUX183OD03OAorVF9fNzk9NzkKK1RfXzgwPTgwCitUX184MT04MQorVF9fODI9ODIKK1RfXzgzPTgzCitUX184ND04NAorVF9fODU9ODUKK1RfXzg2PTg2CitUX184Nz04NworVF9fODg9ODgKK1RfXzg5PTg5CitUX185MD05MAorVF9fOTE9OTEKK1RfXzkyPTkyCitUX185Mz05MworVF9fOTQ9OTQKK1RfXzk1PTk1CitUX185Nj05NgorVF9fOTc9OTcKK1RfXzk4PTk4CitUX185OT05OQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhMmNhZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyLmphdmEKQEAgLTAsMCArMSw0NDUyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5MZXhlcjsKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIgZXh0ZW5kcyBMZXhlciB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9IRVg9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MD01MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OT01OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181NT01NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nj01NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Nz01NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181OD01ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181MT01MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mj01MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181Mz01MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX181ND01NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MD02MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182MT02MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0lEPTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JTlQ9NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nj02NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX01MX0NPTU1FTlQ9OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Nz02NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OD02ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182OT02OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mj02MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182Mz02MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182ND02NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX182NT02NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNz0zNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOD0zODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zOT0zOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMz0zMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zND0zNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNT0zNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zNj0zNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMD0zMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMT0zMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18zMj0zMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OD00ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180OT00OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180ND00NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180NT00NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nj00NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Nz00NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MD00MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180MT00MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mj00MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX180Mz00MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MT05MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDA9MTAwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkyPTkyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzkzPTkzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMj0xMDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTQ9OTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAxPTEwMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185MD05MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOT0xOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNT0xNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNj0xNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xNz0xNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xOD0xODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OT05OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMz0xMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xND0xNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185NT05NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nj05NjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Nz05NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185OD05ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0RFQ0lNQUw9NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNj0yNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNz0yNzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOD0yODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yOT0yOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMj0yMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMz0yMzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yND0yNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yNT0yNTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMD0yMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18yMT0yMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MD03MDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183MT03MTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mj03MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NUUklORz04OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfU0xfQ09NTUVOVD0xMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Nz03NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OD03ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183OT03OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX183Mz03MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFT0Y9LTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzQ9NzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzU9NzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzY9NzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODA9ODA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODE9ODE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODI9ODI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODM9ODM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9XUz0xMTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX0FOWV9PVEhFUj0xMjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OD04ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDg9MTA4OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg5PTg5OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNz0xMDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA5PTEwOTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184ND04NDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDQ9MTA0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg1PTg1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMz0xMDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODY9ODY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA2PTEwNjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184Nz04NzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDU9MTA1OworCisgICAgLy8gZGVsZWdhdGVzCisgICAgLy8gZGVsZWdhdG9ycworCisgICAgcHVibGljIEludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyKCkgezt9IAorICAgIHB1YmxpYyBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlcihDaGFyU3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgfQorICAgIHB1YmxpYyBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlcihDaGFyU3RyZWFtIGlucHV0LCBSZWNvZ25pemVyU2hhcmVkU3RhdGUgc3RhdGUpIHsKKyAgICAgICAgc3VwZXIoaW5wdXQsc3RhdGUpOworCisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTo3OiAoICc9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTo5OiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI6NzogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyOjk6ICd8fCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ8fCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM6NzogKCAnJiYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzOjk6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCImJiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ6NzogKCAnc3RhcnRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDo5OiAnc3RhcnRhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YXJ0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU6NzogKCAnZXhlY3V0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU6OTogJ2V4ZWN1dGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXhlY3V0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY6NzogKCAnKz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2Ojk6ICcrPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc6NzogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3Ojk6ICctPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg6NzogKCAnKj0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4Ojk6ICcqPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk6NzogKCAnLz0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5Ojk6ICcvPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA6NzogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwOjk6ICclPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIlPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE6NzogKCAnPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOjk6ICc9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI6NzogKCAnIT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOjk6ICchPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM6NzogKCAnPT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzo5OiAnPT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj09PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ6NzogKCAnIT09JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDo5OiAnIT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU6NzogKCAnPj0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1Ojk6ICc+PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI+PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY6NzogKCAnPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY6OTogJz4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Ojc6ICggJzwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Ojk6ICc8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzwnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODo3OiAoICctPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg6OTogJy0+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTo3OiAoICcuLjwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5Ojk6ICcuLjwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLi48Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDo3OiAoICcuLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA6OTogJy4uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTo3OiAoICc9PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE6OTogJz0+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj0+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjo3OiAoICc8PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI6OTogJzw+JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjw+Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMzo3OiAoICc/OicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzM6OTogJz86JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj86Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNDo3OiAoICcrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNDo5OiAnKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcrJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzU6NzogKCAnLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzU6OTogJy0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnLScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM2Ojc6ICggJyonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM2Ojk6ICcqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNzo3OiAoICcqKicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzc6OTogJyoqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIioqIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODo3OiAoICcvJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODo5OiAnLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcvJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzk6NzogKCAnJScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzk6OTogJyUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQwOjc6ICggJyEnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQwOjk6ICchJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyEnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MTo3OiAoICcrKycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDE6OTogJysrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIisrIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mjo3OiAoICctLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDI6OTogJy0tJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi0tIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzo3OiAoICcuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzo5OiAnLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQ6NzogKCAndmFsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NDo5OiAndmFsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDU6NzogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDU6OTogJ2V4dGVuZHMnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZXh0ZW5kcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDY6NzogKCAnc3RhdGljJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Njo5OiAnc3RhdGljJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YXRpYyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDc6NzogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Nzo5OiAnaW1wb3J0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImltcG9ydCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDg6NzogKCAnZXh0ZW5zaW9uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0ODo5OiAnZXh0ZW5zaW9uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImV4dGVuc2lvbiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk6NzogKCAnc3VwZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ5Ojk6ICdzdXBlcicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzdXBlciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTA6NzogKCAnZmFsc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUwOjk6ICdmYWxzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmYWxzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTE6NzogKCAnYW55JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1MTo5OiAnYW55JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFueSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTI6NzogKCAnY3JlYXRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Mjo5OiAnY3JlYXRhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImNyZWF0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTM6NzogKCAncmVhZGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUzOjk6ICdyZWFkYWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZWFkYWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTQ6NzogKCAndXBkYXRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NDo5OiAndXBkYXRhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVwZGF0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTU6NzogKCAnZGVsZXRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTo5OiAnZGVsZXRhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRlbGV0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTY6NzogKCAnaW52aXNpYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Njo5OiAnaW52aXNpYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImludmlzaWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTc6NzogKCAnZGlzYWJsZWQnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU3Ojk6ICdkaXNhYmxlZCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkaXNhYmxlZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTg6NzogKCAnbm9uZWRpdGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU4Ojk6ICdub25lZGl0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJub25lZGl0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTk6NzogKCAncGFja2FnZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTk6OTogJ3BhY2thZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFja2FnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjA6NzogKCAneycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjA6OTogJ3snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgneycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYxOjc6ICggJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYxOjk6ICd9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ30nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Mjo3OiAoICdyb2xlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Mjo5OiAncm9sZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyb2xlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Mzo3OiAoICdlbnRpdHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzOjk6ICdlbnRpdHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZW50aXR5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NDo3OiAoICdiZWFuJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NDo5OiAnYmVhbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJiZWFuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NTo3OiAoICdkdG8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY1Ojk6ICdkdG8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZHRvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Njo3OiAoICdhbGwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY2Ojk6ICdhbGwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiYWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Nzo3OiAoICd1c2VydGFza3MnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY3Ojk6ICd1c2VydGFza3MnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXNlcnRhc2tzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2ODo3OiAoICd1c2VydGFzaycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Njg6OTogJ3VzZXJ0YXNrJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInVzZXJ0YXNrIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTo3OiAoICdwcm9jZXNzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTo5OiAncHJvY2VzcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwcm9jZXNzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDo3OiAoICdpcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzA6OTogJ2lzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MTo3OiAoICdwcm9wZXJ0eScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzE6OTogJ3Byb3BlcnR5JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInByb3BlcnR5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzczIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mjo3OiAoICdyZWZlcmVuY2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcyOjk6ICdyZWZlcmVuY2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmVmZXJlbmNlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mzo3OiAoICdAJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mzo5OiAnQCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdAJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzQ6NzogKCAnKCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzQ6OTogJygnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc1Ojc6ICggJyknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc1Ojk6ICcpJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyknKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Njo3OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Njo5OiAnLCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcsJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc6NzogKCAnXScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc6OTogJ10nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnXScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4Ojc6ICggJyMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4Ojk6ICcjJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTo3OiAoICdbJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTo5OiAnWycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCdbJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODA6NzogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODA6OTogJ2luc3RhbmNlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW5zdGFuY2VvZiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODE6NzogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgxOjk6ICdhcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhcyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODI6NzogKCAnOycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODI6OTogJzsnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnOycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgzOjc6ICggJ2lmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Mzo5OiAnaWYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaWYiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg0Ojc6ICggJ2Vsc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg0Ojk6ICdlbHNlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImVsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg1Ojc6ICggJ3N3aXRjaCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODU6OTogJ3N3aXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzd2l0Y2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg2Ojc6ICggJzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg2Ojk6ICc6JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJzonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Nzo3OiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Nzo5OiAnZGVmYXVsdCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWZhdWx0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4ODo3OiAoICdjYXNlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4ODo5OiAnY2FzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXNlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4OTo3OiAoICdmb3InICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg5Ojk6ICdmb3InCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZm9yIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MDo3OiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTA6OTogJ3doaWxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIndoaWxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MTo3OiAoICdkbycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE6OTogJ2RvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Mjo3OiAoICduZXcnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkyOjk6ICduZXcnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibmV3Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Mzo3OiAoICdudWxsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Mzo5OiAnbnVsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJudWxsIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NDo3OiAoICd0eXBlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk0Ojk6ICd0eXBlb2YnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHlwZW9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NTo3OiAoICd0aHJvdycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTU6OTogJ3Rocm93JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Njo3OiAoICdyZXR1cm4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk2Ojk6ICdyZXR1cm4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicmV0dXJuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Nzo3OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk3Ojk6ICd0cnknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidHJ5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODo4OiAoICdmaW5hbGx5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODoxMDogJ2ZpbmFsbHknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmluYWxseSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk5Ojg6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTk6MTA6ICdzeW5jaHJvbml6ZWQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgic3luY2hyb25pemVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTAyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTAyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAwOjg6ICggJ2NhdGNoJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDA6MTA6ICdjYXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXRjaCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMTo4OiAoICc/JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDE6MTA6ICc/JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJz8nKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAyOjg6ICggJyYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjoxMDogJyYnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnJicpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDM6ODogKCAnOjonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMzoxMDogJzo6JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjo6Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA0Ojg6ICggJz8uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDQ6MTA6ICc/LicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNTo4OiAoICd8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU6MTA6ICd8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA2Ojg6ICggJ3ZhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA2OjEwOiAndmFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNzo4OiAoICd0cnVlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDc6MTA6ICd0cnVlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRydWUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0hFWCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9IRVgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9IRVg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2MToxMDogKCAoICcweCcgfCAnMFgnICkgKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsgKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjE6MTI6ICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjE6MTI6ICggJzB4JyB8ICcwWCcgKQorICAgICAgICAgICAgaW50IGFsdDE9MjsKKyAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTFfMD09JzAnKSApIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExXzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMV8xPT0neCcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExXzE9PSdYJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjE6MTM6ICcweCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgiMHgiKTsgCisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTYxOjE4OiAnMFgnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjBYIik7IAorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2MToyNDogKCAnMCcgLi4gJzknIHwgJ2EnIC4uICdmJyB8ICdBJyAuLiAnRicgfCAnXycgKSsKKyAgICAgICAgICAgIGludCBjbnQyPTA7CisgICAgICAgICAgICBsb29wMjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0Mj0yOworICAgICAgICAgICAgICAgIGludCBMQTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMl8wPj0nMCcgJiYgTEEyXzA8PSc5Jyl8fChMQTJfMD49J0EnICYmIExBMl8wPD0nRicpfHxMQTJfMD09J18nfHwoTEEyXzA+PSdhJyAmJiBMQTJfMDw9J2YnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDI9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nRicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J2YnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MiA+PSAxICkgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MisrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTYxOjU4OiAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgaW50IGFsdDQ9MjsKKyAgICAgICAgICAgIGludCBMQTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTRfMD09JyMnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2MTo1OTogJyMnICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApIHwgKCAnbCcgfCAnTCcgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTYxOjYzOiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09J0InfHxMQTNfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBM18wPT0nTCd8fExBM18wPT0nbCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTYxOjY0OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0InfHxpbnB1dC5MQSgxKT09J2InICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdJJ3x8aW5wdXQuTEEoMSk9PSdpJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjE6ODQ6ICggJ2wnIHwgJ0wnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0wnfHxpbnB1dC5MQSgxKT09J2wnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0hFWCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjM6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjM6MTI6ICcwJyAuLiAnOScgKCAnMCcgLi4gJzknIHwgJ18nICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaFJhbmdlKCcwJywnOScpOyAKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTYzOjIxOiAoICcwJyAuLiAnOScgfCAnXycgKSoKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE1XzA+PScwJyAmJiBMQTVfMDw9JzknKXx8TEE1XzA9PSdfJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fGlucHV0LkxBKDEpPT0nXycgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0lOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9ERUNJTUFMIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0RFQ0lNQUwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9ERUNJTUFMOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjU6MTQ6ICggUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2NToxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjU6MjU6ICggKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVCApPworICAgICAgICAgICAgaW50IGFsdDc9MjsKKyAgICAgICAgICAgIGludCBMQTdfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTdfMD09J0UnfHxMQTdfMD09J2UnKSApIHsKKyAgICAgICAgICAgICAgICBhbHQ3PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDcpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2NToyNjogKCAnZScgfCAnRScgKSAoICcrJyB8ICctJyApPyBSVUxFX0lOVAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdFJ3x8aW5wdXQuTEEoMSk9PSdlJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjU6MzY6ICggJysnIHwgJy0nICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNl8wPT0nKyd8fExBNl8wPT0nLScpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09JysnfHxpbnB1dC5MQSgxKT09Jy0nICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtUlVMRV9JTlQoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2NTo1ODogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CisgICAgICAgICAgICBpbnQgYWx0OD0zOworICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOF8wPT0nQid8fExBOF8wPT0nYicpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4XzA9PSdEJ3x8TEE4XzA9PSdGJ3x8TEE4XzA9PSdMJ3x8TEE4XzA9PSdkJ3x8TEE4XzA9PSdmJ3x8TEE4XzA9PSdsJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjU6NTk6ICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgfCAnZCcgfCAnRCcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0QnfHxpbnB1dC5MQSgxKT09J0knfHxpbnB1dC5MQSgxKT09J2QnfHxpbnB1dC5MQSgxKT09J2knICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NjU6ODc6ICggJ2wnIHwgJ0wnIHwgJ2QnIHwgJ0QnIHwgJ2YnIHwgJ0YnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nRCd8fGlucHV0LkxBKDEpPT0nRid8fGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nZCd8fGlucHV0LkxBKDEpPT0nZid8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfREVDSU1BTCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9JRCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0lEOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njc6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njc6MTE6ICggJ14nICk/ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgKSAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njc6MTE6ICggJ14nICk/CisgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOV8wPT0nXicpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY3OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSckJ3x8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njc6NDQ6ICggJ2EnIC4uICd6JyB8ICdBJyAuLiAnWicgfCAnJCcgfCAnXycgfCAnMCcgLi4gJzknICkqCisgICAgICAgICAgICBsb29wMTA6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDEwPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExMF8wPT0nJCd8fChMQTEwXzA+PScwJyAmJiBMQTEwXzA8PSc5Jyl8fChMQTEwXzA+PSdBJyAmJiBMQTEwXzA8PSdaJyl8fExBMTBfMD09J18nfHwoTEExMF8wPj0nYScgJiYgTEExMF8wPD0neicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTApIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9JRCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9TVFJJTkciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU1RSSU5HOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njk6MTM6ICggKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2OToxNTogKCAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8gfCAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njk6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIGludCBhbHQxNT0yOworICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE1XzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTVfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxNSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjE2OiAnXCInICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCInKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjIwOiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDExOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTE9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExMV8wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExMV8wPj0nXHUwMDAwJyAmJiBMQTExXzA8PSchJyl8fChMQTExXzA+PScjJyAmJiBMQTExXzA8PSdbJyl8fChMQTExXzA+PSddJyAmJiBMQTExXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTE9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjIxOiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaCgnXFwnKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjI4OiB+ICggKCAnXFxcXCcgfCAnXCInICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSchJyl8fChpbnB1dC5MQSgxKT49JyMnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjQ0OiAoICdcIicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTEyXzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTI9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjQ0OiAnXCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjQ5OiAnXFwnJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5OjU0OiAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApICkqCisgICAgICAgICAgICAgICAgICAgIGxvb3AxMzoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEzPTM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTNfMD09J1xcJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTNfMD49J1x1MDAwMCcgJiYgTEExM18wPD0nJicpfHwoTEExM18wPj0nKCcgJiYgTEExM18wPD0nWycpfHwoTEExM18wPj0nXScgJiYgTEExM18wPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDEzPTI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxMykgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2OTo1NTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk2OTo2MjogfiAoICggJ1xcXFwnIHwgJ1xcJycgKSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9JyYnKXx8KGlucHV0LkxBKDEpPj0nKCcgJiYgaW5wdXQuTEEoMSk8PSdbJyl8fChpbnB1dC5MQSgxKT49J10nICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Njk6Nzk6ICggJ1xcJycgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE0XzA9PSdcJycpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTQ9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTY5Ojc5OiAnXFwnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfU1RSSU5HIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX01MX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfTUxfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk3MToxNzogKCAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTcxOjE5OiAnLyonICggb3B0aW9ucyB7Z3JlZWR5PWZhbHNlOyB9IDogLiApKiAnKi8nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLyoiKTsgCisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTcxOjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIGxvb3AxNjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE2XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNj0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMT49J1x1MDAwMCcgJiYgTEExNl8xPD0nLicpfHwoTEExNl8xPj0nMCcgJiYgTEExNl8xPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNl8wPj0nXHUwMDAwJyAmJiBMQTE2XzA8PScpJyl8fChMQTE2XzA+PScrJyAmJiBMQTE2XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzE6NTI6IC4KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgbWF0Y2goIiovIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfTUxfQ09NTUVOVCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9TTF9DT01NRU5UIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX1NMX0NPTU1FTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9TTF9DT01NRU5UOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzM6MTc6ICggJy8vJyAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSogKCAoICdcXHInICk/ICdcXG4nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTczOjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvLyIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzM6MjQ6ICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKgorICAgICAgICAgICAgbG9vcDE3OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxNz0yOworICAgICAgICAgICAgICAgIGludCBMQTE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTE3XzA+PSdcdTAwMDAnICYmIExBMTdfMDw9J1x0Jyl8fChMQTE3XzA+PSdcdTAwMEInICYmIExBMTdfMDw9J1xmJyl8fChMQTE3XzA+PSdcdTAwMEUnICYmIExBMTdfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTc9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTcpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk3MzoyNDogfiAoICggJ1xcbicgfCAnXFxyJyApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PSdcdCcpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEInICYmIGlucHV0LkxBKDEpPD0nXGYnKXx8KGlucHV0LkxBKDEpPj0nXHUwMDBFJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDE3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk3Mzo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTk9MjsKKyAgICAgICAgICAgIGludCBMQTE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExOV8wPT0nXG4nfHxMQTE5XzA9PSdccicpICkgeworICAgICAgICAgICAgICAgIGFsdDE5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzM6NDE6ICggJ1xccicgKT8gJ1xcbicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk3Mzo0MTogKCAnXFxyJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTg9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMThfMD09J1xyJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzM6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xuJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NMX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfV1MiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfV1MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTc1Ojk6ICggKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5NzU6MTE6ICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDk3NToxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIGludCBjbnQyMD0wOworICAgICAgICAgICAgbG9vcDIwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgIGludCBMQTIwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTIwXzA+PSdcdCcgJiYgTEEyMF8wPD0nXG4nKXx8TEEyMF8wPT0nXHInfHxMQTIwXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6CisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdCcgJiYgaW5wdXQuTEEoMSk8PSdcbicpfHxpbnB1dC5MQSgxKT09J1xyJ3x8aW5wdXQuTEEoMSk9PScgJyApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MjAgPj0gMSApIGJyZWFrIGxvb3AyMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMjAsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MjArKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfV1MiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfQU5ZX09USEVSIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0FOWV9PVEhFUigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX0FOWV9PVEhFUjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0OTc3OjE2OiAoIC4gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5Nzc6MTg6IC4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX0FOWV9PVEhFUiIKKworICAgIHB1YmxpYyB2b2lkIG1Ub2tlbnMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCisgICAgICAgIGludCBhbHQyMT0xMDY7CisgICAgICAgIGFsdDIxID0gZGZhMjEucHJlZGljdChpbnB1dCk7CisgICAgICAgIHN3aXRjaCAoYWx0MjEpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMDogVF9fMTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjE2OiBUX18xNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjI6IFRfXzE1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyODogVF9fMTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjM0OiBUX18xNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDA6IFRfXzE4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NjogVF9fMTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjUyOiBUX18yMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTg6IFRfXzIxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NjQ6IFRfXzIyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NzA6IFRfXzIzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NzY6IFRfXzI0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6ODI6IFRfXzI1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6ODg6IFRfXzI2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6OTQ6IFRfXzI3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTAwOiBUX18yOAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjEwNjogVF9fMjkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMTI6IFRfXzMwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTE4OiBUX18zMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjEyNDogVF9fMzIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzMyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMzA6IFRfXzMzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTM2OiBUX18zNAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjE0MjogVF9fMzUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNDg6IFRfXzM2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTU0OiBUX18zNworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMzcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjE2MDogVF9fMzgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzM4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNjY6IFRfXzM5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTcyOiBUX180MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjE3ODogVF9fNDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxODQ6IFRfXzQyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MTkwOiBUX180MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjE5NjogVF9fNDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMDI6IFRfXzQ1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjA4OiBUX180NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjIxNDogVF9fNDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzQ3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMjA6IFRfXzQ4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjI2OiBUX180OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNDkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjIzMjogVF9fNTAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMzg6IFRfXzUxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjQ0OiBUX181MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjI1MDogVF9fNTMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzUzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNTY6IFRfXzU0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjYyOiBUX181NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjI2ODogVF9fNTYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNzQ6IFRfXzU3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjgwOiBUX181OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNTgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjI4NjogVF9fNTkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzU5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyOTI6IFRfXzYwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6Mjk4OiBUX182MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjMwNDogVF9fNjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzYyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMTA6IFRfXzYzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MzE2OiBUX182NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjMyMjogVF9fNjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMjg6IFRfXzY2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MzM0OiBUX182NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNjcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjM0MDogVF9fNjgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzY4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNDY6IFRfXzY5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MzUyOiBUX183MAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzAoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjM1ODogVF9fNzEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzcxKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNjQ6IFRfXzcyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MzcwOiBUX183MworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjM3NjogVF9fNzQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozODI6IFRfXzc1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6Mzg4OiBUX183NgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjM5NDogVF9fNzcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzc3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2NiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MDA6IFRfXzc4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDA2OiBUX183OQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fNzkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY4IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQxMjogVF9fODAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MTg6IFRfXzgxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDI0OiBUX184MgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODIoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDcxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQzMDogVF9fODMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzgzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MzY6IFRfXzg0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDQyOiBUX184NQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODUoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQ0ODogVF9fODYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NTQ6IFRfXzg3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDYwOiBUX184OAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fODgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc3IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQ2NjogVF9fODkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzg5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NzI6IFRfXzkwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDc4OiBUX185MQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQ4NDogVF9fOTIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzkyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4MSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0OTA6IFRfXzkzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDk2OiBUX185NAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjUwMjogVF9fOTUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MDg6IFRfXzk2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTE0OiBUX185NworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fOTcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjUyMDogVF9fOTgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzk4KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4NyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MjY6IFRfXzk5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTMyOiBUX18xMDAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTM5OiBUX18xMDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTQ2OiBUX18xMDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTUzOiBUX18xMDMKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTYwOiBUX18xMDQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTY3OiBUX18xMDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTc0OiBUX18xMDYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTgxOiBUX18xMDcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTg4OiBUX18xMDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTk1OiBUX18xMDkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NjAyOiBSVUxFX0hFWAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9IRVgoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjYxMTogUlVMRV9JTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NjIwOiBSVUxFX0RFQ0lNQUwKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfREVDSU1BTCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAxIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjYzMzogUlVMRV9JRAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9JRCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjY0MTogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NjUzOiBSVUxFX01MX0NPTU1FTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfTUxfQ09NTUVOVCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTA0IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjY2OTogUlVMRV9TTF9DT01NRU5UCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX1NMX0NPTU1FTlQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2ODU6IFJVTEVfV1MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfV1MoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2OTM6IFJVTEVfQU5ZX09USEVSCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1SVUxFX0FOWV9PVEhFUigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHByb3RlY3RlZCBERkEyMSBkZmEyMSA9IG5ldyBERkEyMSh0aGlzKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX2VvdFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw2MlwxXDY0XDFcNjZcMlw3M1wxXDEwMVwxXDEwNVwxXDExMFwxXDExNFwxXDExNlwxXDEyMCIrCisgICAgICAgICJcMVwxMjJcMVwxMjRcMVwxMjZcMVwxMzFcMTJcNzNcMlx1ZmZmZlwxXDczXDEwXHVmZmZmXDFcdTAwODBcMlw3MyIrCisgICAgICAgICJcMlx1MDA4N1wxXDU3XDVcdWZmZmZcMVx1MDA4Y1w2XHVmZmZmXDRcNzNcMVx1ZmZmZlwzXDczXDIwXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMDk2XDVcdWZmZmZcMVx1MDA5OFw0XHVmZmZmXDNcNzNcMVx1MDA5ZVwxXHUwMDlmXDVcNzNcMVx1MDBhNSIrCisgICAgICAgICJcMTFcNzNcMVx1MDBiM1w1XDczXDJcdWZmZmZcMVw3M1wxMlx1ZmZmZlw0XDczXDFcdWZmZmZcMVx1MDA4N1w2IisKKyAgICAgICAgIlx1ZmZmZlwxMFw3M1w0XHVmZmZmXDFcdTAwYzhcMVx1MDBjOVwzXDczXDJcdWZmZmZcMVw3M1wxXHUwMGNlXDEiKworICAgICAgICAiXDczXDFcdTAwZDBcMVx1MDBkMVwxXHVmZmZmXDE0XDczXDFcdTAwZGVcMVx1ZmZmZlwxXDczXDFcdTAwZTBcNyIrCisgICAgICAgICJcNzNcMVx1MDBlOVwxMVw3M1wxXHUwMGYzXDJcdWZmZmZcNFw3M1wxXHVmZmZmXDFcNzNcMlx1ZmZmZlwxXDczIisKKyAgICAgICAgIlwxXHUwMGZhXDRcNzNcMVx1MDBmZlw1XDczXDFcdWZmZmZcMVw3M1wxXHVmZmZmXDFcdTAxMDZcM1w3M1wxXHUwMTBhIisKKyAgICAgICAgIlwzXDczXDFcdWZmZmZcMVx1MDEwZVwyXDczXDFcdTAxMTFcNVw3M1wxXHVmZmZmXDNcNzNcMVx1MDExYlwyXDczIisKKyAgICAgICAgIlwxXHVmZmZmXDFcdTAxMWVcM1w3M1wxXHVmZmZmXDZcNzNcMVx1ZmZmZlwzXDczXDFcdWZmZmZcMVx1MDEyYiIrCisgICAgICAgICJcMVw3M1wxXHUwMTJkXDFcdWZmZmZcMVw3M1wxXHUwMTJmXDFcdWZmZmZcMVx1MDEzMFw0XDczXDFcdTAxMzUiKworICAgICAgICAiXDFcdTAxMzZcMlw3M1wxXHVmZmZmXDJcNzNcMVx1ZmZmZlwyXDczXDFcdTAxM2RcMTFcNzNcMVx1ZmZmZlwxIisKKyAgICAgICAgIlx1MDE0N1wxXHVmZmZmXDFcNzNcMlx1ZmZmZlwyXDczXDFcdTAxNGJcMVw3M1wyXHVmZmZmXDJcNzNcMVx1MDE0ZiIrCisgICAgICAgICJcM1w3M1wxXHVmZmZmXDNcNzNcMVx1MDE1NlwyXDczXDFcdTAxNTlcMVx1MDE1YVwxXDczXDFcdWZmZmZcM1w3MyIrCisgICAgICAgICJcMVx1ZmZmZlwzXDczXDFcdWZmZmZcMVw3M1wxXHUwMTYzXDJcNzNcMVx1MDE2N1wxXDczXDFcdWZmZmZcMVx1MDE2OSIrCisgICAgICAgICJcMVw3M1wyXHVmZmZmXDFcdTAxNmJcMVx1MDE2Y1wyXDczXDFcdTAxNmZcMVx1MDE3MFwxXDczXDFcdTAxNzIiKworICAgICAgICAiXDFcdWZmZmZcMVx1MDE3M1wxXHUwMTc0XDFcdTAxNzVcMVx1ZmZmZlwxXHUwMTc2XDFcdWZmZmZcMVw3M1wyIisKKyAgICAgICAgIlx1ZmZmZlwxXDczXDFcdTAxNzlcMlx1ZmZmZlwxXHUwMTdhXDVcdWZmZmZcMlw3M1wyXHVmZmZmXDFcdTAxN2QiKworICAgICAgICAiXDFcdTAxN2VcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KKyAgICAgICAgIlx1MDE3Zlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9taW5TID0KKyAgICAgICAgIlwxXDBcMVw3NVwxXDE3NFwxXDQ2XDFcMTY0XDFcMTU0XDFcNTNcMVw1NVwyXDUyXDNcNzVcMVw3NlwyXDU2IisKKyAgICAgICAgIlwxXDE0MVwxXDE0NlwxXDE0MVwxXDE1NFwxXDE0MVwxXDE0NVwxXDE2MFwyXDE0NVwxXDE0MVwyXHVmZmZmXDEiKworICAgICAgICAiXDE0NVwxMFx1ZmZmZlwxXDcyXDJcMTUwXDJcNjBcMVw0NFw1XHVmZmZmXDFcNzVcNlx1ZmZmZlwxXDE0MVwxIisKKyAgICAgICAgIlwxNjBcMVwxNTFcMVwxNTZcMVx1ZmZmZlwxXDE0NVwxXDE2NFwxXDE2M1wyMFx1ZmZmZlwxXDc1XDVcdWZmZmYiKworICAgICAgICAiXDFcNzRcNFx1ZmZmZlwxXDE1NFwxXDE2MFwxXDE2M1wyXDQ0XDFcMTU0XDFcMTYyXDFcMTU2XDFcMTcxXDFcMTU0IisKKyAgICAgICAgIlwxXDQ0XDFcMTQ1XDFcMTYzXDFcMTQxXDFcMTU0XDFcMTQ0XDFcMTQ1XDFcMTQ2XDFcMTYzXDFcMTU3XDFcNDQiKworICAgICAgICAiXDFcMTU2XDFcMTY3XDFcMTU0XDFcMTQzXDFcMTU3XDJcdWZmZmZcMVwxNDFcMTJcdWZmZmZcMVwxNTFcMVwxNjAiKworICAgICAgICAiXDFcMTYyXDFcMTY1XDFcdWZmZmZcMVw2MFw2XHVmZmZmXDFcMTYyXDFcMTQ1XDFcMTY0XDJcMTQzXDFcMTQ1IisKKyAgICAgICAgIlwxXDE1MVwxXDE0NVw0XHVmZmZmXDJcNDRcMVwxNTdcMVwxNTFcMVwxNjRcMlx1ZmZmZlwxXDE2M1wxXDQ0XDEiKworICAgICAgICAiXDE0MVwyXDQ0XDFcdWZmZmZcMVwxNDFcMVwxNDVcMVwxNDNcMVwxNDRcMVwxNDVcMVwxNjVcMVwxNDVcMVwxNDEiKworICAgICAgICAiXDFcMTYyXDFcMTQ1XDJcMTQxXDFcNDRcMVx1ZmZmZlwxXDE0NVwxXDQ0XDFcMTU0XDFcMTUzXDFcMTQzXDFcMTU2IisKKyAgICAgICAgIlwxXDE1NFwxXDE0NVwxXDE1N1wxXDQ0XDFcMTQ1XDFcMTY0XDFcMTUxXDFcMTYyXDFcMTQzXDFcMTUwXDFcMTY1IisKKyAgICAgICAgIlwxXDE1NlwxXDE2NFwxXDQ0XDJcdWZmZmZcMVwxNjJcMVwxNjNcMVwxNDFcMVwxNDVcMVx1ZmZmZlwxXDE1NCIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE2NFwxXDQ0XDFcMTUwXDFcMTQxXDJcMTYyXDFcNDRcM1wxNjRcMVwxNjVcMVwxNDJcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNDRcMVx1ZmZmZlwxXDQ0XDFcMTQxXDJcMTQ1XDFcNDRcMVwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxIisKKyAgICAgICAgIlw0NFwxXDE0MVwxXDE0M1wxXDQ0XDFcMTUwXDFcMTYyXDFcMTY0XDFcMTQ0XDFcMTcxXDFcdWZmZmZcMVwxNjQiKworICAgICAgICAiXDFcMTUxXDFcMTU2XDFcNDRcMVwxNTRcMVwxNDFcMVx1ZmZmZlwxXDQ0XDFcMTQyXDFcMTQ1XDFcMTU2XDFcdWZmZmYiKworICAgICAgICAiXDNcMTQxXDJcMTU0XDFcMTUxXDFcdWZmZmZcMVwxNDdcMVwxNjNcMVwxNjJcMVx1ZmZmZlwxXDQ0XDFcMTQ2IisKKyAgICAgICAgIlwxXDQ0XDFcdWZmZmZcMVwxNDJcMVw0NFwxXHVmZmZmXDFcNDRcMVwxNTdcMVwxNDFcMVwxNjNcMVwxNTFcMiIrCisgICAgICAgICJcNDRcMVwxNDJcMVwxNDNcMVx1ZmZmZlwxXDE3MVwxXDE0MlwxXHVmZmZmXDFcMTU0XDFcMTU2XDFcNDRcMVwxNDIiKworICAgICAgICAiXDFcMTYzXDFcMTQyXDFcMTY0XDFcMTQ1XDFcMTY0XDFcMTQ1XDFcMTYzXDFcMTY0XDFcdWZmZmZcMVw0NFwxIisKKyAgICAgICAgIlx1ZmZmZlwxXDE1NFwyXHVmZmZmXDFcMTU2XDFcMTQyXDFcNDRcMVwxNTdcMlx1ZmZmZlwxXDE1NFwxXDE0NSIrCisgICAgICAgICJcMVw0NFwxXDE1NFwxXDE0NVwxXDE0M1wxXHVmZmZmXDFcMTU0XDFcMTUzXDFcMTU0XDFcNDRcMVwxNDRcMVwxNDEiKworICAgICAgICAiXDJcNDRcMVwxNzFcMVx1ZmZmZlwxXDE0NVwxXDE1MVwxXDE1NFwxXHVmZmZmXDFcMTU2XDFcMTQ1XDFcMTU3IisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTQ1XDFcNDRcMlwxNDVcMVw0NFwxXDE0NVwxXHVmZmZmXDFcNDRcMVwxNDJcMlx1ZmZmZiIrCisgICAgICAgICJcMlw0NFwxXDE3MlwxXDE0NVwyXDQ0XDFcMTQ2XDFcNDRcMVx1ZmZmZlwzXDQ0XDFcdWZmZmZcMVw0NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE1NFwyXHVmZmZmXDFcMTQ1XDFcNDRcMlx1ZmZmZlwxXDQ0XDVcdWZmZmZcMVwxNDVcMVwxNDRcMlx1ZmZmZiIrCisgICAgICAgICJcMlw0NFwyXHVmZmZmIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX21heFMgPQorICAgICAgICAiXDFcdWZmZmZcMVw3NlwxXDE3NFwxXDQ2XDFcMTcxXDFcMTcwXDFcNzVcMVw3Nlw1XDc1XDFcNzZcMVw1NlwxIisKKyAgICAgICAgIlw3MlwxXDE0MVwxXDE2M1wxXDE1N1wxXDE2M1wxXDE2MlwxXDE1N1wxXDE2M1wxXDE2NFwxXDE2NVwxXDE2MiIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE0NVwxMFx1ZmZmZlwxXDcyXDFcMTUwXDFcMTcxXDFcMTcwXDFcMTU0XDFcMTcyXDVcdWZmZmYiKworICAgICAgICAiXDFcNzVcNlx1ZmZmZlwxXDE0MVwxXDE2MFwxXDE1MVwxXDE1NlwxXHVmZmZmXDJcMTY0XDFcMTYzXDIwXHVmZmZmIisKKyAgICAgICAgIlwxXDc1XDVcdWZmZmZcMVw3NFw0XHVmZmZmXDFcMTYyXDFcMTYwXDFcMTY2XDJcMTcyXDFcMTU0XDFcMTYyXDEiKworICAgICAgICAiXDE1NlwxXDE3MVwxXDE1NFwxXDE3MlwxXDE0NVwyXDE2NFwxXDE1NFwxXDE0NFwxXDE0NVwxXDE1NFwxXDE2MyIrCisgICAgICAgICJcMVwxNTdcMVwxNzJcMVwxNTZcMVwxNjdcMVwxNTRcMVwxNDNcMVwxNTdcMlx1ZmZmZlwxXDE0MVwxMlx1ZmZmZiIrCisgICAgICAgICJcMVwxNTFcMVwxNjBcMVwxNjJcMVwxNzFcMVx1ZmZmZlwxXDE1NFw2XHVmZmZmXDFcMTY0XDFcMTQ1XDFcMTY0IisKKyAgICAgICAgIlwyXDE0M1wxXDE0NVwxXDE1MVwxXDE0NVw0XHVmZmZmXDJcMTcyXDFcMTU3XDFcMTUxXDFcMTY0XDJcdWZmZmYiKworICAgICAgICAiXDFcMTYzXDFcMTcyXDFcMTQxXDJcMTcyXDFcdWZmZmZcMVwxNDFcMVwxNDVcMVwxNDNcMVwxNDRcMVwxNDVcMSIrCisgICAgICAgICJcMTY1XDFcMTQ1XDFcMTQxXDFcMTYyXDFcMTQ1XDJcMTQxXDFcMTcyXDFcdWZmZmZcMVwxNDVcMVwxNzJcMVwxNTQiKworICAgICAgICAiXDFcMTUzXDFcMTYwXDFcMTU2XDFcMTU0XDFcMTQ1XDFcMTU3XDFcMTcyXDFcMTQ1XDFcMTY0XDFcMTUxXDFcMTYyIisKKyAgICAgICAgIlwxXDE0M1wxXDE1MFwxXDE2NVwxXDE1NlwxXDE2NFwxXDE3MlwyXHVmZmZmXDFcMTYyXDFcMTYzXDFcMTQxXDEiKworICAgICAgICAiXDE0NVwxXHVmZmZmXDFcMTU0XDJcdWZmZmZcMVwxNjRcMVwxNzJcMVwxNTBcMVwxNDFcMlwxNjJcMVwxNzJcMyIrCisgICAgICAgICJcMTY0XDFcMTY1XDFcMTQyXDFcdWZmZmZcMVwxNDRcMVx1ZmZmZlwxXDE3MlwxXDE0MVwyXDE0NVwxXDE3MlwxIisKKyAgICAgICAgIlwxNDVcMVwxNTdcMVwxNjdcMVx1ZmZmZlwxXDE3MlwxXDE0MVwxXDE0M1wxXDE3MlwxXDE1MFwxXDE2MlwxXDE2NCIrCisgICAgICAgICJcMVwxNjNcMVwxNzFcMVx1ZmZmZlwxXDE2NFwxXDE1MVwxXDE1NlwxXDE3MlwxXDE1NFwxXDE0MVwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE3MlwxXDE0MlwxXDE0NVwxXDE1NlwxXHVmZmZmXDNcMTQxXDJcMTU0XDFcMTUxXDFcdWZmZmZcMVwxNDciKworICAgICAgICAiXDFcMTYzXDFcMTYyXDFcdWZmZmZcMVwxNzJcMVwxNDZcMVwxNzJcMVx1ZmZmZlwxXDE0MlwxXDE3MlwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE3MlwxXDE1N1wxXDE0MVwxXDE2M1wxXDE1MVwyXDE3MlwxXDE0MlwxXDE0M1wxXHVmZmZmXDFcMTcxXDEiKworICAgICAgICAiXDE0MlwxXHVmZmZmXDFcMTU0XDFcMTU2XDFcMTcyXDFcMTQyXDFcMTYzXDFcMTQyXDFcMTY0XDFcMTQ1XDFcMTY0IisKKyAgICAgICAgIlwxXDE0NVwxXDE2M1wxXDE2NFwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNTRcMlx1ZmZmZlwxXDE1NlwxXDE0MiIrCisgICAgICAgICJcMVwxNzJcMVwxNTdcMlx1ZmZmZlwxXDE1NFwxXDE0NVwxXDE3MlwxXDE1NFwxXDE0NVwxXDE0M1wxXHVmZmZmIisKKyAgICAgICAgIlwxXDE1NFwxXDE1M1wxXDE1NFwxXDE3MlwxXDE0NFwxXDE0MVwyXDE3MlwxXDE3MVwxXHVmZmZmXDFcMTQ1XDEiKworICAgICAgICAiXDE1MVwxXDE1NFwxXHVmZmZmXDFcMTU2XDFcMTQ1XDFcMTU3XDFcdWZmZmZcMVwxNDVcMVwxNzJcMlwxNDVcMSIrCisgICAgICAgICJcMTcyXDFcMTQ1XDFcdWZmZmZcMVwxNzJcMVwxNDJcMlx1ZmZmZlwzXDE3MlwxXDE0NVwyXDE3MlwxXDE0NlwxIisKKyAgICAgICAgIlwxNzJcMVx1ZmZmZlwzXDE3MlwxXHVmZmZmXDFcMTcyXDFcdWZmZmZcMVwxNTRcMlx1ZmZmZlwxXDE0NVwxXDE3MiIrCisgICAgICAgICJcMlx1ZmZmZlwxXDE3Mlw1XHVmZmZmXDFcMTQ1XDFcMTQ0XDJcdWZmZmZcMlwxNzJcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KKyAgICAgICAgIlwzMlx1ZmZmZlwxXDYyXDFcNjNcMVx1ZmZmZlwxXDc3XDFcMTAwXDFcMTAxXDFcMTAyXDFcMTAzXDFcMTA0IisKKyAgICAgICAgIlwxXDEwNVwxXDExMFw2XHVmZmZmXDFcMTQ1XDJcMTQ2XDFcMTUxXDFcMTUyXDFcdWZmZmZcMVwyNVwxXDFcMSIrCisgICAgICAgICJcMlwxXDEzN1wxXDNcMVwxMzRcNFx1ZmZmZlwxXDE0NVwzXHVmZmZmXDFcNlwxXDM3XDFcMzBcMVw3XDFcMjIiKworICAgICAgICAiXDFcNDBcMVwzMVwxXDEwXDFcMzNcMVwzMlwxXDExXDFcMTQ3XDFcMTUwXDFcMzRcMVwxMlwxXDM1XDFcdWZmZmYiKworICAgICAgICAiXDFcMzZcMVwxN1wxXDIwXDFcMjZcMVwyMVwxXHVmZmZmXDFcNDFcMVwyN1wxXDEzNlwxXDEzM1wzMlx1ZmZmZiIrCisgICAgICAgICJcMVw2MlwxXDYzXDFcdWZmZmZcMVw3N1wxXDEwMFwxXDEwMVwxXDEwMlwxXDEwM1wxXDEwNFwxXDEwNVwxXDExMCIrCisgICAgICAgICJcMVwxMzVcMVwxMTRcNFx1ZmZmZlwxXDE0MlwxXHVmZmZmXDFcMTQzXDFcMTQ0XDFcMTQ2XDFcMTUxXDFcMTUiKworICAgICAgICAiXDFcMTNcMTBcdWZmZmZcMVwxNlwxXDE0XDFcMjNcMVwyNFw1XHVmZmZmXDFcNzRcMVwxMTFcNVx1ZmZmZlwxIisKKyAgICAgICAgIlwxMDdcMTVcdWZmZmZcMVwxMjFcMjRcdWZmZmZcMVw0MlwxXDE0MFw0XHVmZmZmXDFcMTE3XDFcdWZmZmZcMSIrCisgICAgICAgICJcNTFcMVw3MFwxNFx1ZmZmZlwxXDY3XDFcdWZmZmZcMVwxMjJcMTBcdWZmZmZcMVwxMjdcMTFcdWZmZmZcMVwxMTIiKworICAgICAgICAiXDZcdWZmZmZcMVwxMTZcNFx1ZmZmZlwxXDY0XDZcdWZmZmZcMVwxMjNcM1x1ZmZmZlwxXDY2XDNcdWZmZmZcMSIrCisgICAgICAgICJcMTQxXDJcdWZmZmZcMVw0N1wxMVx1ZmZmZlwxXDUwXDJcdWZmZmZcMVwxMzJcMTRcdWZmZmZcMVwxMjBcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxMjVcMVx1ZmZmZlwxXDQ0XDFcMTEzXDRcdWZmZmZcMVw2NVwxXDQ1XDZcdWZmZmZcMVwxMjZcMTFcdWZmZmYiKworICAgICAgICAiXDFcMTI0XDNcdWZmZmZcMVw0M1wzXHVmZmZmXDFcMTMwXDZcdWZmZmZcMVwxMTVcMlx1ZmZmZlwxXDYxXDFcNzMiKworICAgICAgICAiXDEwXHVmZmZmXDFcNTNcM1x1ZmZmZlwxXDcyXDFcdWZmZmZcMVw1N1wxXHVmZmZmXDFcNzVcMVw0XDJcdWZmZmYiKworICAgICAgICAiXDFcNDZcMVw1NlwxXHVmZmZmXDFcNTJcMVw3NlwxXDU0XDFcNzFcMVw1NVwyXHVmZmZmXDFcNVwxXDEwNlwyIisKKyAgICAgICAgIlx1ZmZmZlwxXDYwXDFcMTMxIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcdTAxN2VcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxMVw1N1wyXDU2XDJcNTdcMVw1NlwyMlw1N1wxXDU2XDFcMTNcMVw1NFwxXDQyXDFcNTNcMVwxMlwxIisKKyAgICAgICAgICAgICJcM1wxXDU1XDFcMzZcMVwzN1wxXDEwXDFcNlwxXDQwXDFcN1wxXDE2XDFcMTFcMVw1MFwxMVw1MVwxXDQ1IisKKyAgICAgICAgICAgICJcMVw0NFwxXDE1XDFcMVwxXDE0XDFcMTdcMVwzNVwzMlw1M1wxXDQzXDFcNTdcMVw0MVwxXDUyXDFcNTMiKworICAgICAgICAgICAgIlwxXDU3XDFcMjNcMVwzNFwxXDI0XDFcMjdcMVw1XDFcMjJcMlw1M1wxXDIxXDRcNTNcMVwzMFwxXDUzIisKKyAgICAgICAgICAgICJcMVwzMVwxXDUzXDFcMjVcMVw0XDFcNDdcMVwyNlwxXDIwXDFcNDZcM1w1M1wxXDMyXDFcMlwxXDMzXHVmZjgyIisKKyAgICAgICAgICAgICJcNTciLAorICAgICAgICAgICAgIlwxXDYwXDFcNjEiLAorICAgICAgICAgICAgIlwxXDYzIiwKKyAgICAgICAgICAgICJcMVw2NSIsCisgICAgICAgICAgICAiXDFcNjdcMVw3MFwxXHVmZmZmXDFcNzFcMVx1ZmZmZlwxXDcyIiwKKyAgICAgICAgICAgICJcMVw3NlwxXHVmZmZmXDFcNzVcMTFcdWZmZmZcMVw3NCIsCisgICAgICAgICAgICAiXDFcMTAwXDIxXHVmZmZmXDFcNzciLAorICAgICAgICAgICAgIlwxXDEwNFwxN1x1ZmZmZlwxXDEwMlwxXDEwMyIsCisgICAgICAgICAgICAiXDFcMTA3XDIyXHVmZmZmXDFcMTA2IiwKKyAgICAgICAgICAgICJcMVwxMTJcNFx1ZmZmZlwxXDExM1wxNVx1ZmZmZlwxXDExMSIsCisgICAgICAgICAgICAiXDFcMTE1IiwKKyAgICAgICAgICAgICJcMVwxMTciLAorICAgICAgICAgICAgIlwxXDEyMSIsCisgICAgICAgICAgICAiXDFcMTIzIiwKKyAgICAgICAgICAgICJcMVwxMjUiLAorICAgICAgICAgICAgIlwxXDEzMFwxM1x1ZmZmZlwxXDEyNyIsCisgICAgICAgICAgICAiXDFcMTMyIiwKKyAgICAgICAgICAgICJcMVwxMzZcNlx1ZmZmZlwxXDEzM1wxXDEzNFw0XHVmZmZmXDFcMTM1IiwKKyAgICAgICAgICAgICJcMVwxMzdcN1x1ZmZmZlwxXDE0MVw1XHVmZmZmXDFcMTQwIiwKKyAgICAgICAgICAgICJcMVwxNDNcMVx1ZmZmZlwxXDE0Mlw0XHVmZmZmXDFcMTQ0IiwKKyAgICAgICAgICAgICJcMVwxNDZcMjBcdWZmZmZcMVwxNDUiLAorICAgICAgICAgICAgIlwxXDE0N1wxMVx1ZmZmZlwxXDE1MCIsCisgICAgICAgICAgICAiXDFcMTUxXDJcdWZmZmZcMVwxNTIiLAorICAgICAgICAgICAgIlwxXDE1M1wzXHVmZmZmXDFcMTU0XDVcdWZmZmZcMVwxNTZcNFx1ZmZmZlwxXDE1NSIsCisgICAgICAgICAgICAiXDFcMTYwXDExXHVmZmZmXDFcMTU3XDVcdWZmZmZcMVwxNjEiLAorICAgICAgICAgICAgIlwxXDE2MlwyMFx1ZmZmZlwxXDE2MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE2NiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDE3NyIsCisgICAgICAgICAgICAiXDFcdTAwODEiLAorICAgICAgICAgICAgIlwxXHUwMDgzXDExXHVmZmZmXDFcdTAwODRcNlx1ZmZmZlwxXHUwMDgyIiwKKyAgICAgICAgICAgICJcMTJcdTAwODZcMTBcdWZmZmZcMVx1MDA4OFwxXHVmZmZmXDNcdTAwODhcNVx1ZmZmZlwxXHUwMDg4IisKKyAgICAgICAgICAgICJcMTNcdWZmZmZcMVx1MDA4NVw2XHVmZmZmXDFcdTAwODZcMlx1ZmZmZlwxXHUwMDg4XDFcdWZmZmZcMyIrCisgICAgICAgICAgICAiXHUwMDg4XDVcdWZmZmZcMVx1MDA4OFwxM1x1ZmZmZlwxXHUwMDg1IiwKKyAgICAgICAgICAgICJcMTJcdTAwODZcMTBcdWZmZmZcMVx1MDA4OFwxXHVmZmZmXDNcdTAwODhcNVx1ZmZmZlwxXHUwMDg4IisKKyAgICAgICAgICAgICJcMjJcdWZmZmZcMVx1MDA4NlwyXHVmZmZmXDFcdTAwODhcMVx1ZmZmZlwzXHUwMDg4XDVcdWZmZmZcMSIrCisgICAgICAgICAgICAiXHUwMDg4IiwKKyAgICAgICAgICAgICJcMVw3M1wzNFx1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDhiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA4ZCIsCisgICAgICAgICAgICAiXDFcdTAwOGUiLAorICAgICAgICAgICAgIlwxXHUwMDhmIiwKKyAgICAgICAgICAgICJcMVx1MDA5MCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA5MVwxNlx1ZmZmZlwxXHUwMDkyIiwKKyAgICAgICAgICAgICJcMVx1MDA5MyIsCisgICAgICAgICAgICAiXDFcdTAwOTQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwOTUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA5NyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA5OVw1XHVmZmZmXDFcdTAwOWEiLAorICAgICAgICAgICAgIlwxXHUwMDliIiwKKyAgICAgICAgICAgICJcMVx1MDA5ZFwyXHVmZmZmXDFcdTAwOWMiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDBhMCIsCisgICAgICAgICAgICAiXDFcdTAwYTEiLAorICAgICAgICAgICAgIlwxXHUwMGEyIiwKKyAgICAgICAgICAgICJcMVx1MDBhMyIsCisgICAgICAgICAgICAiXDFcdTAwYTQiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAwYTYiLAorICAgICAgICAgICAgIlwxXHUwMGE3XDFcdTAwYTgiLAorICAgICAgICAgICAgIlwxXHUwMGE5XDRcdWZmZmZcMVx1MDBhYVwxNVx1ZmZmZlwxXHUwMGFiIiwKKyAgICAgICAgICAgICJcMVx1MDBhYyIsCisgICAgICAgICAgICAiXDFcdTAwYWQiLAorICAgICAgICAgICAgIlwxXHUwMGFlIiwKKyAgICAgICAgICAgICJcMVx1MDBiMFw1XHVmZmZmXDFcdTAwYWYiLAorICAgICAgICAgICAgIlwxXHUwMGIxIiwKKyAgICAgICAgICAgICJcMVx1MDBiMiIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDBiNCIsCisgICAgICAgICAgICAiXDFcdTAwYjUiLAorICAgICAgICAgICAgIlwxXHUwMGI2IiwKKyAgICAgICAgICAgICJcMVx1MDBiNyIsCisgICAgICAgICAgICAiXDFcdTAwYjgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBiOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBiYSIsCisgICAgICAgICAgICAiXDFcdTAwYmIiLAorICAgICAgICAgICAgIlwxXHUwMGJjIiwKKyAgICAgICAgICAgICJcMVx1MDBiZVwzXHVmZmZmXDFcdTAwYmQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDEyXHUwMDg2XDEwXHVmZmZmXDFcdTAwODhcMVx1ZmZmZlwzXHUwMDg4XDVcdWZmZmZcMVx1MDA4OCIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwODZcMlx1ZmZmZlwxXHUwMDg4XDFcdWZmZmZcM1x1MDA4OFw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDA4OCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYmZcMVx1ZmZmZlwxXHUwMGMwIiwKKyAgICAgICAgICAgICJcMVx1MDBjMSIsCisgICAgICAgICAgICAiXDFcdTAwYzIiLAorICAgICAgICAgICAgIlwxXHUwMGMzIiwKKyAgICAgICAgICAgICJcMVx1MDBjNCIsCisgICAgICAgICAgICAiXDFcdTAwYzUiLAorICAgICAgICAgICAgIlwxXHUwMGM2IiwKKyAgICAgICAgICAgICJcMVx1MDBjNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAwY2EiLAorICAgICAgICAgICAgIlwxXHUwMGNiIiwKKyAgICAgICAgICAgICJcMVx1MDBjYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGNkIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMGNmIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBkMiIsCisgICAgICAgICAgICAiXDFcdTAwZDMiLAorICAgICAgICAgICAgIlwxXHUwMGQ0IiwKKyAgICAgICAgICAgICJcMVx1MDBkNSIsCisgICAgICAgICAgICAiXDFcdTAwZDYiLAorICAgICAgICAgICAgIlwxXHUwMGQ3IiwKKyAgICAgICAgICAgICJcMVx1MDBkOCIsCisgICAgICAgICAgICAiXDFcdTAwZDkiLAorICAgICAgICAgICAgIlwxXHUwMGRhIiwKKyAgICAgICAgICAgICJcMVx1MDBkYiIsCisgICAgICAgICAgICAiXDFcdTAwZGMiLAorICAgICAgICAgICAgIlwxXHUwMGRkIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZGYiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAwZTEiLAorICAgICAgICAgICAgIlwxXHUwMGUyIiwKKyAgICAgICAgICAgICJcMVx1MDBlM1wxNFx1ZmZmZlwxXHUwMGU0IiwKKyAgICAgICAgICAgICJcMVx1MDBlNSIsCisgICAgICAgICAgICAiXDFcdTAwZTYiLAorICAgICAgICAgICAgIlwxXHUwMGU3IiwKKyAgICAgICAgICAgICJcMVx1MDBlOCIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDBlYSIsCisgICAgICAgICAgICAiXDFcdTAwZWIiLAorICAgICAgICAgICAgIlwxXHUwMGVjIiwKKyAgICAgICAgICAgICJcMVx1MDBlZCIsCisgICAgICAgICAgICAiXDFcdTAwZWUiLAorICAgICAgICAgICAgIlwxXHUwMGVmIiwKKyAgICAgICAgICAgICJcMVx1MDBmMCIsCisgICAgICAgICAgICAiXDFcdTAwZjEiLAorICAgICAgICAgICAgIlwxXHUwMGYyIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmNCIsCisgICAgICAgICAgICAiXDFcdTAwZjUiLAorICAgICAgICAgICAgIlwxXHUwMGY2IiwKKyAgICAgICAgICAgICJcMVx1MDBmNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBmOCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGY5IiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMGZiIiwKKyAgICAgICAgICAgICJcMVx1MDBmYyIsCisgICAgICAgICAgICAiXDFcdTAwZmQiLAorICAgICAgICAgICAgIlwxXHUwMGZlIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTAwIiwKKyAgICAgICAgICAgICJcMVx1MDEwMSIsCisgICAgICAgICAgICAiXDFcdTAxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTAzIiwKKyAgICAgICAgICAgICJcMVx1MDEwNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEwNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTA3IiwKKyAgICAgICAgICAgICJcMVx1MDEwOCIsCisgICAgICAgICAgICAiXDFcdTAxMDkiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAxMGIiLAorICAgICAgICAgICAgIlwxXHUwMTBjIiwKKyAgICAgICAgICAgICJcMVx1MDEwZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTBmIiwKKyAgICAgICAgICAgICJcMVx1MDExMCIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDExMiIsCisgICAgICAgICAgICAiXDFcdTAxMTMiLAorICAgICAgICAgICAgIlwxXHUwMTE0IiwKKyAgICAgICAgICAgICJcMVx1MDExNVwxNlx1ZmZmZlwxXHUwMTE2IiwKKyAgICAgICAgICAgICJcMVx1MDExNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDExOCIsCisgICAgICAgICAgICAiXDFcdTAxMTkiLAorICAgICAgICAgICAgIlwxXHUwMTFhIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTFjIiwKKyAgICAgICAgICAgICJcMVx1MDExZCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTFmIiwKKyAgICAgICAgICAgICJcMVx1MDEyMCIsCisgICAgICAgICAgICAiXDFcdTAxMjEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMjIiLAorICAgICAgICAgICAgIlwxXHUwMTIzIiwKKyAgICAgICAgICAgICJcMVx1MDEyNCIsCisgICAgICAgICAgICAiXDFcdTAxMjUiLAorICAgICAgICAgICAgIlwxXHUwMTI2IiwKKyAgICAgICAgICAgICJcMVx1MDEyNyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEyOCIsCisgICAgICAgICAgICAiXDFcdTAxMjkiLAorICAgICAgICAgICAgIlwxXHUwMTJhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAxMmMiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEyZSIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAxMzEiLAorICAgICAgICAgICAgIlwxXHUwMTMyIiwKKyAgICAgICAgICAgICJcMVx1MDEzMyIsCisgICAgICAgICAgICAiXDFcdTAxMzQiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDEzNyIsCisgICAgICAgICAgICAiXDFcdTAxMzgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMzkiLAorICAgICAgICAgICAgIlwxXHUwMTNhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTNiIiwKKyAgICAgICAgICAgICJcMVx1MDEzYyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDEzZSIsCisgICAgICAgICAgICAiXDFcdTAxM2YiLAorICAgICAgICAgICAgIlwxXHUwMTQwIiwKKyAgICAgICAgICAgICJcMVx1MDE0MSIsCisgICAgICAgICAgICAiXDFcdTAxNDIiLAorICAgICAgICAgICAgIlwxXHUwMTQzIiwKKyAgICAgICAgICAgICJcMVx1MDE0NCIsCisgICAgICAgICAgICAiXDFcdTAxNDUiLAorICAgICAgICAgICAgIlwxXHUwMTQ2IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE0OCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQ5IiwKKyAgICAgICAgICAgICJcMVx1MDE0YSIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDE0YyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTRkIiwKKyAgICAgICAgICAgICJcMVx1MDE0ZSIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDE1MCIsCisgICAgICAgICAgICAiXDFcdTAxNTEiLAorICAgICAgICAgICAgIlwxXHUwMTUyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTUzIiwKKyAgICAgICAgICAgICJcMVx1MDE1NCIsCisgICAgICAgICAgICAiXDFcdTAxNTUiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAxNTciLAorICAgICAgICAgICAgIlwxXHUwMTU4IiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcdTAxNWIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNWMiLAorICAgICAgICAgICAgIlwxXHUwMTVkIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZiIsCisgICAgICAgICAgICAiXDFcdTAxNjAiLAorICAgICAgICAgICAgIlwxXHUwMTYxIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTYyIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIlwxXHUwMTY0IiwKKyAgICAgICAgICAgICJcMVx1MDE2NSIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwyMiIrCisgICAgICAgICAgICAiXDczXDFcdTAxNjZcN1w3MyIsCisgICAgICAgICAgICAiXDFcdTAxNjgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDE2YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDE2ZCIsCisgICAgICAgICAgICAiXDFcdTAxNmUiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVx1MDE3MSIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICJcMVw3M1wxM1x1ZmZmZlwxMlw3M1w3XHVmZmZmXDMyXDczXDRcdWZmZmZcMVw3M1wxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNzMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTc3IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNzgiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTdiIiwKKyAgICAgICAgICAgICJcMVx1MDE3YyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDczXDEzXHVmZmZmXDEyXDczXDdcdWZmZmZcMzJcNzNcNFx1ZmZmZlwxXDczXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw3MyIsCisgICAgICAgICAgICAiXDFcNzNcMTNcdWZmZmZcMTJcNzNcN1x1ZmZmZlwzMlw3M1w0XHVmZmZmXDFcNzNcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDczIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfZW90ID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfZW90Uyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W10gREZBMjFfZW9mID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfZW9mUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMV9taW4gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMV9taW5TKTsKKyAgICBzdGF0aWMgZmluYWwgY2hhcltdIERGQTIxX21heCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nVG9VbnNpZ25lZENoYXJzKERGQTIxX21heFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2FjY2VwdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2FjY2VwdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX3NwZWNpYWwgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9zcGVjaWFsUyk7CisgICAgc3RhdGljIGZpbmFsIHNob3J0W11bXSBERkEyMV90cmFuc2l0aW9uOworCisgICAgc3RhdGljIHsKKyAgICAgICAgaW50IG51bVN0YXRlcyA9IERGQTIxX3RyYW5zaXRpb25TLmxlbmd0aDsKKyAgICAgICAgREZBMjFfdHJhbnNpdGlvbiA9IG5ldyBzaG9ydFtudW1TdGF0ZXNdW107CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxudW1TdGF0ZXM7IGkrKykgeworICAgICAgICAgICAgREZBMjFfdHJhbnNpdGlvbltpXSA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX3RyYW5zaXRpb25TW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIERGQTIxIGV4dGVuZHMgREZBIHsKKworICAgICAgICBwdWJsaWMgREZBMjEoQmFzZVJlY29nbml6ZXIgcmVjb2duaXplcikgeworICAgICAgICAgICAgdGhpcy5yZWNvZ25pemVyID0gcmVjb2duaXplcjsKKyAgICAgICAgICAgIHRoaXMuZGVjaXNpb25OdW1iZXIgPSAyMTsKKyAgICAgICAgICAgIHRoaXMuZW90ID0gREZBMjFfZW90OworICAgICAgICAgICAgdGhpcy5lb2YgPSBERkEyMV9lb2Y7CisgICAgICAgICAgICB0aGlzLm1pbiA9IERGQTIxX21pbjsKKyAgICAgICAgICAgIHRoaXMubWF4ID0gREZBMjFfbWF4OworICAgICAgICAgICAgdGhpcy5hY2NlcHQgPSBERkEyMV9hY2NlcHQ7CisgICAgICAgICAgICB0aGlzLnNwZWNpYWwgPSBERkEyMV9zcGVjaWFsOworICAgICAgICAgICAgdGhpcy50cmFuc2l0aW9uID0gREZBMjFfdHJhbnNpdGlvbjsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuICIxOjE6IFRva2VucyA6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApOyI7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIGludCBzcGVjaWFsU3RhdGVUcmFuc2l0aW9uKGludCBzLCBJbnRTdHJlYW0gX2lucHV0KSB0aHJvd3MgTm9WaWFibGVBbHRFeGNlcHRpb24geworICAgICAgICAgICAgSW50U3RyZWFtIGlucHV0ID0gX2lucHV0OworICAgICAgICAJaW50IF9zID0gczsKKyAgICAgICAgICAgIHN3aXRjaCAoIHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMCA6IAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMjFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTIxXzA9PSc9JykgKSB7cyA9IDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J3wnKSApIHtzID0gMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJicpICkge3MgPSAzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdzJykgKSB7cyA9IDQ7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKycpICkge3MgPSA2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSctJykgKSB7cyA9IDc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyonKSApIHtzID0gODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLycpICkge3MgPSA5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSclJykgKSB7cyA9IDEwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSchJykgKSB7cyA9IDExO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc+JykgKSB7cyA9IDEyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc8JykgKSB7cyA9IDEzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScuJykgKSB7cyA9IDE0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc/JykgKSB7cyA9IDE1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd2JykgKSB7cyA9IDE2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdpJykgKSB7cyA9IDE3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdmJykgKSB7cyA9IDE4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdhJykgKSB7cyA9IDE5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdjJykgKSB7cyA9IDIwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdyJykgKSB7cyA9IDIxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd1JykgKSB7cyA9IDIyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdkJykgKSB7cyA9IDIzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSduJykgKSB7cyA9IDI0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdwJykgKSB7cyA9IDI1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd7JykgKSB7cyA9IDI2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd9JykgKSB7cyA9IDI3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdiJykgKSB7cyA9IDI4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdAJykgKSB7cyA9IDI5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScoJykgKSB7cyA9IDMwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScpJykgKSB7cyA9IDMxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScsJykgKSB7cyA9IDMyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSddJykgKSB7cyA9IDMzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScjJykgKSB7cyA9IDM0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdbJykgKSB7cyA9IDM1O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc7JykgKSB7cyA9IDM2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSc6JykgKSB7cyA9IDM3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd3JykgKSB7cyA9IDM4O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd0JykgKSB7cyA9IDM5O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PScwJykgKSB7cyA9IDQwO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nMScgJiYgTEEyMV8wPD0nOScpKSApIHtzID0gNDE7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J14nKSApIHtzID0gNDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09JyQnfHwoTEEyMV8wPj0nQScgJiYgTEEyMV8wPD0nWicpfHxMQTIxXzA9PSdfJ3x8KExBMjFfMD49J2cnICYmIExBMjFfMDw9J2gnKXx8KExBMjFfMD49J2onICYmIExBMjFfMDw9J20nKXx8TEEyMV8wPT0nbyd8fExBMjFfMD09J3EnfHwoTEEyMV8wPj0neCcgJiYgTEEyMV8wPD0neicpKSApIHtzID0gNDM7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J1wiJykgKSB7cyA9IDQ0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcJycpICkge3MgPSA0NTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49J1x0JyAmJiBMQTIxXzA8PSdcbicpfHxMQTIxXzA9PSdccid8fExBMjFfMD09JyAnKSApIHtzID0gNDY7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdTAwMDAnICYmIExBMjFfMDw9J1xiJyl8fChMQTIxXzA+PSdcdTAwMEInICYmIExBMjFfMDw9J1xmJyl8fChMQTIxXzA+PSdcdTAwMEUnICYmIExBMjFfMDw9J1x1MDAxRicpfHxMQTIxXzA9PSdcXCd8fExBMjFfMD09J2AnfHwoTEEyMV8wPj0nficgJiYgTEEyMV8wPD0nXHVGRkZGJykpICkge3MgPSA0Nzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcz49MCApIHJldHVybiBzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oZ2V0RGVzY3JpcHRpb24oKSwgMjEsIF9zLCBpbnB1dCk7CisgICAgICAgICAgICBlcnJvcihudmFlKTsKKyAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgIH0KKyAgICB9CisgCisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzNjBmMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTAwMTUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci4qOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5pbXBsLio7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5BYnN0cmFjdEludGVybmFsQ29udGVudEFzc2lzdFBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuY29udGVudGFzc2lzdC5hbnRsci5pbnRlcm5hbC5ERkE7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworCisKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlciBleHRlbmRzIEFic3RyYWN0SW50ZXJuYWxDb250ZW50QXNzaXN0UGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfSUQiLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfU1RSSU5HIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICInPSciLCAiJ3x8JyIsICInJiYnIiwgIidzdGFydGFibGUnIiwgIidleGVjdXRhYmxlJyIsICInKz0nIiwgIictPSciLCAiJyo9JyIsICInLz0nIiwgIiclPSciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIic+PSciLCAiJz4nIiwgIic8JyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKiciLCAiJyoqJyIsICInLyciLCAiJyUnIiwgIichJyIsICInKysnIiwgIictLSciLCAiJy4nIiwgIid2YWwnIiwgIidleHRlbmRzJyIsICInc3RhdGljJyIsICInaW1wb3J0JyIsICInZXh0ZW5zaW9uJyIsICInc3VwZXInIiwgIidmYWxzZSciLCAiJ2FueSciLCAiJ2NyZWF0YWJsZSciLCAiJ3JlYWRhYmxlJyIsICIndXBkYXRhYmxlJyIsICInZGVsZXRhYmxlJyIsICInaW52aXNpYmxlJyIsICInZGlzYWJsZWQnIiwgIidub25lZGl0YWJsZSciLCAiJ3BhY2thZ2UnIiwgIid7JyIsICInfSciLCAiJ3JvbGUnIiwgIidlbnRpdHknIiwgIidiZWFuJyIsICInZHRvJyIsICInYWxsJyIsICIndXNlcnRhc2tzJyIsICIndXNlcnRhc2snIiwgIidwcm9jZXNzJyIsICInaXMnIiwgIidwcm9wZXJ0eSciLCAiJ3JlZmVyZW5jZSciLCAiJ0AnIiwgIicoJyIsICInKSciLCAiJywnIiwgIiddJyIsICInIyciLCAiJ1snIiwgIidpbnN0YW5jZW9mJyIsICInYXMnIiwgIic7JyIsICInaWYnIiwgIidlbHNlJyIsICInc3dpdGNoJyIsICInOiciLCAiJ2RlZmF1bHQnIiwgIidjYXNlJyIsICInZm9yJyIsICInd2hpbGUnIiwgIidkbyciLCAiJ25ldyciLCAiJ251bGwnIiwgIid0eXBlb2YnIiwgIid0aHJvdyciLCAiJ3JldHVybiciLCAiJ3RyeSciLCAiJ2ZpbmFsbHknIiwgIidzeW5jaHJvbml6ZWQnIiwgIidjYXRjaCciLCAiJz8nIiwgIicmJyIsICInOjonIiwgIic/LiciLCAiJ3wnIiwgIid2YXInIiwgIid0cnVlJyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTk9NTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTU9NTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTY9NTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTc9NTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTg9NTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTE9NTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTQ9NTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjA9NjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjM9NjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzM9MzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzA9MzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzE9MzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzI9MzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDg9NDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDk9NDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDQ9NDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDU9NDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDY9NDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDc9NDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDA9NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTE9OTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAwPTEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mj05MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mz05MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDI9MTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk0PTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMT0xMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTA9OTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY9MTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc9MTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg9MTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTk9OTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTU9OTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTY9OTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTc9OTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTg9OTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9ERUNJTUFMPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjY9MjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjc9Mjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjg9Mjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjk9Mjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ9MjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA9MjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzI9NzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9ODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzg9Nzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nIjsgfQorCisKKyAgICAgCisgICAgIAlwcml2YXRlIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgICAgIAkKKyAgICAgICAgcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisgICAgICAgIAl0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKyAgICAgICAgCXJldHVybiBncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsdWVGb3JUb2tlbk5hbWUoU3RyaW5nIHRva2VuTmFtZSkgeworICAgICAgICAJcmV0dXJuIHRva2VuTmFtZTsKKyAgICAgICAgfQorCisKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjE6MTogZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsIDogcnVsZUF1dGhvcml6YXRpb25Nb2RlbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUF1dGhvcml6YXRpb25Nb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MjoxOiAoIHJ1bGVBdXRob3JpemF0aW9uTW9kZWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzOjE6IHJ1bGVBdXRob3JpemF0aW9uTW9kZWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUF1dGhvcml6YXRpb25Nb2RlbF9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWw2Nyk7CisgICAgICAgICAgICBydWxlQXV0aG9yaXphdGlvbk1vZGVsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWw3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVBdXRob3JpemF0aW9uTW9kZWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzA6MTogcnVsZUF1dGhvcml6YXRpb25Nb2RlbCA6ICggKCBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50ICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUF1dGhvcml6YXRpb25Nb2RlbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NDoyOiAoICggKCBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NToxOiAoICggcnVsZV9fQXV0aG9yaXphdGlvbk1vZGVsX19QY2tnQXNzaWdubWVudCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc1OjE6ICggKCBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzY6MTogKCBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsQWNjZXNzKCkuZ2V0UGNrZ0Fzc2lnbm1lbnQoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc6MTogKCBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3OjI6IHJ1bGVfX0F1dGhvcml6YXRpb25Nb2RlbF9fUGNrZ0Fzc2lnbm1lbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0F1dGhvcml6YXRpb25Nb2RlbF9fUGNrZ0Fzc2lnbm1lbnRfaW5fcnVsZUF1dGhvcml6YXRpb25Nb2RlbDEwMCk7CisgICAgICAgICAgICBydWxlX19BdXRob3JpemF0aW9uTW9kZWxfX1Bja2dBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbEFjY2VzcygpLmdldFBja2dBc3NpZ25tZW50KCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQXV0aG9yaXphdGlvbk1vZGVsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg5OjE6IGVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIDogcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQXV0aG9yaXphdGlvblBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTA6MTogKCBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkxOjE6IHJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVBdXRob3JpemF0aW9uUGFja2FnZV9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uUGFja2FnZTEyNyk7CisgICAgICAgICAgICBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQXV0aG9yaXphdGlvblBhY2thZ2UxMzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODoxOiBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgOiAoICggcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjoyOiAoICggKCBydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMzoxOiAoICggcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAzOjE6ICggKCBydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDQ6MTogKCBydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNToxOiAoIHJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU6MjogcnVsZV9fQXV0aG9yaXphdGlvblBhY2thZ2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19BdXRob3JpemF0aW9uUGFja2FnZV9fR3JvdXBfXzBfaW5fcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlMTYwKTsKKyAgICAgICAgICAgIHJ1bGVfX0F1dGhvcml6YXRpb25QYWNrYWdlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQXV0aG9yaXphdGlvblBhY2thZ2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTc6MTogZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCA6IHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTg6MTogKCBydWxlQXV0aG9yaXphdGlvbkltcG9ydCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE5OjE6IHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvbkltcG9ydF9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0MTg3KTsKKyAgICAgICAgICAgIHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydDE5NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQXV0aG9yaXphdGlvbkltcG9ydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjY6MTogcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgOiAoICggcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlQXV0aG9yaXphdGlvbkltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzA6MjogKCAoICggcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMToxOiAoICggcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzE6MTogKCAoIHJ1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMyOjE6ICggcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMzOjE6ICggcnVsZV9fQXV0aG9yaXphdGlvbkltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMzOjI6IHJ1bGVfX0F1dGhvcml6YXRpb25JbXBvcnRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19BdXRob3JpemF0aW9uSW1wb3J0X19Hcm91cF9fMF9pbl9ydWxlQXV0aG9yaXphdGlvbkltcG9ydDIyMCk7CisgICAgICAgICAgICBydWxlX19BdXRob3JpemF0aW9uSW1wb3J0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVBdXRob3JpemF0aW9uSW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ1OjE6IGVudHJ5UnVsZVJvbGUgOiBydWxlUm9sZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVJvbGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ2OjE6ICggcnVsZVJvbGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NzoxOiBydWxlUm9sZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVfaW5fZW50cnlSdWxlUm9sZTI0Nyk7CisgICAgICAgICAgICBydWxlUm9sZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGUyNTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU0OjE6IHJ1bGVSb2xlIDogKCAoIHJ1bGVfX1JvbGVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU4OjI6ICggKCAoIHJ1bGVfX1JvbGVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTk6MTogKCAoIHJ1bGVfX1JvbGVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU5OjE6ICggKCBydWxlX19Sb2xlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MDoxOiAoIHJ1bGVfX1JvbGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MToxOiAoIHJ1bGVfX1JvbGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MToyOiBydWxlX19Sb2xlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZV9fR3JvdXBfXzBfaW5fcnVsZVJvbGUyODApOworICAgICAgICAgICAgcnVsZV9fUm9sZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRWxlbWVudCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzM6MTogZW50cnlSdWxlUm9sZUVsZW1lbnQgOiBydWxlUm9sZUVsZW1lbnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzQ6MTogKCBydWxlUm9sZUVsZW1lbnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NToxOiBydWxlUm9sZUVsZW1lbnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVsZW1lbnRfaW5fZW50cnlSdWxlUm9sZUVsZW1lbnQzMDcpOworICAgICAgICAgICAgcnVsZVJvbGVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVFbGVtZW50MzE0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRWxlbWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUVsZW1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgyOjE6IHJ1bGVSb2xlRWxlbWVudCA6ICggKCBydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVFbGVtZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NjoyOiAoICggKCBydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODc6MTogKCAoIHJ1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODc6MTogKCAoIHJ1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODg6MTogKCBydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg5OjE6ICggcnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODk6MjogcnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlc19pbl9ydWxlUm9sZUVsZW1lbnQzNDApOworICAgICAgICAgICAgcnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVFbGVtZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVFbnRpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxOjE6IGVudHJ5UnVsZVJvbGVFbnRpdHkgOiBydWxlUm9sZUVudGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVJvbGVFbnRpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAyOjE6ICggcnVsZVJvbGVFbnRpdHkgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMzoxOiBydWxlUm9sZUVudGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnRpdHlfaW5fZW50cnlSdWxlUm9sZUVudGl0eTM2Nyk7CisgICAgICAgICAgICBydWxlUm9sZUVudGl0eSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVFbnRpdHkzNzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVFbnRpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVFbnRpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEwOjE6IHJ1bGVSb2xlRW50aXR5IDogKCAoIHJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVFbnRpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE0OjI6ICggKCAoIHJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTU6MTogKCAoIHJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE1OjE6ICggKCBydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNjoxOiAoIHJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNzoxOiAoIHJ1bGVfX1JvbGVFbnRpdHlfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNzoyOiBydWxlX19Sb2xlRW50aXR5X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzBfaW5fcnVsZVJvbGVFbnRpdHk0MDApOworICAgICAgICAgICAgcnVsZV9fUm9sZUVudGl0eV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUVudGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlQmVhbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjk6MTogZW50cnlSdWxlUm9sZUJlYW4gOiBydWxlUm9sZUJlYW4gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlQmVhbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA6MTogKCBydWxlUm9sZUJlYW4gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMToxOiBydWxlUm9sZUJlYW4gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJlYW5faW5fZW50cnlSdWxlUm9sZUJlYW40MjcpOworICAgICAgICAgICAgcnVsZVJvbGVCZWFuKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCZWFuNDM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW4iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM4OjE6IHJ1bGVSb2xlQmVhbiA6ICggKCBydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJlYW4oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQyOjI6ICggKCAoIHJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQzOjE6ICggKCBydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDM6MTogKCAoIHJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NDoxOiAoIHJ1bGVfX1JvbGVCZWFuX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ1OjE6ICggcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NToyOiBydWxlX19Sb2xlQmVhbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVCZWFuX19Hcm91cF9fMF9pbl9ydWxlUm9sZUJlYW40NjApOworICAgICAgICAgICAgcnVsZV9fUm9sZUJlYW5fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmVhbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRHRvIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NzoxOiBlbnRyeVJ1bGVSb2xlRHRvIDogcnVsZVJvbGVEdG8gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlRHRvKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODoxOiAoIHJ1bGVSb2xlRHRvIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTk6MTogcnVsZVJvbGVEdG8gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvX2luX2VudHJ5UnVsZVJvbGVEdG80ODcpOworICAgICAgICAgICAgcnVsZVJvbGVEdG8oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRHRvNDk0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRHRvIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2NjoxOiBydWxlUm9sZUR0byA6ICggKCBydWxlX19Sb2xlRHRvX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVSb2xlRHRvKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MDoyOiAoICggKCBydWxlX19Sb2xlRHRvX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjcxOjE6ICggKCBydWxlX19Sb2xlRHRvX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MToxOiAoICggcnVsZV9fUm9sZUR0b19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzI6MTogKCBydWxlX19Sb2xlRHRvX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzM6MTogKCBydWxlX19Sb2xlRHRvX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzM6MjogcnVsZV9fUm9sZUR0b19fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVEdG9fX0dyb3VwX18wX2luX3J1bGVSb2xlRHRvNTIwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVEdG9fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVEdG8iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg1OjE6IGVudHJ5UnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIDogcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg2OjE6ICggcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODc6MTogcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzX2luX2VudHJ5UnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzNTQ3KTsKKyAgICAgICAgICAgIHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrczU1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NDoxOiBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgOiAoICggcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5ODoyOiAoICggKCBydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5OToxOiAoICggcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk5OjE6ICggKCBydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDA6MTogKCBydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMToxOiAoIHJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDE6MjogcnVsZV9fUm9sZUJsaXBBbGxVc2VyVGFza3NfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Sb2xlQmxpcEFsbFVzZXJUYXNrc19fR3JvdXBfXzBfaW5fcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzNTgwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVCbGlwQWxsVXNlclRhc2tzX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzayIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTM6MTogZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzayA6IHJ1bGVSb2xlQmxpcFVzZXJUYXNrIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTQ6MTogKCBydWxlUm9sZUJsaXBVc2VyVGFzayBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE1OjE6IHJ1bGVSb2xlQmxpcFVzZXJUYXNrIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJsaXBVc2VyVGFza19pbl9lbnRyeVJ1bGVSb2xlQmxpcFVzZXJUYXNrNjA3KTsKKyAgICAgICAgICAgIHJ1bGVSb2xlQmxpcFVzZXJUYXNrKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzazYxNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzayIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJsaXBVc2VyVGFzayIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjI6MTogcnVsZVJvbGVCbGlwVXNlclRhc2sgOiAoICggcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJsaXBVc2VyVGFzaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjY6MjogKCAoICggcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNzoxOiAoICggcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjc6MTogKCAoIHJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI4OjE6ICggcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI5OjE6ICggcnVsZV9fUm9sZUJsaXBVc2VyVGFza19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI5OjI6IHJ1bGVfX1JvbGVCbGlwVXNlclRhc2tfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMF9pbl9ydWxlUm9sZUJsaXBVc2VyVGFzazY0MCk7CisgICAgICAgICAgICBydWxlX19Sb2xlQmxpcFVzZXJUYXNrX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmxpcFVzZXJUYXNrIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVCbGlwUHJvY2VzcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNDE6MTogZW50cnlSdWxlUm9sZUJsaXBQcm9jZXNzIDogcnVsZVJvbGVCbGlwUHJvY2VzcyBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVJvbGVCbGlwUHJvY2VzcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNDI6MTogKCBydWxlUm9sZUJsaXBQcm9jZXNzIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNDM6MTogcnVsZVJvbGVCbGlwUHJvY2VzcyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJsaXBQcm9jZXNzX2luX2VudHJ5UnVsZVJvbGVCbGlwUHJvY2VzczY2Nyk7CisgICAgICAgICAgICBydWxlUm9sZUJsaXBQcm9jZXNzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlQmxpcFByb2Nlc3M2NzQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVCbGlwUHJvY2VzcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJsaXBQcm9jZXNzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM1MDoxOiBydWxlUm9sZUJsaXBQcm9jZXNzIDogKCAoIHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJsaXBQcm9jZXNzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM1NDoyOiAoICggKCBydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNTU6MTogKCAoIHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNTU6MTogKCAoIHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNTY6MTogKCBydWxlX19Sb2xlQmxpcFByb2Nlc3NfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzU3OjE6ICggcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNTc6MjogcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUJsaXBQcm9jZXNzX19Hcm91cF9fMF9pbl9ydWxlUm9sZUJsaXBQcm9jZXNzNzAwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVCbGlwUHJvY2Vzc19fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmxpcFByb2Nlc3MiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzY5OjE6IGVudHJ5UnVsZVJvbGVFbnRpdHlGZWF0dXJlIDogcnVsZVJvbGVFbnRpdHlGZWF0dXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzcwOjE6ICggcnVsZVJvbGVFbnRpdHlGZWF0dXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNzE6MTogcnVsZVJvbGVFbnRpdHlGZWF0dXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnRpdHlGZWF0dXJlX2luX2VudHJ5UnVsZVJvbGVFbnRpdHlGZWF0dXJlNzI3KTsKKyAgICAgICAgICAgIHJ1bGVSb2xlRW50aXR5RmVhdHVyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5RmVhdHVyZTczNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVFbnRpdHlGZWF0dXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM3ODoxOiBydWxlUm9sZUVudGl0eUZlYXR1cmUgOiAoICggcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVSb2xlRW50aXR5RmVhdHVyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODI6MjogKCAoICggcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzgzOjE6ICggKCBydWxlX19Sb2xlRW50aXR5RmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzgzOjE6ICggKCBydWxlX19Sb2xlRW50aXR5RmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzg0OjE6ICggcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM4NToxOiAoIHJ1bGVfX1JvbGVFbnRpdHlGZWF0dXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzg1OjI6IHJ1bGVfX1JvbGVFbnRpdHlGZWF0dXJlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVFbnRpdHlGZWF0dXJlX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVJvbGVFbnRpdHlGZWF0dXJlNzYwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVFbnRpdHlGZWF0dXJlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRW50aXR5RmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM5NzoxOiBlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIDogcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM5ODoxOiAoIHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozOTk6MTogcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRW50aXR5QXR0cmlidXRlX2luX2VudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGU3ODcpOworICAgICAgICAgICAgcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlNzk0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQwNjoxOiBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSA6ICggKCBydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQxMDoyOiAoICggKCBydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDExOjE6ICggKCBydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQxMToxOiAoICggcnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MTI6MTogKCBydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MTM6MTogKCBydWxlX19Sb2xlRW50aXR5QXR0cmlidXRlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MTM6MjogcnVsZV9fUm9sZUVudGl0eUF0dHJpYnV0ZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18wX2luX3J1bGVSb2xlRW50aXR5QXR0cmlidXRlODIwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVFbnRpdHlBdHRyaWJ1dGVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MjU6MTogZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZSA6IHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MjY6MTogKCBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDI3OjE6IHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eVJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlODQ3KTsKKyAgICAgICAgICAgIHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZTg1NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUVudGl0eVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MzQ6MTogcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UgOiAoICggcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzg6MjogKCAoICggcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQzOToxOiAoICggcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzk6MTogKCAoIHJ1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQwOjE6ICggcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQxOjE6ICggcnVsZV9fUm9sZUVudGl0eVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQxOjI6IHJ1bGVfX1JvbGVFbnRpdHlSZWZlcmVuY2VfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMF9pbl9ydWxlUm9sZUVudGl0eVJlZmVyZW5jZTg4MCk7CisgICAgICAgICAgICBydWxlX19Sb2xlRW50aXR5UmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NTM6MTogZW50cnlSdWxlUm9sZUJlYW5GZWF0dXJlIDogcnVsZVJvbGVCZWFuRmVhdHVyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NTQ6MTogKCBydWxlUm9sZUJlYW5GZWF0dXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NTU6MTogcnVsZVJvbGVCZWFuRmVhdHVyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJlYW5GZWF0dXJlX2luX2VudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZTkwNyk7CisgICAgICAgICAgICBydWxlUm9sZUJlYW5GZWF0dXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmU5MTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5GZWF0dXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ2MjoxOiBydWxlUm9sZUJlYW5GZWF0dXJlIDogKCAoIHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVCZWFuRmVhdHVyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NjY6MjogKCAoICggcnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ2NzoxOiAoICggcnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Njc6MTogKCAoIHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDY4OjE6ICggcnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDY5OjE6ICggcnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDY5OjI6IHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Sb2xlQmVhbkZlYXR1cmVfX0FsdGVybmF0aXZlc19pbl9ydWxlUm9sZUJlYW5GZWF0dXJlOTQwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVCZWFuRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0ODE6MTogZW50cnlSdWxlUm9sZUJlYW5BdHRyaWJ1dGUgOiBydWxlUm9sZUJlYW5BdHRyaWJ1dGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0ODI6MTogKCBydWxlUm9sZUJlYW5BdHRyaWJ1dGUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ4MzoxOiBydWxlUm9sZUJlYW5BdHRyaWJ1dGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJlYW5BdHRyaWJ1dGVfaW5fZW50cnlSdWxlUm9sZUJlYW5BdHRyaWJ1dGU5NjcpOworICAgICAgICAgICAgcnVsZVJvbGVCZWFuQXR0cmlidXRlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlOTc0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5BdHRyaWJ1dGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDkwOjE6IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSA6ICggKCBydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJlYW5BdHRyaWJ1dGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk0OjI6ICggKCAoIHJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk1OjE6ICggKCBydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0OTU6MTogKCAoIHJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ5NjoxOiAoIHJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk3OjE6ICggcnVsZV9fUm9sZUJlYW5BdHRyaWJ1dGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ5NzoyOiBydWxlX19Sb2xlQmVhbkF0dHJpYnV0ZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMF9pbl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGUxMDAwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVCZWFuQXR0cmlidXRlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUJlYW5BdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJlYW5SZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTA5OjE6IGVudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlIDogcnVsZVJvbGVCZWFuUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUJlYW5SZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTEwOjE6ICggcnVsZVJvbGVCZWFuUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1MTE6MTogcnVsZVJvbGVCZWFuUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuUmVmZXJlbmNlX2luX2VudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlMTAyNyk7CisgICAgICAgICAgICBydWxlUm9sZUJlYW5SZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUJlYW5SZWZlcmVuY2UxMDM0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5SZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTE4OjE6IHJ1bGVSb2xlQmVhblJlZmVyZW5jZSA6ICggKCBydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJlYW5SZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTIyOjI6ICggKCAoIHJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTIzOjE6ICggKCBydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1MjM6MTogKCAoIHJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUyNDoxOiAoIHJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTI1OjE6ICggcnVsZV9fUm9sZUJlYW5SZWZlcmVuY2VfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUyNToyOiBydWxlX19Sb2xlQmVhblJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMF9pbl9ydWxlUm9sZUJlYW5SZWZlcmVuY2UxMDYwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVCZWFuUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUJlYW5SZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUR0b0ZlYXR1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTM3OjE6IGVudHJ5UnVsZVJvbGVEdG9GZWF0dXJlIDogcnVsZVJvbGVEdG9GZWF0dXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUR0b0ZlYXR1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTM4OjE6ICggcnVsZVJvbGVEdG9GZWF0dXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Mzk6MTogcnVsZVJvbGVEdG9GZWF0dXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvRmVhdHVyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVEdG9GZWF0dXJlX2luX2VudHJ5UnVsZVJvbGVEdG9GZWF0dXJlMTA4Nyk7CisgICAgICAgICAgICBydWxlUm9sZUR0b0ZlYXR1cmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvRmVhdHVyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUR0b0ZlYXR1cmUxMDk0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUR0b0ZlYXR1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTQ2OjE6IHJ1bGVSb2xlRHRvRmVhdHVyZSA6ICggKCBydWxlX19Sb2xlRHRvRmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVEdG9GZWF0dXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU1MDoyOiAoICggKCBydWxlX19Sb2xlRHRvRmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTE6MTogKCAoIHJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTE6MTogKCAoIHJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTI6MTogKCBydWxlX19Sb2xlRHRvRmVhdHVyZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTUzOjE6ICggcnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTM6MjogcnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlc19pbl9ydWxlUm9sZUR0b0ZlYXR1cmUxMTIwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRHRvRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU2NToxOiBlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlIDogcnVsZVJvbGVEdG9BdHRyaWJ1dGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU2NjoxOiAoIHJ1bGVSb2xlRHRvQXR0cmlidXRlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Njc6MTogcnVsZVJvbGVEdG9BdHRyaWJ1dGUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvQXR0cmlidXRlX2luX2VudHJ5UnVsZVJvbGVEdG9BdHRyaWJ1dGUxMTQ3KTsKKyAgICAgICAgICAgIHJ1bGVSb2xlRHRvQXR0cmlidXRlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUR0b0F0dHJpYnV0ZTExNTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVEdG9BdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVEdG9BdHRyaWJ1dGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTc0OjE6IHJ1bGVSb2xlRHRvQXR0cmlidXRlIDogKCAoIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVEdG9BdHRyaWJ1dGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTc4OjI6ICggKCAoIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Nzk6MTogKCAoIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTc5OjE6ICggKCBydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU4MDoxOiAoIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU4MToxOiAoIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU4MToyOiBydWxlX19Sb2xlRHRvQXR0cmlidXRlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUR0b0F0dHJpYnV0ZV9fR3JvdXBfXzBfaW5fcnVsZVJvbGVEdG9BdHRyaWJ1dGUxMTgwKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVEdG9BdHRyaWJ1dGVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVEdG9BdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUR0b1JlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1OTM6MTogZW50cnlSdWxlUm9sZUR0b1JlZmVyZW5jZSA6IHJ1bGVSb2xlRHRvUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUm9sZUR0b1JlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1OTQ6MTogKCBydWxlUm9sZUR0b1JlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTk1OjE6IHJ1bGVSb2xlRHRvUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUR0b1JlZmVyZW5jZV9pbl9lbnRyeVJ1bGVSb2xlRHRvUmVmZXJlbmNlMTIwNyk7CisgICAgICAgICAgICBydWxlUm9sZUR0b1JlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UxMjE0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRHRvUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYwMjoxOiBydWxlUm9sZUR0b1JlZmVyZW5jZSA6ICggKCBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVSb2xlRHRvUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYwNjoyOiAoICggKCBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjA3OjE6ICggKCBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYwNzoxOiAoICggcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDg6MTogKCBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDk6MTogKCBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDk6MjogcnVsZV9fUm9sZUR0b1JlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1JvbGVEdG9SZWZlcmVuY2VfX0dyb3VwX18wX2luX3J1bGVSb2xlRHRvUmVmZXJlbmNlMTI0MCk7CisgICAgICAgICAgICBydWxlX19Sb2xlRHRvUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRHRvUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYyMToxOiBlbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA6IHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYyMjoxOiAoIHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjIzOjE6IHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9lbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDEyNjcpOworICAgICAgICAgICAgcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkMTI3NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzMDoxOiBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgOiAoICggcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzNDoyOiAoICggKCBydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzNToxOiAoICggcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjM1OjE6ICggKCBydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MzY6MTogKCBydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYzNzoxOiAoIHJ1bGVfX0F1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Mzc6MjogcnVsZV9fQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzBfaW5fcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkMTMwMCk7CisgICAgICAgICAgICBydWxlX19BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjQ5OjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWUgOiBydWxlUXVhbGlmaWVkTmFtZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjUwOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY1MToxOiBydWxlUXVhbGlmaWVkTmFtZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVF1YWxpZmllZE5hbWVfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZTEzMjcpOworICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lMTMzNCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NTg6MTogcnVsZVF1YWxpZmllZE5hbWUgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUXVhbGlmaWVkTmFtZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NjI6MjogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY2MzoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NjM6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY0OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY1OjE6ICggcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY1OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lX19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZTEzNjApOworICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVWYWxpZElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY3NzoxOiBlbnRyeVJ1bGVWYWxpZElEIDogcnVsZVZhbGlkSUQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY3ODoxOiAoIHJ1bGVWYWxpZElEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Nzk6MTogcnVsZVZhbGlkSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX2VudHJ5UnVsZVZhbGlkSUQxMzg3KTsKKyAgICAgICAgICAgIHJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVmFsaWRJRDEzOTQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVZhbGlkSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVZhbGlkSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Njg2OjE6IHJ1bGVWYWxpZElEIDogKCBSVUxFX0lEICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVWYWxpZElEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY5MDoyOiAoICggUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY5MToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjkxOjE6ICggUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTI6MTogUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVZhbGlkSUQxNDIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRWYWxpZElEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlVmFsaWRJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDU6MTogZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQgOiBydWxlVFJBTlNMQVRBQkxFSUQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDY6MTogKCBydWxlVFJBTlNMQVRBQkxFSUQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcwNzoxOiBydWxlVFJBTlNMQVRBQkxFSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlVFJBTlNMQVRBQkxFSURfaW5fZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQxNDQ2KTsKKyAgICAgICAgICAgIHJ1bGVUUkFOU0xBVEFCTEVJRCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRDE0NTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVUUkFOU0xBVEFCTEVJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MTQ6MTogcnVsZVRSQU5TTEFUQUJMRUlEIDogKCBSVUxFX0lEICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MTg6MjogKCAoIFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MTk6MTogKCBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcxOToxOiAoIFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzIwOjE6IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0VFJBTlNMQVRBQkxFSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlVFJBTlNMQVRBQkxFSUQxNDc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVRSQU5TTEFUQUJMRUlEIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjczMzoxOiBlbnRyeVJ1bGVYQW5ub3RhdGlvbiA6IHJ1bGVYQW5ub3RhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjczNDoxOiAoIHJ1bGVYQW5ub3RhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzM1OjE6IHJ1bGVYQW5ub3RhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbjE1MDUpOworICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uMTUxMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbm5vdGF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc0MjoxOiBydWxlWEFubm90YXRpb24gOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc0NjoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc0NzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzQ3OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NDg6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc0OToxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NDk6MjogcnVsZV9fWEFubm90YXRpb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzBfaW5fcnVsZVhBbm5vdGF0aW9uMTUzOCk7CisgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NjE6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NjI6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NjM6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjE1NjUpOworICAgICAgICAgICAgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyMTU3Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzcwOjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc0OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3NToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3NToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3NjoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Nzc6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3NzoyOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfX0dyb3VwX18wX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIxNTk4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODk6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTA6MTogKCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzkxOjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0MTYyNSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QxNjMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc5ODoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MDI6MjogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MDM6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgwMzoxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODA0OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MDU6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODA1OjI6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0MTY1OCk7CisgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODE3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIDogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODE4OjE6ICggcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MTk6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlMTY4NSk7CisgICAgICAgICAgICBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUxNjkyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODI2OjE6IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSA6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgzMDoyOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzE6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzE6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzI6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODMzOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0FsdGVybmF0aXZlc19pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUxNzE4KTsKKyAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NDU6MTogZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NDY6MTogKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg0NzoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24xNzQ1KTsKKyAgICAgICAgICAgIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjE3NTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NTQ6MTogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODU4OjI6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg1OToxOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg1OToxOiAoICggcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg2MDoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NjE6MTogKCBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg2MToyOiBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjE3NzgpOworICAgICAgICAgICAgcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg3MzoxOiBlbnRyeVJ1bGVYRXhwcmVzc2lvbiA6IHJ1bGVYRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg3NDoxOiAoIHJ1bGVYRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODc1OjE6IHJ1bGVYRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbjE4MDUpOworICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uMTgxMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg4MjoxOiBydWxlWEV4cHJlc3Npb24gOiAoIHJ1bGVYQXNzaWdubWVudCApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODg2OjI6ICggKCBydWxlWEFzc2lnbm1lbnQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4ODc6MTogKCBydWxlWEFzc2lnbm1lbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODg3OjE6ICggcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg4ODoxOiBydWxlWEFzc2lnbm1lbnQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9ydWxlWEV4cHJlc3Npb24xODM4KTsKKyAgICAgICAgICAgIHJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkwMToxOiBlbnRyeVJ1bGVYQXNzaWdubWVudCA6IHJ1bGVYQXNzaWdubWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkwMjoxOiAoIHJ1bGVYQXNzaWdubWVudCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTAzOjE6IHJ1bGVYQXNzaWdubWVudCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9lbnRyeVJ1bGVYQXNzaWdubWVudDE4NjQpOworICAgICAgICAgICAgcnVsZVhBc3NpZ25tZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBc3NpZ25tZW50MTg3MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFzc2lnbm1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkxMDoxOiBydWxlWEFzc2lnbm1lbnQgOiAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQXNzaWdubWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MTQ6MjogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE1OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE1OjE6ICggKCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE2OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkxNzoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE3OjI6IHJ1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBc3NpZ25tZW50X19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhBc3NpZ25tZW50MTg5Nyk7CisgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFzc2lnbm1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTI5OjE6IGVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIDogcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTMwOjE6ICggcnVsZU9wU2luZ2xlQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MzE6MTogcnVsZU9wU2luZ2xlQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wU2luZ2xlQXNzaWduX2luX2VudHJ5UnVsZU9wU2luZ2xlQXNzaWduMTkyNCk7CisgICAgICAgICAgICBydWxlT3BTaW5nbGVBc3NpZ24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24xOTMxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BTaW5nbGVBc3NpZ24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTM4OjE6IHJ1bGVPcFNpbmdsZUFzc2lnbiA6ICggJz0nICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NDI6MjogKCAoICc9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk0MzoxOiAoICc9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NDM6MTogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTQ0OjE6ICc9JworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDEzLEZPTExPV18xM19pbl9ydWxlT3BTaW5nbGVBc3NpZ24xOTU4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BTaW5nbGVBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aUFzc2lnbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NTk6MTogZW50cnlSdWxlT3BNdWx0aUFzc2lnbiA6IHJ1bGVPcE11bHRpQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NjA6MTogKCBydWxlT3BNdWx0aUFzc2lnbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTYxOjE6IHJ1bGVPcE11bHRpQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BNdWx0aUFzc2lnbl9pbl9lbnRyeVJ1bGVPcE11bHRpQXNzaWduMTk4Nik7CisgICAgICAgICAgICBydWxlT3BNdWx0aUFzc2lnbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wTXVsdGlBc3NpZ24xOTkzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk2ODoxOiBydWxlT3BNdWx0aUFzc2lnbiA6ICggKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzI6MjogKCAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzM6MTogKCAoIHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk3MzoxOiAoICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTc0OjE6ICggcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzU6MTogKCBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTc1OjI6IHJ1bGVfX09wTXVsdGlBc3NpZ25fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BNdWx0aUFzc2lnbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcE11bHRpQXNzaWduMjAxOSk7CisgICAgICAgICAgICBydWxlX19PcE11bHRpQXNzaWduX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGlBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODc6MTogZW50cnlSdWxlWE9yRXhwcmVzc2lvbiA6IHJ1bGVYT3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODg6MTogKCBydWxlWE9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTg5OjE6IHJ1bGVYT3JFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE9yRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYT3JFeHByZXNzaW9uMjA0Nik7CisgICAgICAgICAgICBydWxlWE9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhPckV4cHJlc3Npb24yMDUzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk5NjoxOiBydWxlWE9yRXhwcmVzc2lvbiA6ICggKCBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMDA6MjogKCAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMDE6MTogKCAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAwMToxOiAoICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDAyOjE6ICggcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAwMzoxOiAoIHJ1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMDM6MjogcnVsZV9fWE9yRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hPckV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYT3JFeHByZXNzaW9uMjA3OSk7CisgICAgICAgICAgICBydWxlX19YT3JFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wT3IiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAxNToxOiBlbnRyeVJ1bGVPcE9yIDogcnVsZU9wT3IgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcE9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMTY6MTogKCBydWxlT3BPciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAxNzoxOiBydWxlT3BPciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3JfaW5fZW50cnlSdWxlT3BPcjIxMDYpOworICAgICAgICAgICAgcnVsZU9wT3IoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcE9yUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE9yMjExMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BPciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDI0OjE6IHJ1bGVPcE9yIDogKCAnfHwnICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcE9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjg6MjogKCAoICd8fCcgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDI5OjE6ICggJ3x8JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDI5OjE6ICggJ3x8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDMwOjE6ICd8fCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVPcE9yMjE0MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE9yIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNDU6MTogZW50cnlSdWxlWEFuZEV4cHJlc3Npb24gOiBydWxlWEFuZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDQ2OjE6ICggcnVsZVhBbmRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDQ3OjE6IHJ1bGVYQW5kRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5kRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQW5kRXhwcmVzc2lvbjIxNjgpOworICAgICAgICAgICAgcnVsZVhBbmRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBbmRFeHByZXNzaW9uMjE3NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFuZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhBbmRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNTQ6MTogcnVsZVhBbmRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQW5kRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU4OjI6ICggKCAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA1OToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA1OToxOiAoICggcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA2MDoxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA2MToxOiAoIHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDYxOjI6IHJ1bGVfX1hBbmRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQW5kRXhwcmVzc2lvbjIyMDEpOworICAgICAgICAgICAgcnVsZV9fWEFuZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDczOjE6IGVudHJ5UnVsZU9wQW5kIDogcnVsZU9wQW5kIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA3NDoxOiAoIHJ1bGVPcEFuZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA3NToxOiBydWxlT3BBbmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBbmRfaW5fZW50cnlSdWxlT3BBbmQyMjI4KTsKKyAgICAgICAgICAgIHJ1bGVPcEFuZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcEFuZDIyMzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDgyOjE6IHJ1bGVPcEFuZCA6ICggJyYmJyApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BBbmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA4NjoyOiAoICggJyYmJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwODc6MTogKCAnJiYnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwODc6MTogKCAnJiYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwODg6MTogJyYmJworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZEFjY2VzcygpLmdldEFtcGVyc2FuZEFtcGVyc2FuZEtleXdvcmQoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsMTUsRk9MTE9XXzE1X2luX3J1bGVPcEFuZDIyNjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQW5kQWNjZXNzKCkuZ2V0QW1wZXJzYW5kQW1wZXJzYW5kS2V5d29yZCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTEwMzoxOiBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIDogcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExMDQ6MTogKCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTEwNToxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbjIyOTApOworICAgICAgICAgICAgcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uMjI5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTEyOjE6IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTExNjoyOiAoICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTExNzoxOiAoICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTE3OjE6ICggKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExMTg6MTogKCBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTE5OjE6ICggcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTExOToyOiBydWxlX19YRXF1YWxpdHlFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEVxdWFsaXR5RXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24yMzIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hFcXVhbGl0eUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTMxOjE6IGVudHJ5UnVsZU9wRXF1YWxpdHkgOiBydWxlT3BFcXVhbGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTEzMjoxOiAoIHJ1bGVPcEVxdWFsaXR5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTMzOjE6IHJ1bGVPcEVxdWFsaXR5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BFcXVhbGl0eV9pbl9lbnRyeVJ1bGVPcEVxdWFsaXR5MjM1MCk7CisgICAgICAgICAgICBydWxlT3BFcXVhbGl0eSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wRXF1YWxpdHkyMzU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcEVxdWFsaXR5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEVxdWFsaXR5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDA6MTogcnVsZU9wRXF1YWxpdHkgOiAoICggcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE0NDoyOiAoICggKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDU6MTogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDU6MTogKCAoIHJ1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDY6MTogKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDc6MTogKCBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE0NzoyOiBydWxlX19PcEVxdWFsaXR5X19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wRXF1YWxpdHlfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BFcXVhbGl0eTIzODMpOworICAgICAgICAgICAgcnVsZV9fT3BFcXVhbGl0eV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcEVxdWFsaXR5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTU5OjE6IGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiA6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE2MDoxOiAoIHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNjE6MTogcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjI0MTApOworICAgICAgICAgICAgcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uMjQxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE2ODoxOiBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNzI6MjogKCAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE3MzoxOiAoICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNzM6MTogKCAoIHJ1bGVfX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTc0OjE6ICggcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNzU6MTogKCBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNzU6MjogcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFJlbGF0aW9uYWxFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uMjQ0Myk7CisgICAgICAgICAgICBydWxlX19YUmVsYXRpb25hbEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQ29tcGFyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTg3OjE6IGVudHJ5UnVsZU9wQ29tcGFyZSA6IHJ1bGVPcENvbXBhcmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVPcENvbXBhcmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE4ODoxOiAoIHJ1bGVPcENvbXBhcmUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExODk6MTogcnVsZU9wQ29tcGFyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BDb21wYXJlX2luX2VudHJ5UnVsZU9wQ29tcGFyZTI0NzApOworICAgICAgICAgICAgcnVsZU9wQ29tcGFyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BDb21wYXJlMjQ3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BDb21wYXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcENvbXBhcmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE5NjoxOiBydWxlT3BDb21wYXJlIDogKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wQ29tcGFyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjAwOjI6ICggKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjAxOjE6ICggKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMDE6MTogKCAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIwMjoxOiAoIHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMDM6MTogKCBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjAzOjI6IHJ1bGVfX09wQ29tcGFyZV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BDb21wYXJlMjUwMyk7CisgICAgICAgICAgICBydWxlX19PcENvbXBhcmVfX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcENvbXBhcmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMTU6MTogZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIDogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjE2OjE6ICggcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIxNzoxOiBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25faW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uMjUzMCk7CisgICAgICAgICAgICBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24yNTM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjI0OjE6IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIyODoyOiAoICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjI5OjE6ICggKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIyOToxOiAoICggcnVsZV9fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMzA6MTogKCBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIzMToxOiAoIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIzMToyOiBydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24yNTYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BPdGhlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjQzOjE6IGVudHJ5UnVsZU9wT3RoZXIgOiBydWxlT3BPdGhlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI0NDoxOiAoIHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjQ1OjE6IHJ1bGVPcE90aGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BPdGhlcl9pbl9lbnRyeVJ1bGVPcE90aGVyMjU5MCk7CisgICAgICAgICAgICBydWxlT3BPdGhlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wT3RoZXIyNTk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNTI6MTogcnVsZU9wT3RoZXIgOiAoICggcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI1NjoyOiAoICggKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNTc6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNTc6MTogKCAoIHJ1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNTg6MTogKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNTk6MTogKCBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI1OToyOiBydWxlX19PcE90aGVyX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wT3RoZXJfX0FsdGVybmF0aXZlc19pbl9ydWxlT3BPdGhlcjI2MjMpOworICAgICAgICAgICAgcnVsZV9fT3BPdGhlcl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI3MToxOiBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIDogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNzI6MTogKCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI3MzoxOiBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb25faW5fZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbjI2NTApOworICAgICAgICAgICAgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uMjY1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjgwOjE6IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI4NDoyOiAoICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI4NToxOiAoICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjg1OjE6ICggKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyODY6MTogKCBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjg3OjE6ICggcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI4NzoyOiBydWxlX19YQWRkaXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFkZGl0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24yNjgzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hBZGRpdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBZGQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI5OToxOiBlbnRyeVJ1bGVPcEFkZCA6IHJ1bGVPcEFkZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZU9wQWRkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMDA6MTogKCBydWxlT3BBZGQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMDE6MTogcnVsZU9wQWRkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQWRkX2luX2VudHJ5UnVsZU9wQWRkMjcxMCk7CisgICAgICAgICAgICBydWxlT3BBZGQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBZGQyNzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcEFkZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BBZGQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMwODoxOiBydWxlT3BBZGQgOiAoICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcEFkZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzEyOjI6ICggKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMTM6MTogKCAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzEzOjE6ICggKCBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMxNDoxOiAoIHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzE1OjE6ICggcnVsZV9fT3BBZGRfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzE1OjI6IHJ1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX09wQWRkX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wQWRkMjc0Myk7CisgICAgICAgICAgICBydWxlX19PcEFkZF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldE9wQWRkQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BBZGQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzI3OjE6IGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMyODoxOiAoIHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzI5OjE6IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uMjc3MCk7CisgICAgICAgICAgICBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24yNzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMzY6MTogcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gOiAoICggcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzQwOjI6ICggKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzQxOjE6ICggKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzNDE6MTogKCAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM0MjoxOiAoIHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzNDM6MTogKCBydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzQzOjI6IHJ1bGVfX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjI4MDMpOworICAgICAgICAgICAgcnVsZV9fWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzNTU6MTogZW50cnlSdWxlT3BNdWx0aSA6IHJ1bGVPcE11bHRpIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BNdWx0aSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzU2OjE6ICggcnVsZU9wTXVsdGkgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzNTc6MTogcnVsZU9wTXVsdGkgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE11bHRpX2luX2VudHJ5UnVsZU9wTXVsdGkyODMwKTsKKyAgICAgICAgICAgIHJ1bGVPcE11bHRpKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BNdWx0aTI4MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wTXVsdGkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wTXVsdGkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM2NDoxOiBydWxlT3BNdWx0aSA6ICggKCBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BNdWx0aSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzY4OjI6ICggKCAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM2OToxOiAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM2OToxOiAoICggcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM3MDoxOiAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM3MToxOiAoIHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzcxOjI6IHJ1bGVfX09wTXVsdGlfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BNdWx0aV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcE11bHRpMjg2Myk7CisgICAgICAgICAgICBydWxlX19PcE11bHRpX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzODM6MTogZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIDogcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzg0OjE6ICggcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM4NToxOiBydWxlWFVuYXJ5T3BlcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYVW5hcnlPcGVyYXRpb25faW5fZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uMjg5MCk7CisgICAgICAgICAgICBydWxlWFVuYXJ5T3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24yODk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhVbmFyeU9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzkyOjE6IHJ1bGVYVW5hcnlPcGVyYXRpb24gOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFVuYXJ5T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzOTY6MjogKCAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzOTc6MTogKCAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM5NzoxOiAoICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzk4OjE6ICggcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM5OToxOiAoIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzOTk6MjogcnVsZV9fWFVuYXJ5T3BlcmF0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYVW5hcnlPcGVyYXRpb24yOTIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hVbmFyeU9wZXJhdGlvbl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhVbmFyeU9wZXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFVuYXJ5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0MTE6MTogZW50cnlSdWxlT3BVbmFyeSA6IHJ1bGVPcFVuYXJ5IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDEyOjE6ICggcnVsZU9wVW5hcnkgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0MTM6MTogcnVsZU9wVW5hcnkgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcFVuYXJ5X2luX2VudHJ5UnVsZU9wVW5hcnkyOTUwKTsKKyAgICAgICAgICAgIHJ1bGVPcFVuYXJ5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BVbmFyeTI5NTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wVW5hcnkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wVW5hcnkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyMDoxOiBydWxlT3BVbmFyeSA6ICggKCBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlT3BVbmFyeSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDI0OjI6ICggKCAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyNToxOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyNToxOiAoICggcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyNjoxOiAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyNzoxOiAoIHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDI3OjI6IHJ1bGVfX09wVW5hcnlfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BVbmFyeV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVPcFVuYXJ5Mjk4Myk7CisgICAgICAgICAgICBydWxlX19PcFVuYXJ5X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wVW5hcnkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQzOToxOiBlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiA6IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NDA6MTogKCBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NDE6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDYXN0ZWRFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uMzAxMCk7CisgICAgICAgICAgICBydWxlWENhc3RlZEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24zMDE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENhc3RlZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ0ODoxOiBydWxlWENhc3RlZEV4cHJlc3Npb24gOiAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDYXN0ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NTI6MjogKCAoICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDUzOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDUzOjE6ICggKCBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDU0OjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDU1OjE6ICggcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NTU6MjogcnVsZV9fWENhc3RlZEV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhDYXN0ZWRFeHByZXNzaW9uMzA0Myk7CisgICAgICAgICAgICBydWxlX19YQ2FzdGVkRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0Njc6MTogZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24gOiBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDY4OjE6ICggcnVsZVhQb3N0Zml4T3BlcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDY5OjE6IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUG9zdGZpeE9wZXJhdGlvbl9pbl9lbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbjMwNzApOworICAgICAgICAgICAgcnVsZVhQb3N0Zml4T3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhQb3N0Zml4T3BlcmF0aW9uMzA3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhQb3N0Zml4T3BlcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NzY6MTogcnVsZVhQb3N0Zml4T3BlcmF0aW9uIDogKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDgwOjI6ICggKCAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MToxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MToxOiAoICggcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MjoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MzoxOiAoIHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDgzOjI6IHJ1bGVfX1hQb3N0Zml4T3BlcmF0aW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wX2luX3J1bGVYUG9zdGZpeE9wZXJhdGlvbjMxMDMpOworICAgICAgICAgICAgcnVsZV9fWFBvc3RmaXhPcGVyYXRpb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFBvc3RmaXgiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ5NToxOiBlbnRyeVJ1bGVPcFBvc3RmaXggOiBydWxlT3BQb3N0Zml4IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlT3BQb3N0Zml4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0OTY6MTogKCBydWxlT3BQb3N0Zml4IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDk3OjE6IHJ1bGVPcFBvc3RmaXggRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wUG9zdGZpeF9pbl9lbnRyeVJ1bGVPcFBvc3RmaXgzMTMwKTsKKyAgICAgICAgICAgIHJ1bGVPcFBvc3RmaXgoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRPcFBvc3RmaXhSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wUG9zdGZpeDMxMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wUG9zdGZpeCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BQb3N0Zml4IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MDQ6MTogcnVsZU9wUG9zdGZpeCA6ICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVPcFBvc3RmaXgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUwODoyOiAoICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUwOToxOiAoICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTA5OjE6ICggKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MTA6MTogKCBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE9wUG9zdGZpeEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTExOjE6ICggcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUxMToyOiBydWxlX19PcFBvc3RmaXhfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXNfaW5fcnVsZU9wUG9zdGZpeDMxNjMpOworICAgICAgICAgICAgcnVsZV9fT3BQb3N0Zml4X19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BQb3N0Zml4IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTIzOjE6IGVudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCA6IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUyNDoxOiAoIHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MjU6MTogcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE1lbWJlckZlYXR1cmVDYWxsX2luX2VudHJ5UnVsZVhNZW1iZXJGZWF0dXJlQ2FsbDMxOTApOworICAgICAgICAgICAgcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsMzE5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE1lbWJlckZlYXR1cmVDYWxsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUzMjoxOiBydWxlWE1lbWJlckZlYXR1cmVDYWxsIDogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE1lbWJlckZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MzY6MjogKCAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUzNzoxOiAoICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1Mzc6MTogKCAoIHJ1bGVfX1hNZW1iZXJGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTM4OjE6ICggcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1Mzk6MTogKCBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1Mzk6MjogcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE1lbWJlckZlYXR1cmVDYWxsX19Hcm91cF9fMF9pbl9ydWxlWE1lbWJlckZlYXR1cmVDYWxsMzIyMyk7CisgICAgICAgICAgICBydWxlX19YTWVtYmVyRmVhdHVyZUNhbGxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE1lbWJlckZlYXR1cmVDYWxsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTUxOjE6IGVudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbiA6IHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYUHJpbWFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU1MjoxOiAoIHJ1bGVYUHJpbWFyeUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1NTM6MTogcnVsZVhQcmltYXJ5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFByaW1hcnlFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhQcmltYXJ5RXhwcmVzc2lvbjMyNTApOworICAgICAgICAgICAgcnVsZVhQcmltYXJ5RXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uMzI1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFByaW1hcnlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU2MDoxOiBydWxlWFByaW1hcnlFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhQcmltYXJ5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTY0OjI6ICggKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTY1OjE6ICggKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1NjU6MTogKCAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU2NjoxOiAoIHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1Njc6MTogKCBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTY3OjI6IHJ1bGVfX1hQcmltYXJ5RXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlc19pbl9ydWxlWFByaW1hcnlFeHByZXNzaW9uMzI4Myk7CisgICAgICAgICAgICBydWxlX19YUHJpbWFyeUV4cHJlc3Npb25fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYUHJpbWFyeUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU3OToxOiBlbnRyeVJ1bGVYTGl0ZXJhbCA6IHJ1bGVYTGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1ODA6MTogKCBydWxlWExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1ODE6MTogcnVsZVhMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhMaXRlcmFsX2luX2VudHJ5UnVsZVhMaXRlcmFsMzMxMCk7CisgICAgICAgICAgICBydWxlWExpdGVyYWwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWExpdGVyYWwzMzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU4ODoxOiBydWxlWExpdGVyYWwgOiAoICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTkyOjI6ICggKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1OTM6MTogKCAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTkzOjE6ICggKCBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU5NDoxOiAoIHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTk1OjE6ICggcnVsZV9fWExpdGVyYWxfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTk1OjI6IHJ1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hMaXRlcmFsX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVhMaXRlcmFsMzM0Myk7CisgICAgICAgICAgICBydWxlX19YTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MDc6MTogZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsIDogcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjA4OjE6ICggcnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYwOToxOiBydWxlWENvbGxlY3Rpb25MaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ29sbGVjdGlvbkxpdGVyYWxfaW5fZW50cnlSdWxlWENvbGxlY3Rpb25MaXRlcmFsMzM3MCk7CisgICAgICAgICAgICBydWxlWENvbGxlY3Rpb25MaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbGxlY3Rpb25MaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwzMzc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjE2OjE6IHJ1bGVYQ29sbGVjdGlvbkxpdGVyYWwgOiAoICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENvbGxlY3Rpb25MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MjA6MjogKCAoICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MjE6MTogKCAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYyMToxOiAoICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjIyOjE6ICggcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYyMzoxOiAoIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MjM6MjogcnVsZV9fWENvbGxlY3Rpb25MaXRlcmFsX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYQ29sbGVjdGlvbkxpdGVyYWwzNDAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hDb2xsZWN0aW9uTGl0ZXJhbF9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDb2xsZWN0aW9uTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU2V0TGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjM1OjE6IGVudHJ5UnVsZVhTZXRMaXRlcmFsIDogcnVsZVhTZXRMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFNldExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYzNjoxOiAoIHJ1bGVYU2V0TGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYzNzoxOiBydWxlWFNldExpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFNldExpdGVyYWxfaW5fZW50cnlSdWxlWFNldExpdGVyYWwzNDMwKTsKKyAgICAgICAgICAgIHJ1bGVYU2V0TGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYU2V0TGl0ZXJhbDM0MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhTZXRMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU2V0TGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjQ0OjE6IHJ1bGVYU2V0TGl0ZXJhbCA6ICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFNldExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY0ODoyOiAoICggKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NDk6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NDk6MTogKCAoIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NTA6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NTE6MTogKCBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY1MToyOiBydWxlX19YU2V0TGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWFNldExpdGVyYWwzNDYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hTZXRMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2V0TGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFNldExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWExpc3RMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NjM6MTogZW50cnlSdWxlWExpc3RMaXRlcmFsIDogcnVsZVhMaXN0TGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhMaXN0TGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjY0OjE6ICggcnVsZVhMaXN0TGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY2NToxOiBydWxlWExpc3RMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYTGlzdExpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTGlzdExpdGVyYWxfaW5fZW50cnlSdWxlWExpc3RMaXRlcmFsMzQ5MCk7CisgICAgICAgICAgICBydWxlWExpc3RMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTGlzdExpdGVyYWwzNDk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTGlzdExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhMaXN0TGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjcyOjE6IHJ1bGVYTGlzdExpdGVyYWwgOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTGlzdExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3NjoyOiAoICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjc3OjE6ICggKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3NzoxOiAoICggcnVsZV9fWExpc3RMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2Nzg6MTogKCBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3OToxOiAoIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3OToyOiBydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YTGlzdExpdGVyYWxfX0dyb3VwX18wX2luX3J1bGVYTGlzdExpdGVyYWwzNTIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hMaXN0TGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYTGlzdExpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENsb3N1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY5MToxOiBlbnRyeVJ1bGVYQ2xvc3VyZSA6IHJ1bGVYQ2xvc3VyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2OTI6MTogKCBydWxlWENsb3N1cmUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2OTM6MTogcnVsZVhDbG9zdXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDbG9zdXJlX2luX2VudHJ5UnVsZVhDbG9zdXJlMzU1MCk7CisgICAgICAgICAgICBydWxlWENsb3N1cmUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENsb3N1cmUzNTU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQ2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENsb3N1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTcwMDoxOiBydWxlWENsb3N1cmUgOiAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MDQ6MjogKCAoICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzA1OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzA1OjE6ICggKCBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzA2OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzA3OjE6ICggcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MDc6MjogcnVsZV9fWENsb3N1cmVfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzBfaW5fcnVsZVhDbG9zdXJlMzU4Myk7CisgICAgICAgICAgICBydWxlX19YQ2xvc3VyZV9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENsb3N1cmVBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MTk6MTogZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgOiBydWxlWEV4cHJlc3Npb25JbkNsb3N1cmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzIwOjE6ICggcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzIxOjE6IHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZV9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZTM2MTApOworICAgICAgICAgICAgcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlMzYxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEV4cHJlc3Npb25JbkNsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3Mjg6MTogcnVsZVhFeHByZXNzaW9uSW5DbG9zdXJlIDogKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzMyOjI6ICggKCAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczMzoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczMzoxOiAoICggcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczNDoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczNToxOiAoIHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzM1OjI6IHJ1bGVfX1hFeHByZXNzaW9uSW5DbG9zdXJlX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wX2luX3J1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZTM2NDMpOworICAgICAgICAgICAgcnVsZV9fWEV4cHJlc3Npb25JbkNsb3N1cmVfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYRXhwcmVzc2lvbkluQ2xvc3VyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU2hvcnRDbG9zdXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NDc6MTogZW50cnlSdWxlWFNob3J0Q2xvc3VyZSA6IHJ1bGVYU2hvcnRDbG9zdXJlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFNob3J0Q2xvc3VyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzQ4OjE6ICggcnVsZVhTaG9ydENsb3N1cmUgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NDk6MTogcnVsZVhTaG9ydENsb3N1cmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTaG9ydENsb3N1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYU2hvcnRDbG9zdXJlX2luX2VudHJ5UnVsZVhTaG9ydENsb3N1cmUzNjcwKTsKKyAgICAgICAgICAgIHJ1bGVYU2hvcnRDbG9zdXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFNob3J0Q2xvc3VyZTM2NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhTaG9ydENsb3N1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTaG9ydENsb3N1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc1NjoxOiBydWxlWFNob3J0Q2xvc3VyZSA6ICggKCBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU2hvcnRDbG9zdXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NjA6MjogKCAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NjE6MTogKCAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc2MToxOiAoICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzYyOjE6ICggcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc2MzoxOiAoIHJ1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NjM6MjogcnVsZV9fWFNob3J0Q2xvc3VyZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hTaG9ydENsb3N1cmVfX0dyb3VwX18wX2luX3J1bGVYU2hvcnRDbG9zdXJlMzcwMyk7CisgICAgICAgICAgICBydWxlX19YU2hvcnRDbG9zdXJlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU2hvcnRDbG9zdXJlQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYU2hvcnRDbG9zdXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzc1OjE6IGVudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiA6IHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc3NjoxOiAoIHJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3Nzc6MTogcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjM3MzApOworICAgICAgICAgICAgcnVsZVhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uMzczNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUGFyZW50aGVzaXplZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc4NDoxOiBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3ODg6MjogKCAoICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc4OToxOiAoICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3ODk6MTogKCAoIHJ1bGVfX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkwOjE6ICggcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3OTE6MTogKCBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3OTE6MjogcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uMzc2Myk7CisgICAgICAgICAgICBydWxlX19YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhJZkV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgwMzoxOiBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uIDogcnVsZVhJZkV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYSWZFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MDQ6MTogKCBydWxlWElmRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgwNToxOiBydWxlWElmRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WElmRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhJZkV4cHJlc3Npb25faW5fZW50cnlSdWxlWElmRXhwcmVzc2lvbjM3OTApOworICAgICAgICAgICAgcnVsZVhJZkV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYSWZFeHByZXNzaW9uMzc5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWElmRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWElmRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODEyOjE6IHJ1bGVYSWZFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhJZkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgxNjoyOiAoICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgxNzoxOiAoICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODE3OjE6ICggKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MTg6MTogKCBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODE5OjE6ICggcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgxOToyOiBydWxlX19YSWZFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWElmRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhJZkV4cHJlc3Npb24zODIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hJZkV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhJZkV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgzMToxOiBlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbiA6IHJ1bGVYU3dpdGNoRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MzI6MTogKCBydWxlWFN3aXRjaEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MzM6MTogcnVsZVhTd2l0Y2hFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhTd2l0Y2hFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhTd2l0Y2hFeHByZXNzaW9uMzg1MCk7CisgICAgICAgICAgICBydWxlWFN3aXRjaEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3dpdGNoRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFN3aXRjaEV4cHJlc3Npb24zODU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYU3dpdGNoRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFN3aXRjaEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg0MDoxOiBydWxlWFN3aXRjaEV4cHJlc3Npb24gOiAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhTd2l0Y2hFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NDQ6MjogKCAoICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODQ1OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODQ1OjE6ICggKCBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODQ2OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODQ3OjE6ICggcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NDc6MjogcnVsZV9fWFN3aXRjaEV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhTd2l0Y2hFeHByZXNzaW9uMzg4Myk7CisgICAgICAgICAgICBydWxlX19YU3dpdGNoRXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhTd2l0Y2hFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhDYXNlUGFydCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODU5OjE6IGVudHJ5UnVsZVhDYXNlUGFydCA6IHJ1bGVYQ2FzZVBhcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQ2FzZVBhcnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg2MDoxOiAoIHJ1bGVYQ2FzZVBhcnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NjE6MTogcnVsZVhDYXNlUGFydCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WENhc2VQYXJ0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENhc2VQYXJ0X2luX2VudHJ5UnVsZVhDYXNlUGFydDM5MTApOworICAgICAgICAgICAgcnVsZVhDYXNlUGFydCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENhc2VQYXJ0MzkxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWENhc2VQYXJ0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ2FzZVBhcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg2ODoxOiBydWxlWENhc2VQYXJ0IDogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWENhc2VQYXJ0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzI6MjogKCAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg3MzoxOiAoICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzM6MTogKCAoIHJ1bGVfX1hDYXNlUGFydF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODc0OjE6ICggcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzU6MTogKCBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzU6MjogcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWENhc2VQYXJ0X19Hcm91cF9fMF9pbl9ydWxlWENhc2VQYXJ0Mzk0Myk7CisgICAgICAgICAgICBydWxlX19YQ2FzZVBhcnRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhDYXNlUGFydEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWENhc2VQYXJ0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODg3OjE6IGVudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbiA6IHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRm9yTG9vcEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg4ODoxOiAoIHJ1bGVYRm9yTG9vcEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4ODk6MTogcnVsZVhGb3JMb29wRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEZvckxvb3BFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhGb3JMb29wRXhwcmVzc2lvbjM5NzApOworICAgICAgICAgICAgcnVsZVhGb3JMb29wRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uMzk3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEZvckxvb3BFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRm9yTG9vcEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg5NjoxOiBydWxlWEZvckxvb3BFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEZvckxvb3BFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MDA6MjogKCAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkwMToxOiAoICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MDE6MTogKCAoIHJ1bGVfX1hGb3JMb29wRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTAyOjE6ICggcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MDM6MTogKCBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MDM6MjogcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEZvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWEZvckxvb3BFeHByZXNzaW9uNDAwMyk7CisgICAgICAgICAgICBydWxlX19YRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEZvckxvb3BFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MTU6MTogZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gOiBydWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTE2OjE6ICggcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTE3OjE6IHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbjQwMzApOworICAgICAgICAgICAgcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uNDAzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MjQ6MTogcnVsZVhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTI4OjI6ICggKCAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkyOToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkyOToxOiAoICggcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkzMDoxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkzMToxOiAoIHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTMxOjI6IHJ1bGVfX1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbjQwNjMpOworICAgICAgICAgICAgcnVsZV9fWEJhc2ljRm9yTG9vcEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQmFzaWNGb3JMb29wRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYV2hpbGVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NDM6MTogZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbiA6IHJ1bGVYV2hpbGVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTQ0OjE6ICggcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NDU6MTogcnVsZVhXaGlsZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhXaGlsZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYV2hpbGVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb240MDkwKTsKKyAgICAgICAgICAgIHJ1bGVYV2hpbGVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFdoaWxlRXhwcmVzc2lvbjQwOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhXaGlsZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhXaGlsZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1MjoxOiBydWxlWFdoaWxlRXhwcmVzc2lvbiA6ICggKCBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NTY6MjogKCAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NTc6MTogKCAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1NzoxOiAoICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTU4OjE6ICggcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1OToxOiAoIHJ1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NTk6MjogcnVsZV9fWFdoaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hXaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYV2hpbGVFeHByZXNzaW9uNDEyMyk7CisgICAgICAgICAgICBydWxlX19YV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYV2hpbGVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYV2hpbGVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTcxOjE6IGVudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbiA6IHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYRG9XaGlsZUV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk3MjoxOiAoIHJ1bGVYRG9XaGlsZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NzM6MTogcnVsZVhEb1doaWxlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWERvV2hpbGVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhEb1doaWxlRXhwcmVzc2lvbjQxNTApOworICAgICAgICAgICAgcnVsZVhEb1doaWxlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uNDE1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWERvV2hpbGVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRG9XaGlsZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk4MDoxOiBydWxlWERvV2hpbGVFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWERvV2hpbGVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODQ6MjogKCAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk4NToxOiAoICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODU6MTogKCAoIHJ1bGVfX1hEb1doaWxlRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTg2OjE6ICggcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODc6MTogKCBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODc6MjogcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWERvV2hpbGVFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWERvV2hpbGVFeHByZXNzaW9uNDE4Myk7CisgICAgICAgICAgICBydWxlX19YRG9XaGlsZUV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWERvV2hpbGVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhCbG9ja0V4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk5OToxOiBlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uIDogcnVsZVhCbG9ja0V4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMDA6MTogKCBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAwMToxOiBydWxlWEJsb2NrRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhCbG9ja0V4cHJlc3Npb25faW5fZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbjQyMTApOworICAgICAgICAgICAgcnVsZVhCbG9ja0V4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQmxvY2tFeHByZXNzaW9uNDIxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEJsb2NrRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEJsb2NrRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDA4OjE6IHJ1bGVYQmxvY2tFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhCbG9ja0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxMjoyOiAoICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxMzoxOiAoICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDEzOjE6ICggKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMTQ6MTogKCBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDE1OjE6ICggcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxNToyOiBydWxlX19YQmxvY2tFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEJsb2NrRXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhCbG9ja0V4cHJlc3Npb240MjQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hCbG9ja0V4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhCbG9ja0V4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMjc6MTogZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIDogcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDI4OjE6ICggcnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAyOToxOiBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25faW5fZW50cnlSdWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uNDI3MCk7CisgICAgICAgICAgICBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb240Mjc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDM2OjE6IHJ1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb24gOiAoICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNDA6MjogKCAoICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNDE6MTogKCAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA0MToxOiAoICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDQyOjE6ICggcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA0MzoxOiAoIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNDM6MjogcnVsZV9fWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb240MzAzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDU1OjE6IGVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIDogcnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA1NjoxOiAoIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA1NzoxOiBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb25faW5fZW50cnlSdWxlWFZhcmlhYmxlRGVjbGFyYXRpb240MzMwKTsKKyAgICAgICAgICAgIHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbjQzMzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhWYXJpYWJsZURlY2xhcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDY0OjE6IHJ1bGVYVmFyaWFibGVEZWNsYXJhdGlvbiA6ICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA2ODoyOiAoICggKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNjk6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNjk6MTogKCAoIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNzA6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwNzE6MTogKCBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA3MToyOiBydWxlX19YVmFyaWFibGVEZWNsYXJhdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMF9pbl9ydWxlWFZhcmlhYmxlRGVjbGFyYXRpb240MzYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hWYXJpYWJsZURlY2xhcmF0aW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFZhcmlhYmxlRGVjbGFyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwODM6MTogZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyIDogcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bUZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDg0OjE6ICggcnVsZUp2bUZvcm1hbFBhcmFtZXRlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA4NToxOiBydWxlSnZtRm9ybWFsUGFyYW1ldGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXJfaW5fZW50cnlSdWxlSnZtRm9ybWFsUGFyYW1ldGVyNDM5MCk7CisgICAgICAgICAgICBydWxlSnZtRm9ybWFsUGFyYW1ldGVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI0Mzk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDkyOjE6IHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIgOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA5NjoyOiAoICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDk3OjE6ICggKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA5NzoxOiAoICggcnVsZV9fSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwOTg6MTogKCBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA5OToxOiAoIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA5OToyOiBydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wX2luX3J1bGVKdm1Gb3JtYWxQYXJhbWV0ZXI0NDIzKTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1Gb3JtYWxQYXJhbWV0ZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTExOjE6IGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgOiBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjExMjoxOiAoIHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTEzOjE6IHJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9pbl9lbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyNDQ1MCk7CisgICAgICAgICAgICBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXI0NDU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVGdWxsSnZtRm9ybWFsUGFyYW1ldGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMjA6MTogcnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgOiAoICggcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTI0OjI6ICggKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTI1OjE6ICggKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMjU6MTogKCAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEyNjoxOiAoIHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMjc6MTogKCBydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTI3OjI6IHJ1bGVfX0Z1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19GdWxsSnZtRm9ybWFsUGFyYW1ldGVyX19Hcm91cF9fMF9pbl9ydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlcjQ0ODMpOworICAgICAgICAgICAgcnVsZV9fRnVsbEp2bUZvcm1hbFBhcmFtZXRlcl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYRmVhdHVyZUNhbGwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEzOToxOiBlbnRyeVJ1bGVYRmVhdHVyZUNhbGwgOiBydWxlWEZlYXR1cmVDYWxsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEZlYXR1cmVDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNDA6MTogKCBydWxlWEZlYXR1cmVDYWxsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTQxOjE6IHJ1bGVYRmVhdHVyZUNhbGwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhGZWF0dXJlQ2FsbF9pbl9lbnRyeVJ1bGVYRmVhdHVyZUNhbGw0NTEwKTsKKyAgICAgICAgICAgIHJ1bGVYRmVhdHVyZUNhbGwoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhGZWF0dXJlQ2FsbDQ1MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEZlYXR1cmVDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNDg6MTogcnVsZVhGZWF0dXJlQ2FsbCA6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhGZWF0dXJlQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTUyOjI6ICggKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNTM6MTogKCAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTUzOjE6ICggKCBydWxlX19YRmVhdHVyZUNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE1NDoxOiAoIHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTU1OjE6ICggcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTU1OjI6IHJ1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hGZWF0dXJlQ2FsbF9fR3JvdXBfXzBfaW5fcnVsZVhGZWF0dXJlQ2FsbDQ1NDMpOworICAgICAgICAgICAgcnVsZV9fWEZlYXR1cmVDYWxsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhGZWF0dXJlQ2FsbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVGZWF0dXJlQ2FsbElEIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNjc6MTogZW50cnlSdWxlRmVhdHVyZUNhbGxJRCA6IHJ1bGVGZWF0dXJlQ2FsbElEIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlRmVhdHVyZUNhbGxJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTY4OjE6ICggcnVsZUZlYXR1cmVDYWxsSUQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNjk6MTogcnVsZUZlYXR1cmVDYWxsSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVGZWF0dXJlQ2FsbElEX2luX2VudHJ5UnVsZUZlYXR1cmVDYWxsSUQ0NTcwKTsKKyAgICAgICAgICAgIHJ1bGVGZWF0dXJlQ2FsbElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlRmVhdHVyZUNhbGxJRDQ1NzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUZlYXR1cmVDYWxsSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUZlYXR1cmVDYWxsSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE3NjoxOiBydWxlRmVhdHVyZUNhbGxJRCA6ICggKCBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlRmVhdHVyZUNhbGxJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTgwOjI6ICggKCAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE4MToxOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE4MToxOiAoICggcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE4MjoxOiAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE4MzoxOiAoIHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTgzOjI6IHJ1bGVfX0ZlYXR1cmVDYWxsSURfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fRmVhdHVyZUNhbGxJRF9fQWx0ZXJuYXRpdmVzX2luX3J1bGVGZWF0dXJlQ2FsbElENDYwMyk7CisgICAgICAgICAgICBydWxlX19GZWF0dXJlQ2FsbElEX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUZlYXR1cmVDYWxsSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSWRPclN1cGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOTU6MTogZW50cnlSdWxlSWRPclN1cGVyIDogcnVsZUlkT3JTdXBlciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUlkT3JTdXBlcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTk2OjE6ICggcnVsZUlkT3JTdXBlciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE5NzoxOiBydWxlSWRPclN1cGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVJZE9yU3VwZXJfaW5fZW50cnlSdWxlSWRPclN1cGVyNDYzMCk7CisgICAgICAgICAgICBydWxlSWRPclN1cGVyKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SWRPclN1cGVyUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVJZE9yU3VwZXI0NjM3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVJZE9yU3VwZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUlkT3JTdXBlciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjA0OjE6IHJ1bGVJZE9yU3VwZXIgOiAoICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSWRPclN1cGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMDg6MjogKCAoICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMDk6MTogKCAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwOToxOiAoICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjEwOjE6ICggcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRJZE9yU3VwZXJBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIxMToxOiAoIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMTE6MjogcnVsZV9fSWRPclN1cGVyX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzX2luX3J1bGVJZE9yU3VwZXI0NjYzKTsKKyAgICAgICAgICAgIHJ1bGVfX0lkT3JTdXBlcl9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldElkT3JTdXBlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUlkT3JTdXBlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ29uc3RydWN0b3JDYWxsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMjM6MTogZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCA6IHJ1bGVYQ29uc3RydWN0b3JDYWxsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjI0OjE6ICggcnVsZVhDb25zdHJ1Y3RvckNhbGwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMjU6MTogcnVsZVhDb25zdHJ1Y3RvckNhbGwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQ29uc3RydWN0b3JDYWxsX2luX2VudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGw0NjkwKTsKKyAgICAgICAgICAgIHJ1bGVYQ29uc3RydWN0b3JDYWxsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WENvbnN0cnVjdG9yQ2FsbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENvbnN0cnVjdG9yQ2FsbDQ2OTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhDb25zdHJ1Y3RvckNhbGwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhDb25zdHJ1Y3RvckNhbGwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIzMjoxOiBydWxlWENvbnN0cnVjdG9yQ2FsbCA6ICggKCBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYQ29uc3RydWN0b3JDYWxsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMzY6MjogKCAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMzc6MTogKCAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIzNzoxOiAoICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjM4OjE6ICggcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIzOToxOiAoIHJ1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMzk6MjogcnVsZV9fWENvbnN0cnVjdG9yQ2FsbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hDb25zdHJ1Y3RvckNhbGxfX0dyb3VwX18wX2luX3J1bGVYQ29uc3RydWN0b3JDYWxsNDcyMyk7CisgICAgICAgICAgICBydWxlX19YQ29uc3RydWN0b3JDYWxsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ29uc3RydWN0b3JDYWxsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjUxOjE6IGVudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbCA6IHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYQm9vbGVhbkxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI1MjoxOiAoIHJ1bGVYQm9vbGVhbkxpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNTM6MTogcnVsZVhCb29sZWFuTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEJvb2xlYW5MaXRlcmFsX2luX2VudHJ5UnVsZVhCb29sZWFuTGl0ZXJhbDQ3NTApOworICAgICAgICAgICAgcnVsZVhCb29sZWFuTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsNDc1Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEJvb2xlYW5MaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQm9vbGVhbkxpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI2MDoxOiBydWxlWEJvb2xlYW5MaXRlcmFsIDogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEJvb2xlYW5MaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNjQ6MjogKCAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI2NToxOiAoICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNjU6MTogKCAoIHJ1bGVfX1hCb29sZWFuTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjY2OjE6ICggcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNjc6MTogKCBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNjc6MjogcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEJvb2xlYW5MaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWEJvb2xlYW5MaXRlcmFsNDc4Myk7CisgICAgICAgICAgICBydWxlX19YQm9vbGVhbkxpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEJvb2xlYW5MaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhOdWxsTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjc5OjE6IGVudHJ5UnVsZVhOdWxsTGl0ZXJhbCA6IHJ1bGVYTnVsbExpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTnVsbExpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI4MDoxOiAoIHJ1bGVYTnVsbExpdGVyYWwgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyODE6MTogcnVsZVhOdWxsTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bGxMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE51bGxMaXRlcmFsX2luX2VudHJ5UnVsZVhOdWxsTGl0ZXJhbDQ4MTApOworICAgICAgICAgICAgcnVsZVhOdWxsTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE51bGxMaXRlcmFsNDgxNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE51bGxMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTnVsbExpdGVyYWwiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI4ODoxOiBydWxlWE51bGxMaXRlcmFsIDogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWE51bGxMaXRlcmFsKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTI6MjogKCAoICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI5MzoxOiAoICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTM6MTogKCAoIHJ1bGVfX1hOdWxsTGl0ZXJhbF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjk0OjE6ICggcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTU6MTogKCBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTU6MjogcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE51bGxMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWE51bGxMaXRlcmFsNDg0Myk7CisgICAgICAgICAgICBydWxlX19YTnVsbExpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdWxsTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWE51bGxMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhOdW1iZXJMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMDc6MTogZW50cnlSdWxlWE51bWJlckxpdGVyYWwgOiBydWxlWE51bWJlckxpdGVyYWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA4OjE6ICggcnVsZVhOdW1iZXJMaXRlcmFsIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA5OjE6IHJ1bGVYTnVtYmVyTGl0ZXJhbCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTnVtYmVyTGl0ZXJhbF9pbl9lbnRyeVJ1bGVYTnVtYmVyTGl0ZXJhbDQ4NzApOworICAgICAgICAgICAgcnVsZVhOdW1iZXJMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhOdW1iZXJMaXRlcmFsNDg3Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWE51bWJlckxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhOdW1iZXJMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMTY6MTogcnVsZVhOdW1iZXJMaXRlcmFsIDogKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYTnVtYmVyTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzIwOjI6ICggKCAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMyMToxOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMyMToxOiAoICggcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMyMjoxOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMyMzoxOiAoIHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzIzOjI6IHJ1bGVfX1hOdW1iZXJMaXRlcmFsX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wX2luX3J1bGVYTnVtYmVyTGl0ZXJhbDQ5MDMpOworICAgICAgICAgICAgcnVsZV9fWE51bWJlckxpdGVyYWxfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhOdW1iZXJMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYTnVtYmVyTGl0ZXJhbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzM1OjE6IGVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIDogcnVsZVhTdHJpbmdMaXRlcmFsIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMzNjoxOiAoIHJ1bGVYU3RyaW5nTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMzNzoxOiBydWxlWFN0cmluZ0xpdGVyYWwgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFN0cmluZ0xpdGVyYWxfaW5fZW50cnlSdWxlWFN0cmluZ0xpdGVyYWw0OTMwKTsKKyAgICAgICAgICAgIHJ1bGVYU3RyaW5nTGl0ZXJhbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYU3RyaW5nTGl0ZXJhbDQ5MzcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhTdHJpbmdMaXRlcmFsIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYU3RyaW5nTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzQ0OjE6IHJ1bGVYU3RyaW5nTGl0ZXJhbCA6ICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM0ODoyOiAoICggKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNDk6MTogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNDk6MTogKCAoIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNTA6MTogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNTE6MTogKCBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM1MToyOiBydWxlX19YU3RyaW5nTGl0ZXJhbF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMF9pbl9ydWxlWFN0cmluZ0xpdGVyYWw0OTYzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hTdHJpbmdMaXRlcmFsX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFN0cmluZ0xpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFR5cGVMaXRlcmFsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNjM6MTogZW50cnlSdWxlWFR5cGVMaXRlcmFsIDogcnVsZVhUeXBlTGl0ZXJhbCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhUeXBlTGl0ZXJhbCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzY0OjE6ICggcnVsZVhUeXBlTGl0ZXJhbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM2NToxOiBydWxlWFR5cGVMaXRlcmFsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHlwZUxpdGVyYWxSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYVHlwZUxpdGVyYWxfaW5fZW50cnlSdWxlWFR5cGVMaXRlcmFsNDk5MCk7CisgICAgICAgICAgICBydWxlWFR5cGVMaXRlcmFsKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYVHlwZUxpdGVyYWw0OTk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVHlwZUxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhUeXBlTGl0ZXJhbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzcyOjE6IHJ1bGVYVHlwZUxpdGVyYWwgOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYVHlwZUxpdGVyYWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM3NjoyOiAoICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzc3OjE6ICggKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM3NzoxOiAoICggcnVsZV9fWFR5cGVMaXRlcmFsX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNzg6MTogKCBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM3OToxOiAoIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM3OToyOiBydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVHlwZUxpdGVyYWxfX0dyb3VwX18wX2luX3J1bGVYVHlwZUxpdGVyYWw1MDIzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hUeXBlTGl0ZXJhbF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYVHlwZUxpdGVyYWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFRocm93RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzkxOjE6IGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24gOiBydWxlWFRocm93RXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM5MjoxOiAoIHJ1bGVYVGhyb3dFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzkzOjE6IHJ1bGVYVGhyb3dFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFRocm93RXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uNTA1MCk7CisgICAgICAgICAgICBydWxlWFRocm93RXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhUaHJvd0V4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhUaHJvd0V4cHJlc3Npb241MDU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVGhyb3dFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVGhyb3dFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MDA6MTogcnVsZVhUaHJvd0V4cHJlc3Npb24gOiAoICggcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFRocm93RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDA0OjI6ICggKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDA1OjE6ICggKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MDU6MTogKCAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQwNjoxOiAoIHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MDc6MTogKCBydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDA3OjI6IHJ1bGVfX1hUaHJvd0V4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVGhyb3dFeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFRocm93RXhwcmVzc2lvbjUwODMpOworICAgICAgICAgICAgcnVsZV9fWFRocm93RXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFRocm93RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDE5OjE6IGVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIDogcnVsZVhSZXR1cm5FeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQyMDoxOiAoIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQyMToxOiBydWxlWFJldHVybkV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJldHVybkV4cHJlc3Npb25faW5fZW50cnlSdWxlWFJldHVybkV4cHJlc3Npb241MTEwKTsKKyAgICAgICAgICAgIHJ1bGVYUmV0dXJuRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhSZXR1cm5FeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYUmV0dXJuRXhwcmVzc2lvbjUxMTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhSZXR1cm5FeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUmV0dXJuRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDI4OjE6IHJ1bGVYUmV0dXJuRXhwcmVzc2lvbiA6ICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWFJldHVybkV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQzMjoyOiAoICggKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzM6MTogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzM6MTogKCAoIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzQ6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzU6MTogKCBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQzNToyOiBydWxlX19YUmV0dXJuRXhwcmVzc2lvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMF9pbl9ydWxlWFJldHVybkV4cHJlc3Npb241MTQzKTsKKyAgICAgICAgICAgIHJ1bGVfX1hSZXR1cm5FeHByZXNzaW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFJldHVybkV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ0NzoxOiBlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiA6IHJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NDg6MTogKCBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NDk6MTogcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uNTE3MCk7CisgICAgICAgICAgICBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb241MTc3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ1NjoxOiBydWxlWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gOiAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NjA6MjogKCAoICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDYxOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDYxOjE6ICggKCBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDYyOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDYzOjE6ICggcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NjM6MjogcnVsZV9fWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25fX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzBfaW5fcnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uNTIwMyk7CisgICAgICAgICAgICBydWxlX19YVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NzU6MTogZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gOiBydWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDc2OjE6ICggcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDc3OjE6IHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbjUyMzApOworICAgICAgICAgICAgcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uNTIzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFN5bmNocm9uaXplZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0ODQ6MTogcnVsZVhTeW5jaHJvbml6ZWRFeHByZXNzaW9uIDogKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDg4OjI6ICggKCAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ4OToxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ4OToxOiAoICggcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5MDoxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ5MToxOiAoIHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDkxOjI6IHJ1bGVfX1hTeW5jaHJvbml6ZWRFeHByZXNzaW9uX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wX2luX3J1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbjUyNjMpOworICAgICAgICAgICAgcnVsZV9fWFN5bmNocm9uaXplZEV4cHJlc3Npb25fX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYU3luY2hyb25pemVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUwMzoxOiBlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgOiBydWxlWENhdGNoQ2xhdXNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWENhdGNoQ2xhdXNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MDQ6MTogKCBydWxlWENhdGNoQ2xhdXNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTA1OjE6IHJ1bGVYQ2F0Y2hDbGF1c2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhDYXRjaENsYXVzZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDYXRjaENsYXVzZV9pbl9lbnRyeVJ1bGVYQ2F0Y2hDbGF1c2U1MjkwKTsKKyAgICAgICAgICAgIHJ1bGVYQ2F0Y2hDbGF1c2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhDYXRjaENsYXVzZTUyOTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhDYXRjaENsYXVzZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWENhdGNoQ2xhdXNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MTI6MTogcnVsZVhDYXRjaENsYXVzZSA6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhDYXRjaENsYXVzZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE2OjI6ICggKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MTc6MTogKCAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE3OjE6ICggKCBydWxlX19YQ2F0Y2hDbGF1c2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUxODoxOiAoIHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE5OjE6ICggcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE5OjI6IHJ1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hDYXRjaENsYXVzZV9fR3JvdXBfXzBfaW5fcnVsZVhDYXRjaENsYXVzZTUzMjMpOworICAgICAgICAgICAgcnVsZV9fWENhdGNoQ2xhdXNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhDYXRjaENsYXVzZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVOdW1iZXIiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUzMToxOiBlbnRyeVJ1bGVOdW1iZXIgOiBydWxlTnVtYmVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlTnVtYmVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MzU6MTogKCBydWxlTnVtYmVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTM2OjE6IHJ1bGVOdW1iZXIgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU51bWJlcl9pbl9lbnRyeVJ1bGVOdW1iZXI1MzU1KTsKKyAgICAgICAgICAgIHJ1bGVOdW1iZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU51bWJlcjUzNjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU51bWJlciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlTnVtYmVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NDY6MTogcnVsZU51bWJlciA6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVOdW1iZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU1MToyOiAoICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU1MjoxOiAoICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTUyOjE6ICggKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NTM6MTogKCBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTU0OjE6ICggcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU1NDoyOiBydWxlX19OdW1iZXJfX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXNfaW5fcnVsZU51bWJlcjUzOTIpOworICAgICAgICAgICAgcnVsZV9fTnVtYmVyX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisgICAgICAgICAgICAJbXlIaWRkZW5Ub2tlblN0YXRlLnJlc3RvcmUoKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVOdW1iZXIiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTY5OjE6IGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UgOiBydWxlSnZtVHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU3MDoxOiAoIHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTcxOjE6IHJ1bGVKdm1UeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtVHlwZVJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlNTQyMSk7CisgICAgICAgICAgICBydWxlSnZtVHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVR5cGVSZWZlcmVuY2U1NDI4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1Nzg6MTogcnVsZUp2bVR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU4MjoyOiAoICggKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODM6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODM6MTogKCAoIHJ1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODQ6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODU6MTogKCBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU4NToyOiBydWxlX19Kdm1UeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVR5cGVSZWZlcmVuY2VfX0FsdGVybmF0aXZlc19pbl9ydWxlSnZtVHlwZVJlZmVyZW5jZTU0NTQpOworICAgICAgICAgICAgcnVsZV9fSnZtVHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1UeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUFycmF5QnJhY2tldHMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU5NzoxOiBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzIDogcnVsZUFycmF5QnJhY2tldHMgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVBcnJheUJyYWNrZXRzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1OTg6MTogKCBydWxlQXJyYXlCcmFja2V0cyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU5OToxOiBydWxlQXJyYXlCcmFja2V0cyBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUFycmF5QnJhY2tldHNfaW5fZW50cnlSdWxlQXJyYXlCcmFja2V0czU0ODEpOworICAgICAgICAgICAgcnVsZUFycmF5QnJhY2tldHMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRBcnJheUJyYWNrZXRzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBcnJheUJyYWNrZXRzNTQ4OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXJyYXlCcmFja2V0cyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlQXJyYXlCcmFja2V0cyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjA2OjE6IHJ1bGVBcnJheUJyYWNrZXRzIDogKCAoIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUFycmF5QnJhY2tldHMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYxMDoyOiAoICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYxMToxOiAoICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjExOjE6ICggKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MTI6MTogKCBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjEzOjE6ICggcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYxMzoyOiBydWxlX19BcnJheUJyYWNrZXRzX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fQXJyYXlCcmFja2V0c19fR3JvdXBfXzBfaW5fcnVsZUFycmF5QnJhY2tldHM1NTE0KTsKKyAgICAgICAgICAgIHJ1bGVfX0FycmF5QnJhY2tldHNfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUFycmF5QnJhY2tldHMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEZ1bmN0aW9uVHlwZVJlZiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjI1OjE6IGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYgOiBydWxlWEZ1bmN0aW9uVHlwZVJlZiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYyNjoxOiAoIHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjI3OjE6IHJ1bGVYRnVuY3Rpb25UeXBlUmVmIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEZ1bmN0aW9uVHlwZVJlZl9pbl9lbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmNTU0MSk7CisgICAgICAgICAgICBydWxlWEZ1bmN0aW9uVHlwZVJlZigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhGdW5jdGlvblR5cGVSZWY1NTQ4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRnVuY3Rpb25UeXBlUmVmIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MzQ6MTogcnVsZVhGdW5jdGlvblR5cGVSZWYgOiAoICggcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlWEZ1bmN0aW9uVHlwZVJlZigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjM4OjI6ICggKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjM5OjE6ICggKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Mzk6MTogKCAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY0MDoxOiAoIHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2NDE6MTogKCBydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjQxOjI6IHJ1bGVfX1hGdW5jdGlvblR5cGVSZWZfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YRnVuY3Rpb25UeXBlUmVmX19Hcm91cF9fMF9pbl9ydWxlWEZ1bmN0aW9uVHlwZVJlZjU1NzQpOworICAgICAgICAgICAgcnVsZV9fWEZ1bmN0aW9uVHlwZVJlZl9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEZ1bmN0aW9uVHlwZVJlZiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjUzOjE6IGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY1NDoxOiAoIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY1NToxOiBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U1NjAxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZTU2MDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjYyOjE6IHJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY2NjoyOiAoICggKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Njc6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Njc6MTogKCAoIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Njg6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Njk6MTogKCBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY2OToyOiBydWxlX19Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMF9pbl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U1NjM0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2ODE6MTogZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIDogcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjgyOjE6ICggcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY4MzoxOiBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VfaW5fZW50cnlSdWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlNTY2MSk7CisgICAgICAgICAgICBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U1NjY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjkwOjE6IHJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgOiAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2OTQ6MjogKCAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2OTU6MTogKCAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY5NToxOiAoICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjk2OjE6ICggcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY5NzoxOiAoIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2OTc6MjogcnVsZV9fSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlX19BbHRlcm5hdGl2ZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzX2luX3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2U1Njk0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZV9fQWx0ZXJuYXRpdmVzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjcwOToxOiBlbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgOiBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MTA6MTogKCBydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzExOjE6IHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U1NzIxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTU3MjgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MTg6MTogcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSA6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzIyOjI6ICggKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MjM6MTogKCAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzIzOjE6ICggKCBydWxlX19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjcyNDoxOiAoIHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzI1OjE6ICggcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzI1OjI6IHJ1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZV9fR3JvdXBfXzBfaW5fcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTU3NTQpOworICAgICAgICAgICAgcnVsZV9fSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVKdm1VcHBlckJvdW5kIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Mzc6MTogZW50cnlSdWxlSnZtVXBwZXJCb3VuZCA6IHJ1bGVKdm1VcHBlckJvdW5kIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlSnZtVXBwZXJCb3VuZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzM4OjE6ICggcnVsZUp2bVVwcGVyQm91bmQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Mzk6MTogcnVsZUp2bVVwcGVyQm91bmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1VcHBlckJvdW5kX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmQ1NzgxKTsKKyAgICAgICAgICAgIHJ1bGVKdm1VcHBlckJvdW5kKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtVXBwZXJCb3VuZDU3ODgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bVVwcGVyQm91bmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc0NjoxOiBydWxlSnZtVXBwZXJCb3VuZCA6ICggKCBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1VcHBlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3NTA6MjogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3NTE6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc1MToxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzUyOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc1MzoxOiAoIHJ1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3NTM6MjogcnVsZV9fSnZtVXBwZXJCb3VuZF9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX0p2bVVwcGVyQm91bmRfX0dyb3VwX18wX2luX3J1bGVKdm1VcHBlckJvdW5kNTgxNCk7CisgICAgICAgICAgICBydWxlX19Kdm1VcHBlckJvdW5kX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1VcHBlckJvdW5kIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzY1OjE6IGVudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCA6IHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc2NjoxOiAoIHJ1bGVKdm1VcHBlckJvdW5kQW5kZWQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Njc6MTogcnVsZUp2bVVwcGVyQm91bmRBbmRlZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlSnZtVXBwZXJCb3VuZEFuZGVkX2luX2VudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZDU4NDEpOworICAgICAgICAgICAgcnVsZUp2bVVwcGVyQm91bmRBbmRlZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkNTg0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtVXBwZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVKdm1VcHBlckJvdW5kQW5kZWQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc3NDoxOiBydWxlSnZtVXBwZXJCb3VuZEFuZGVkIDogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlSnZtVXBwZXJCb3VuZEFuZGVkKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Nzg6MjogKCAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc3OToxOiAoICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Nzk6MTogKCAoIHJ1bGVfX0p2bVVwcGVyQm91bmRBbmRlZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzgwOjE6ICggcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3ODE6MTogKCBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3ODE6MjogcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtVXBwZXJCb3VuZEFuZGVkX19Hcm91cF9fMF9pbl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkNTg3NCk7CisgICAgICAgICAgICBydWxlX19Kdm1VcHBlckJvdW5kQW5kZWRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlSnZtVXBwZXJCb3VuZEFuZGVkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUp2bUxvd2VyQm91bmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc5MzoxOiBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kIDogcnVsZUp2bUxvd2VyQm91bmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3OTQ6MTogKCBydWxlSnZtTG93ZXJCb3VuZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc5NToxOiBydWxlSnZtTG93ZXJCb3VuZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bUxvd2VyQm91bmRfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZDU5MDEpOworICAgICAgICAgICAgcnVsZUp2bUxvd2VyQm91bmQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Mb3dlckJvdW5kNTkwOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlSnZtTG93ZXJCb3VuZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODAyOjE6IHJ1bGVKdm1Mb3dlckJvdW5kIDogKCAoIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZUp2bUxvd2VyQm91bmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgwNjoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgwNzoxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODA3OjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MDg6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODA5OjE6ICggcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgwOToyOiBydWxlX19Kdm1Mb3dlckJvdW5kX19Hcm91cF9fMAorICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fSnZtTG93ZXJCb3VuZF9fR3JvdXBfXzBfaW5fcnVsZUp2bUxvd2VyQm91bmQ1OTM0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRfX0dyb3VwX18wKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUp2bUxvd2VyQm91bmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MjE6MTogZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkIDogcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODIyOjE6ICggcnVsZUp2bUxvd2VyQm91bmRBbmRlZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgyMzoxOiBydWxlSnZtTG93ZXJCb3VuZEFuZGVkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVKdm1Mb3dlckJvdW5kQW5kZWRfaW5fZW50cnlSdWxlSnZtTG93ZXJCb3VuZEFuZGVkNTk2MSk7CisgICAgICAgICAgICBydWxlSnZtTG93ZXJCb3VuZEFuZGVkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQ1OTY4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUp2bUxvd2VyQm91bmRBbmRlZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODMwOjE6IHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQgOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgzNDoyOiAoICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODM1OjE6ICggKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgzNToxOiAoICggcnVsZV9fSnZtTG93ZXJCb3VuZEFuZGVkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MzY6MTogKCBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgzNzoxOiAoIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgzNzoyOiBydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Kdm1Mb3dlckJvdW5kQW5kZWRfX0dyb3VwX18wX2luX3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQ1OTk0KTsKKyAgICAgICAgICAgIHJ1bGVfX0p2bUxvd2VyQm91bmRBbmRlZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODUxOjE6IGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgOiBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGVudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg1MjoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODUzOjE6IHJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkNjAyMyk7CisgICAgICAgICAgICBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ2MDMwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4NjA6MTogcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODY0OjI6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODY1OjE6ICggKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4NjU6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg2NjoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4Njc6MTogKCBydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODY3OjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkX19Hcm91cF9fMF9pbl9ydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZDYwNTYpOworICAgICAgICAgICAgcnVsZV9fUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldEdyb3VwKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg4MToxOiBlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gOiBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4ODI6MTogKCBydWxlWEltcG9ydERlY2xhcmF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODgzOjE6IHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhJbXBvcnREZWNsYXJhdGlvbl9pbl9lbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb242MDg1KTsKKyAgICAgICAgICAgIHJ1bGVYSW1wb3J0RGVjbGFyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbjYwOTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEltcG9ydERlY2xhcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4OTA6MTogcnVsZVhJbXBvcnREZWNsYXJhdGlvbiA6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVhJbXBvcnREZWNsYXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODk0OjI6ICggKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4OTU6MTogKCAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODk1OjE6ICggKCBydWxlX19YSW1wb3J0RGVjbGFyYXRpb25fX0dyb3VwX18wICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg5NjoxOiAoIHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODk3OjE6ICggcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODk3OjI6IHJ1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hJbXBvcnREZWNsYXJhdGlvbl9fR3JvdXBfXzBfaW5fcnVsZVhJbXBvcnREZWNsYXJhdGlvbjYxMTgpOworICAgICAgICAgICAgcnVsZV9fWEltcG9ydERlY2xhcmF0aW9uX19Hcm91cF9fMCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRHcm91cCgpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhJbXBvcnREZWNsYXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkwOToxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgOiBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MTA6MTogKCBydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTExOjE6IHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ2MTQ1KTsKKyAgICAgICAgICAgIHJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydDYxNTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MTg6MTogcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCA6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTIyOjI6ICggKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MjM6MTogKCAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTIzOjE6ICggKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSApICggKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyNDoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkgKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyNDoxOiAoICggcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MjU6MTogKCBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyNjoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyNjoyOiBydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX2luX3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ2MTgwKTsKKyAgICAgICAgICAgIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5Mjk6MTogKCAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkzMDoxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkzMToxOiAoIHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAgKSoKKyAgICAgICAgICAgIGxvb3AxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICAgICAgaW50IExBMV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMD09UlVMRV9JRCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTFfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMV8yPT00NSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTMxOjI6IHJ1bGVfX1F1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF9fR3JvdXBfXzAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRfX0dyb3VwX18wX2luX3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ2MTkyKTsKKyAgICAgICAgICAgIAkgICAgcnVsZV9fUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0X19Hcm91cF9fMCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0R3JvdXAoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRW51bSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTQ1OjE6IHJ1bGVSb2xlRW51bSA6ICggKCBydWxlX19Sb2xlRW51bV9fQWx0ZXJuYXRpdmVzICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NDk6MTogKCAoICggcnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk1MDoxOiAoICggcnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NTA6MTogKCAoIHJ1bGVfX1JvbGVFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTUxOjE6ICggcnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NTI6MTogKCBydWxlX19Sb2xlRW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NTI6MjogcnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlcworICAgICAgICAgICAgeworICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fUm9sZUVudW1fX0FsdGVybmF0aXZlc19pbl9ydWxlUm9sZUVudW02MjMyKTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVFbnVtX19BbHRlcm5hdGl2ZXMoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRBbHRlcm5hdGl2ZXMoKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRW51bSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZVByb3BlcnR5RW51bSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY0OjE6IHJ1bGVSb2xlUHJvcGVydHlFbnVtIDogKCAoIHJ1bGVfX1JvbGVQcm9wZXJ0eUVudW1fX0FsdGVybmF0aXZlcyApICkgOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVSb2xlUHJvcGVydHlFbnVtKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5Njg6MTogKCAoICggcnVsZV9fUm9sZVByb3BlcnR5RW51bV9fQWx0ZXJuYXRpdmVzICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY5OjE6ICggKCBydWxlX19Sb2xlUHJvcGVydHlFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY5OjE6ICggKCBydWxlX19Sb2xlUHJvcGVydHlFbnVtX19BbHRlcm5hdGl2ZXMgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTcwOjE6ICggcnVsZV9fUm9sZVByb3BlcnR5RW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVByb3BlcnR5RW51bUFjY2VzcygpLmdldEFsdGVybmF0aXZlcygpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTcxOjE6ICggcnVsZV9fUm9sZVByb3BlcnR5RW51bV9fQWx0ZXJuYXRpdmVzICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NzE6MjogcnVsZV9fUm9sZVByb3BlcnR5RW51bV9fQWx0ZXJuYXRpdmVzCisgICAgICAgICAgICB7CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19Sb2xlUHJvcGVydHlFbnVtX19BbHRlcm5hdGl2ZXNfaW5fcnVsZVJvbGVQcm9wZXJ0eUVudW02MjY4KTsKKyAgICAgICAgICAgIHJ1bGVfX1JvbGVQcm9wZXJ0eUVudW1fX0FsdGVybmF0aXZlcygpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0QWx0ZXJuYXRpdmVzKCkpOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZVByb3BlcnR5RW51bSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJsaXBQcm9jZXNzRW51bSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTgzOjE6IHJ1bGVSb2xlQmxpcFByb2Nlc3NFbnVtIDogKCAoICdzdGFydGFibGUnICkgKSA7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk4NzoxOiAoICggKCAnc3RhcnRhYmxlJyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk4ODoxOiAoICggJ3N0YXJ0YWJsZScgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTg4OjE6ICggKCAnc3RhcnRhYmxlJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5ODk6MTogKCAnc3RhcnRhYmxlJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0VudW1BY2Nlc3MoKS5nZXRTdGFydGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5OTA6MTogKCAnc3RhcnRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTkwOjM6ICdzdGFydGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaChpbnB1dCwxNixGT0xMT1dfMTZfaW5fcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW02MzA1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzRW51bUFjY2VzcygpLmdldFN0YXJ0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb24oKSk7IAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmxpcFByb2Nlc3NFbnVtIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDAzOjE6IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSA6ICggKCAnZXhlY3V0YWJsZScgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlUm9sZUJsaXBVc2VyVGFza0VudW0oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAwNzoxOiAoICggKCAnZXhlY3V0YWJsZScgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMDg6MTogKCAoICdleGVjdXRhYmxlJyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMDg6MTogKCAoICdleGVjdXRhYmxlJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMDk6MTogKCAnZXhlY3V0YWJsZScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrRW51bUFjY2VzcygpLmdldEV4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMTA6MTogKCAnZXhlY3V0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxMDozOiAnZXhlY3V0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKGlucHV0LDE3LEZPTExPV18xN19pbl9ydWxlUm9sZUJsaXBVc2VyVGFza0VudW02MzQ0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0VudW1BY2Nlc3MoKS5nZXRFeGVjdXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAyMjoxOiBydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVSb2xlRW50aXR5ICkgfCAoIHJ1bGVSb2xlQmVhbiApIHwgKCBydWxlUm9sZUR0byApIHwgKCBydWxlUm9sZUJsaXBQcm9jZXNzICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMjY6MTogKCAoIHJ1bGVSb2xlRW50aXR5ICkgfCAoIHJ1bGVSb2xlQmVhbiApIHwgKCBydWxlUm9sZUR0byApIHwgKCBydWxlUm9sZUJsaXBQcm9jZXNzICkgKQorICAgICAgICAgICAgaW50IGFsdDI9NDsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA2NToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mj0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjY6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDI9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY3OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQyPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3MToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mj00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDIsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMjc6MTogKCBydWxlUm9sZUVudGl0eSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAyNzoxOiAoIHJ1bGVSb2xlRW50aXR5ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAyODoxOiBydWxlUm9sZUVudGl0eQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eV9pbl9ydWxlX19Sb2xlRWxlbWVudF9fQWx0ZXJuYXRpdmVzNjM4MSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSb2xlRW50aXR5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAzMzo2OiAoIHJ1bGVSb2xlQmVhbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAzMzo2OiAoIHJ1bGVSb2xlQmVhbiApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMzQ6MTogcnVsZVJvbGVCZWFuCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUJlYW5QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJlYW5faW5fcnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlczYzOTgpOworICAgICAgICAgICAgICAgICAgICBydWxlUm9sZUJlYW4oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUJlYW5QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAzOTo2OiAoIHJ1bGVSb2xlRHRvICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDM5OjY6ICggcnVsZVJvbGVEdG8gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDQwOjE6IHJ1bGVSb2xlRHRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUR0b1BhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvX2luX3J1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXM2NDE1KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVJvbGVEdG8oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUR0b1BhcnNlclJ1bGVDYWxsXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDQ1OjY6ICggcnVsZVJvbGVCbGlwUHJvY2VzcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA0NTo2OiAoIHJ1bGVSb2xlQmxpcFByb2Nlc3MgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDQ2OjE6IHJ1bGVSb2xlQmxpcFByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJsaXBQcm9jZXNzX2luX3J1bGVfX1JvbGVFbGVtZW50X19BbHRlcm5hdGl2ZXM2NDMyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVJvbGVCbGlwUHJvY2VzcygpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fUm9sZUVsZW1lbnRfX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Sb2xlRW50aXR5RmVhdHVyZV9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNTY6MTogcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyA6ICggKCBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSApIHwgKCBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDYwOjE6ICggKCBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSApIHwgKCBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIGludCBhbHQzPTI7CisgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEEzXzA9PTczKSApIHsKKyAgICAgICAgICAgICAgICBhbHQzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBM18wPT03NCkgKSB7CisgICAgICAgICAgICAgICAgYWx0Mz0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDYxOjE6ICggcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNjE6MTogKCBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNjI6MTogcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRW50aXR5QXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGVfaW5fcnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlczY0NjQpOworICAgICAgICAgICAgICAgICAgICBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRW50aXR5QXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNjc6NjogKCBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA2Nzo2OiAoIHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA2ODoxOiBydWxlUm9sZUVudGl0eVJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eVJlZmVyZW5jZV9pbl9ydWxlX19Sb2xlRW50aXR5RmVhdHVyZV9fQWx0ZXJuYXRpdmVzNjQ4MSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fUm9sZUVudGl0eUZlYXR1cmVfX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19Sb2xlQmVhbkZlYXR1cmVfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDc4OjE6IHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSApIHwgKCBydWxlUm9sZUJlYW5SZWZlcmVuY2UgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwODI6MTogKCAoIHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSApIHwgKCBydWxlUm9sZUJlYW5SZWZlcmVuY2UgKSApCisgICAgICAgICAgICBpbnQgYWx0ND0yOworICAgICAgICAgICAgaW50IExBNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNF8wPT03MykgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTRfMD09NzQpICkgeworICAgICAgICAgICAgICAgIGFsdDQ9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA4MzoxOiAoIHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA4MzoxOiAoIHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwODQ6MTogcnVsZVJvbGVCZWFuQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJvbGVCZWFuQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuQXR0cmlidXRlX2luX3J1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzNjUxMyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA4OTo2OiAoIHJ1bGVSb2xlQmVhblJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA4OTo2OiAoIHJ1bGVSb2xlQmVhblJlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwOTA6MTogcnVsZVJvbGVCZWFuUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJvbGVCZWFuUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuUmVmZXJlbmNlX2luX3J1bGVfX1JvbGVCZWFuRmVhdHVyZV9fQWx0ZXJuYXRpdmVzNjUzMCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVSb2xlQmVhblJlZmVyZW5jZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fUm9sZUJlYW5GZWF0dXJlX19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTAwOjE6IHJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMgOiAoICggcnVsZVJvbGVEdG9BdHRyaWJ1dGUgKSB8ICggcnVsZVJvbGVEdG9SZWZlcmVuY2UgKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEwNDoxOiAoICggcnVsZVJvbGVEdG9BdHRyaWJ1dGUgKSB8ICggcnVsZVJvbGVEdG9SZWZlcmVuY2UgKSApCisgICAgICAgICAgICBpbnQgYWx0NT0yOworICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBNV8wPT03MykgKSB7CisgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTVfMD09NzQpICkgeworICAgICAgICAgICAgICAgIGFsdDU9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEwNToxOiAoIHJ1bGVSb2xlRHRvQXR0cmlidXRlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTA1OjE6ICggcnVsZVJvbGVEdG9BdHRyaWJ1dGUgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTA2OjE6IHJ1bGVSb2xlRHRvQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b0F0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvQXR0cmlidXRlX2luX3J1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXM2NTYyKTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZVJvbGVEdG9BdHRyaWJ1dGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b0F0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTExOjY6ICggcnVsZVJvbGVEdG9SZWZlcmVuY2UgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMTE6NjogKCBydWxlUm9sZUR0b1JlZmVyZW5jZSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMTI6MTogcnVsZVJvbGVEdG9SZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRHRvUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVEdG9SZWZlcmVuY2VfaW5fcnVsZV9fUm9sZUR0b0ZlYXR1cmVfX0FsdGVybmF0aXZlczY1NzkpOworICAgICAgICAgICAgICAgICAgICBydWxlUm9sZUR0b1JlZmVyZW5jZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRHRvUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX1JvbGVEdG9GZWF0dXJlX19BbHRlcm5hdGl2ZXMiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZV9fWEFubm90YXRpb25fX0FsdGVybmF0aXZlc18zXzEiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMjoxOiBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgCQlpbnQgc3RhY2tTaXplID0ga2VlcFN0YWNrU2l6ZSgpOworICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTI2OjE6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMSApICkgKQorICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgIGFsdDYgPSBkZmE2LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ2KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyNzoxOiAoICggcnVsZV9fWEFubm90YXRpb25fX0dyb3VwXzNfMV8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMjc6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyODoxOiAoIHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMjk6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTI5OjI6IHJ1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uX19Hcm91cF8zXzFfMF9fMF9pbl9ydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMTY2MTEpOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fR3JvdXBfM18xXzBfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0R3JvdXBfM18xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTMzOjY6ICggKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMzM6NjogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uX19WYWx1ZUFzc2lnbm1lbnRfM18xXzEgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMzQ6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZUFzc2lnbm1lbnRfM18xXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMzU6MTogKCBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEzNToyOiBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFubm90YXRpb25fX1ZhbHVlQXNzaWdubWVudF8zXzFfMV9pbl9ydWxlX19YQW5ub3RhdGlvbl9fQWx0ZXJuYXRpdmVzXzNfMTY2MjkpOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQW5ub3RhdGlvbl9fVmFsdWVBc3NpZ25tZW50XzNfMV8xKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFZhbHVlQXNzaWdubWVudF8zXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICByZXBvcnRFcnJvcihyZSk7CisgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKworICAgICAgICAgICAgCXJlc3RvcmVTdGFja1NpemUoc3RhY2tTaXplKTsKKworICAgICAgICB9CisgICAgICAgIHJldHVybiA7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVfX1hBbm5vdGF0aW9uX19BbHRlcm5hdGl2ZXNfM18xIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTQ0OjE6IHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAgKSApICk7CisgICAgcHVibGljIGZpbmFsIHZvaWQgcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNDg6MTogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkgfCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkgKQorICAgICAgICAgICAgaW50IGFsdDc9MjsKKyAgICAgICAgICAgIGFsdDcgPSBkZmE3LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE0OToxOiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTQ5OjE6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTUwOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTUxOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNTE6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMF9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzBfaW5fcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzNjY2Mik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzBfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE1NTo2OiAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTU1OjY6ICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X19Hcm91cF8xX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTU2OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTU3OjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNTc6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fR3JvdXBfMV9fMAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzBfaW5fcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzNjY4MCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfX0dyb3VwXzFfXzAoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9fQWx0ZXJuYXRpdmVzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE2NjoxOiBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIDogKCAoICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKSApIHwgKCBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE3MDoxOiAoICggKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApICkgfCAoIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIGludCBhbHQ4PTI7CisgICAgICAgICAgICBhbHQ4ID0gZGZhOC5wcmVkaWN0KGlucHV0KTsKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0OCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNzE6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNzE6MTogKCAoIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTcyOjE6ICggcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNzM6MTogKCBydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNzM6MjogcnVsZV9fWEFubm90YXRpb25FbGVtZW50VmFsdWVfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fR3JvdXBfMF9fMF9pbl9ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzNjcxMyk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX19Hcm91cF8wX18wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTc3OjY6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTc3OjY6ICggcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE3ODoxOiBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzNjczMSk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeworICAgICAgICAgICAgcmVwb3J0RXJyb3IocmUpOworICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisKKyAgICAgICAgICAgIAlyZXN0b3JlU3RhY2tTaXplKHN0YWNrU2l6ZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gOworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlX19YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZV9fQWx0ZXJuYXRpdmVzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE4ODoxOiBydWxlX19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9fQWx0ZXJuYXRpdmVzIDogKCAoIHJ1bGVYQW5ub3RhdGlvbiApIHwgKCBydWxlWEV4cHJlc3Npb24gKSApOworICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJ1bGVfX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uX19BbHRlcm5hdGl2ZXMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworCisgICAgICAgIAkJaW50IHN0YWNrU2l6ZSA9IGtlZXBTdGFja1NpemUoKTsKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5MjoxOiAoICggcnVsZVhBbm5vdGF0aW9uICkgfCAoIHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE5XzA9PTc1KSApIHsKKyAgICAgICAgICAgICAgICBhbHQ5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTlfMD49UlVMRV9JRCAmJiBMQTlfMDw9UlVMRV9TVFJJTkcpfHxMQTlfMD09Mjl8fChMQTlfMD49MzYgJiYgTEE5XzA8PTM3KXx8TEE5XzA9PTQyfHwoTEE5XzA+PTQ3ICYmIExBOV8wPD01Mil8fExBOV8wPT02Mnx8TEE5XzA9PTc2fHwoTEE5XzA+PTgwICYmIExBOV8wPD04MSl8fExBOV8wPT04NXx8TEE5XzA9PTg3fHwoTEE5XzA+PTkxICYmIExBOV8wPD05OSl8fExBOV8wPT0xMDF8fExBOV8wPT0xMDkpICkgeworICAgICAgICAgICAgICAgIGFsdDk9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA5LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5MzoxOiAoIHJ1bGVYQW5ub3RhdGlvbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5MzoxOiAoIHJ1bGVYQW5ub3RhdGlvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxOTQ6MTogcnVsZVhBbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25faW5fcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlczY3NjMpOworICAgICAgICAgICAgICAgICAgICBydWxlWEFubm90YXRpb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5OTo2OiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5OTo2OiAoIHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMDA6MTogcnVsZVhFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25faW5fcnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlczY3ODApOworICAgICAgICAgICAgICAgICAgICBydWxlWEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiA7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBhZnRlcihncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsKKyAgICAgICAgICAgIHJlcG9ydEVycm9yKHJlKTsKKyAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworCisgICAgICAgICAgICAJcmVzdG9yZVN0YWNrU2l6ZShzdGFja1NpemUpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZV9fWEFubm90YXRpb25PckV4cHJlc3Npb25fX0FsdGVybmF0aXZlcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTA6MTogcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlcyA6ICggKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKSB8ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkgKTsKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAJCWludCBzdGFja1NpemUgPSBrZWVwU3RhY2tTaXplKCk7CisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTQ6MTogKCAoICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKSApIHwgKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkgKSApCisgICAgICAgICAgICBpbnQgYWx0MTA9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzE9PUVPRnx8KExBMTBfMT49UlVMRV9JRCAmJiBMQTEwXzE8PVJVTEVfU1RSSU5HKXx8KExBMTBfMT49MTQgJiYgTEExMF8xPD0xNSl8fChMQTEwXzE+PTE4ICYmIExBMTBfMTw9NTIpfHwoTEExMF8xPj02MiAmJiBMQTEwXzE8PTYzKXx8KExBMTBfMT49NzYgJiYgTEExMF8xPD0xMDIpfHwoTEExMF8xPj0xMDUgJiYgTEExMF8xPD0xMDYpfHwoTEExMF8xPj0xMDggJiYgTEExMF8xPD0xMDkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEwXzE9PTEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEwLCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0NzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBMTBfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExMF8yPT1FT0Z8fChMQTEwXzI+PVJVTEVfSUQgJiYgTEExMF8yPD1SVUxFX1NUUklORyl8fChMQTEwXzI+PTE0ICYmIExBMTBfMjw9MTUpfHwoTEExMF8yPj0xOCAmJiBMQTEwXzI8PTUyKXx8KExBMTBfMj49NjIgJiYgTEExMF8yPD02Myl8fChMQTEwXzI+PTc2ICYmIExBMTBfMjw9MTAyKXx8KExBMTBfMj49MTA1ICYmIExBMTBfMjw9MTA2KXx8KExBMTBfMj49MTA4ICYmIExBMTBfMjw9MTA5KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMF8yPT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMCwgMiwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBMQTEwXzMgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMTBfMz09RU9GfHwoTEExMF8zPj1SVUxFX0lEICYmIExBMTBfMzw9UlVMRV9TVFJJTkcpfHwoTEExMF8zPj0xNCAmJiBMQTEwXzM8PTE1KXx8KExBMTBfMz49MTggJiYgTEExMF8zPD01Mil8fChMQTEwXzM+PTYyICYmIExBMTBfMzw9NjMpfHwoTEExMF8zPj03NiAmJiBMQTEwXzM8PTEwMil8fChMQTEwXzM+PTEwNSAmJiBMQTEwXzM8PTEwNil8fChMQTEwXzM+PTEwOCAmJiBMQTEwXzM8PTEwOSkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMTBfMz09MTMpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiA7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTAsIDMsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEExMF80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTEwXzQ9PTEzKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTEwXzQ9PUVPRnx8KExBMTBfND49UlVMRV9JRCAmJiBMQTEwXzQ8PVJVTEVfU1RSSU5HKXx8KExBMTBfND49MTQgJiYgTEExMF80PD0xNSl8fChMQTEwXzQ+PTE4ICYmIExBMTBfNDw9NTIpfHwoTEExMF80Pj02MiAmJiBMQTEwXzQ8PTYzKXx8KExBMTBfND49NzYgJiYgTEExMF80PD0xMDIpfHwoTEExMF80Pj0xMDUgJiYgTEExMF80PD0xMDYpfHwoTEExMF80Pj0xMDggJiYgTEExMF80PD0xMDkpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDEwLCA0LCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBMTBfNSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExMF81PT1FT0Z8fChMQTEwXzU+PVJVTEVfSUQgJiYgTEExMF81PD1SVUxFX1NUUklORyl8fChMQTEwXzU+PTE0ICYmIExBMTBfNTw9MTUpfHwoTEExMF81Pj0xOCAmJiBMQTEwXzU8PTUyKXx8KExBMTBfNT49NjIgJiYgTEExMF81PD02Myl8fChMQTEwXzU+PTc2ICYmIExBMTBfNTw9MTAyKXx8KExBMTBfNT49MTA1ICYmIExBMTBfNTw9MTA2KXx8KExBMTBfNT49MTA4ICYmIExBMTBfNTw9MTA5KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExMF81PT0xMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIDt9CisgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMCwgNSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9IRVg6CisgICAgICAgICAgICBjYXNlIFJVTEVfSU5UOgorICAgICAgICAgICAgY2FzZSBSVUxFX0RFQ0lNQUw6CisgICAgICAgICAgICBjYXNlIFJVTEVfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSAyOToKKyAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICBjYXNlIDM3OgorICAgICAgICAgICAgY2FzZSA0MjoKKyAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICBjYXNlIDUyOgorICAgICAgICAgICAgY2FzZSA2MjoKKyAgICAgICAgICAgIGNhc2UgNzY6CisgICAgICAgICAgICBjYXNlIDgwOgorICAgICAgICAgICAgY2FzZSA4MToKKyAgICAgICAgICAgIGNhc2UgODU6CisgICAgICAgICAgICBjYXNlIDg3OgorICAgICAgICAgICAgY2FzZSA5MToKKyAgICAgICAgICAgIGNhc2UgOTI6CisgICAgICAgICAgICBjYXNlIDkzOgorICAgICAgICAgICAgY2FzZSA5NDoKKyAgICAgICAgICAgIGNhc2UgOTU6CisgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgY2FzZSA5NzoKKyAgICAgICAgICAgIGNhc2UgOTg6CisgICAgICAgICAgICBjYXNlIDk5OgorICAgICAgICAgICAgY2FzZSAxMDE6CisgICAgICAgICAgICBjYXNlIDEwOToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0MTA9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gO30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxMCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTU6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTU6MTogKCAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjE2OjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTc6MTogKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMTc6MjogcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzBfXzAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMF9fMF9pbl9ydWxlX19YQXNzaWdubWVudF9fQWx0ZXJuYXRpdmVzNjgxMik7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8wX18wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEdyb3VwXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjIxOjY6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjIxOjY6ICggKCBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzIyMjoxOiAoIHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjIzOjE6ICggcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzAgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjIzOjI6IHJ1bGVfX1hBc3NpZ25tZW50X19Hcm91cF8xX18wCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZV9fWEFzc2lnbm1lbnRfX0dyb3VwXzFfXzBfaW5fcnVsZV9fWEFzc2lnbm1lbnRfX0FsdGVybmF0aXZlczY4MzApOworICAgICAgICAgICAgICAgICAgICBydWxlX19YQXNzaWdubWVudF9fR3JvdXBfMV9fMCgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIDsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRHcm91cF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2ludGVybmFsL0F1dGhvcml6YXRpb25EU0xBY3RpdmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9pbnRlcm5hbC9BdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzNDI1MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9pbnRlcm5hbC9BdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmxvZzRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5zaGFyZWQuU2hhcmVkU3RhdGVNb2R1bGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudXRpbC5Nb2R1bGVzMjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTWFwczsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Nb2R1bGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3YXMgZ2VuZXJhdGVkLiBDdXN0b21pemF0aW9ucyBzaG91bGQgb25seSBoYXBwZW4gaW4gYSBuZXdseQorICogaW50cm9kdWNlZCBzdWJjbGFzcy4gCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7CisJCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfT1NCUF9YVEVYVF9BVVRIT1JJWkFUSU9ORFNMX0FVVEhPUklaQVRJT05EU0wgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wiOworCQorCXByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEF1dGhvcml6YXRpb25EU0xBY3RpdmF0b3IuY2xhc3MpOworCQorCXByaXZhdGUgc3RhdGljIEF1dGhvcml6YXRpb25EU0xBY3RpdmF0b3IgSU5TVEFOQ0U7CisJCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBJbmplY3Rvcj4gaW5qZWN0b3JzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTWFwKE1hcHMuPFN0cmluZywgSW5qZWN0b3I+IG5ld0hhc2hNYXBXaXRoRXhwZWN0ZWRTaXplKDEpKTsKKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworCQlzdXBlci5zdGFydChjb250ZXh0KTsKKwkJSU5TVEFOQ0UgPSB0aGlzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWluamVjdG9ycy5jbGVhcigpOworCQlJTlNUQU5DRSA9IG51bGw7CisJCXN1cGVyLnN0b3AoY29udGV4dCk7CisJfQorCQorCXB1YmxpYyBzdGF0aWMgQXV0aG9yaXphdGlvbkRTTEFjdGl2YXRvciBnZXRJbnN0YW5jZSgpIHsKKwkJcmV0dXJuIElOU1RBTkNFOworCX0KKwkKKwlwdWJsaWMgSW5qZWN0b3IgZ2V0SW5qZWN0b3IoU3RyaW5nIGxhbmd1YWdlKSB7CisJCXN5bmNocm9uaXplZCAoaW5qZWN0b3JzKSB7CisJCQlJbmplY3RvciBpbmplY3RvciA9IGluamVjdG9ycy5nZXQobGFuZ3VhZ2UpOworCQkJaWYgKGluamVjdG9yID09IG51bGwpIHsKKwkJCQlpbmplY3RvcnMucHV0KGxhbmd1YWdlLCBpbmplY3RvciA9IGNyZWF0ZUluamVjdG9yKGxhbmd1YWdlKSk7CisJCQl9CisJCQlyZXR1cm4gaW5qZWN0b3I7CisJCX0KKwl9CisJCisJcHJvdGVjdGVkIEluamVjdG9yIGNyZWF0ZUluamVjdG9yKFN0cmluZyBsYW5ndWFnZSkgeworCQl0cnkgeworCQkJTW9kdWxlIHJ1bnRpbWVNb2R1bGUgPSBnZXRSdW50aW1lTW9kdWxlKGxhbmd1YWdlKTsKKwkJCU1vZHVsZSBzaGFyZWRTdGF0ZU1vZHVsZSA9IGdldFNoYXJlZFN0YXRlTW9kdWxlKCk7CisJCQlNb2R1bGUgdWlNb2R1bGUgPSBnZXRVaU1vZHVsZShsYW5ndWFnZSk7CisJCQlNb2R1bGUgbWVyZ2VkTW9kdWxlID0gTW9kdWxlczIubWl4aW4ocnVudGltZU1vZHVsZSwgc2hhcmVkU3RhdGVNb2R1bGUsIHVpTW9kdWxlKTsKKwkJCXJldHVybiBHdWljZS5jcmVhdGVJbmplY3RvcihtZXJnZWRNb2R1bGUpOworCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgeworCQkJbG9nZ2VyLmVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGluamVjdG9yIGZvciAiICsgbGFuZ3VhZ2UpOworCQkJbG9nZ2VyLmVycm9yKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKwkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsZWQgdG8gY3JlYXRlIGluamVjdG9yIGZvciAiICsgbGFuZ3VhZ2UsIGUpOworCQl9CisJfQorCisJcHJvdGVjdGVkIE1vZHVsZSBnZXRSdW50aW1lTW9kdWxlKFN0cmluZyBncmFtbWFyKSB7CisJCWlmIChPUkdfRUNMSVBTRV9PU0JQX1hURVhUX0FVVEhPUklaQVRJT05EU0xfQVVUSE9SSVpBVElPTkRTTC5lcXVhbHMoZ3JhbW1hcikpIHsKKwkJCXJldHVybiBuZXcgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xSdW50aW1lTW9kdWxlKCk7CisJCX0KKwkJCisJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZ3JhbW1hcik7CisJfQorCQorCXByb3RlY3RlZCBNb2R1bGUgZ2V0VWlNb2R1bGUoU3RyaW5nIGdyYW1tYXIpIHsKKwkJaWYgKE9SR19FQ0xJUFNFX09TQlBfWFRFWFRfQVVUSE9SSVpBVElPTkRTTF9BVVRIT1JJWkFUSU9ORFNMLmVxdWFscyhncmFtbWFyKSkgeworCQkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQXV0aG9yaXphdGlvbkRTTFVpTW9kdWxlKHRoaXMpOworCQl9CisJCQorCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGdyYW1tYXIpOworCX0KKwkKKwlwcm90ZWN0ZWQgTW9kdWxlIGdldFNoYXJlZFN0YXRlTW9kdWxlKCkgeworCQlyZXR1cm4gbmV3IFNoYXJlZFN0YXRlTW9kdWxlKCk7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3Zlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3Zlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzA0ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlcjsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXIgZXh0ZW5kcyBCYXNpY0RTTEVPYmplY3RIb3ZlciB7CisJCisJQE92ZXJyaWRlCisJcHVibGljIElFT2JqZWN0SG92ZXJQcm92aWRlciBnZXRIb3ZlclByb3ZpZGVyKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlclByb3ZpZGVyLmluc3RhbmNlKCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MjNkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIENvbnRyaWJ1dG9yczogICAKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5CYXNpY0RTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcjsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBCYXNpY0RTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlciB7CisJIAorICAgIHByaXZhdGUgc3RhdGljIEF1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgSU5TVEFOQ0U7CisKKyAgICBwdWJsaWMgc3RhdGljIEF1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgSU5TVEFOQ0UgPSB0aGlzOworICAgIH0KKyAgICAKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKCkgeworICAgICAgICByZXR1cm4gQXV0aG9yaXphdGlvbkRTTFVpRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IuaW5zdGFuY2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL0F1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNmFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5odG1sLklFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLkJhc2ljRFNMRU9iamVjdEhvdmVyUHJvdmlkZXI7CisKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgZXh0ZW5kcyBCYXNpY0RTTEVPYmplY3RIb3ZlclByb3ZpZGVyIHsKKwkgCisgICAgcHJpdmF0ZSBzdGF0aWMgQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlclByb3ZpZGVyIElOU1RBTkNFOworCisgICAgcHVibGljIHN0YXRpYyBBdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlclByb3ZpZGVyKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBJTlNUQU5DRSA9IHRoaXM7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJRU9iamVjdEhvdmVyRG9jdW1lbnRhdGlvblByb3ZpZGVyIGdldERvY3VtZW50YXRpb25Ib3ZlclByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gQXV0aG9yaXphdGlvbkRTTEVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlci5pbnN0YW5jZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL0F1dGhvcml6YXRpb25EU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjFmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMVWlEb2N1bWVudGF0aW9uVHJhbnNsYXRvci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpOworCitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy5jb25zdGFudHMuR2VuZXJhdG9yQ29uc3RhbnRzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvcjsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yIGV4dGVuZHMgQmFzaWNEU0xEb2N1bWVudGF0aW9uVHJhbnNsYXRvciB7CisJIAorICAgIHByaXZhdGUgc3RhdGljIEF1dGhvcml6YXRpb25EU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yIElOU1RBTkNFID0gbmV3IEF1dGhvcml6YXRpb25EU0xVaURvY3VtZW50YXRpb25UcmFuc2xhdG9yKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIEJhc2ljRFNMRG9jdW1lbnRhdGlvblRyYW5zbGF0b3IgaW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgeworICAgICAgICByZXR1cm4gamF2YS51dGlsLlJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShHZW5lcmF0b3JDb25zdGFudHMuSTE4Tl9SRVNPVVJDRV9GVUxMX0JVTkRMRV9OQU1FLCBnZXRMb2NhbGUoKSwgZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMVWlNb2R1bGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL0F1dGhvcml6YXRpb25EU0xVaU1vZHVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzM2U3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9BdXRob3JpemF0aW9uRFNMVWlNb2R1bGUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3IuaG92ZXIuSUVPYmplY3RIb3ZlclByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5ob3Zlci5odG1sLklFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmFzaWMudWkuQmFzaWNEU0xVaU1vZHVsZUhlbHBlcjsKKworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgd2l0aGluIHRoZSBJREUuCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMVWlNb2R1bGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkuQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMVWlNb2R1bGUgeworCQorCXByaXZhdGUgc3RhdGljIExvZ2dlciBMT0dHRVIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdXRob3JpemF0aW9uRFNMVWlNb2R1bGUuY2xhc3MpOworCisJcHVibGljIEF1dGhvcml6YXRpb25EU0xVaU1vZHVsZShBYnN0cmFjdFVJUGx1Z2luIHBsdWdpbikgeworCQlzdXBlcihwbHVnaW4pOworCQlCYXNpY0RTTFVpTW9kdWxlSGVscGVyLnVuaXRUZXN0VGVtcGxhdGVzKHBsdWdpbiwgTE9HR0VSKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJRU9iamVjdEhvdmVyPiBiaW5kSUVPYmplY3RIb3ZlcigpIHsKKwkgICAgIHJldHVybiBBdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyLmNsYXNzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElFT2JqZWN0SG92ZXJQcm92aWRlcj4gYmluZElFT2JqZWN0SG92ZXJQcm92aWRlcigpIHsKKwkgICAgIHJldHVybiBBdXRob3JpemF0aW9uRFNMRU9iamVjdEhvdmVyUHJvdmlkZXIuY2xhc3M7CisJfQorCQorCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSUVPYmplY3RIb3ZlckRvY3VtZW50YXRpb25Qcm92aWRlcj4gYmluZElFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIoKSB7CisJICAgICAgcmV0dXJuIEF1dGhvcml6YXRpb25EU0xFT2JqZWN0SG92ZXJEb2N1bWVudGF0aW9uUHJvdmlkZXIuY2xhc3M7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvY29udGVudGFzc2lzdC9BdXRob3JpemF0aW9uRFNMUHJvcG9zYWxQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvQXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlNjdjOAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvQXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3QKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5UmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmNvbW1vbi5BdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmNvbnRlbnRhc3Npc3QuQmFzaWNEU0xQcm9wb3NhbFByb3ZpZGVySGVscGVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuS2V5d29yZAoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LlJ1bGVDYWxsCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnVpLmNvbnRlbnRhc3Npc3QuVGVybWluYWxzUHJvcG9zYWxQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudWkuZWRpdG9yLmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuQXR0cmlidXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuUmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0F0dHJpYnV0ZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG8KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzaworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrCisKKy8qKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2NvbnRlbnRBc3Npc3Qgb24gaG93IHRvIGN1c3RvbWl6ZSBjb250ZW50IGFzc2lzdGFudAorICovCitjbGFzcyBBdXRob3JpemF0aW9uRFNMUHJvcG9zYWxQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXIgeworCisJQEluamVjdCBUZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyIHByb3ZpZGVyCisJQEluamVjdCBCYXNpY0RTTFByb3Bvc2FsUHJvdmlkZXJIZWxwZXIgcHJvdmlkZXJIZWxwZXIKKworCS8qKgorCSAgKiBUaGlzIG92ZXJyaWRlIHdpbGwgZW5hYmxlIDEgbGVuZ3RoIG5vbiBsZXR0ZXIgY2hhcmFjdGVycyBhcyBrZXl3b3JkLgorCSAgKi8KKwlvdmVycmlkZSBwcm90ZWN0ZWQgYm9vbGVhbiBpc0tleXdvcmRXb3J0aHlUb1Byb3Bvc2UoS2V5d29yZCBrZXl3b3JkKSB7CisJCXJldHVybiB0cnVlCisJfQorCisJb3ZlcnJpZGUgcHJvdGVjdGVkIGlzVmFsaWRQcm9wb3NhbChTdHJpbmcgcHJvcG9zYWwsIFN0cmluZyBwcmVmaXgsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKKwkJdmFyIHJlc3VsdCA9IHN1cGVyLmlzVmFsaWRQcm9wb3NhbChwcm9wb3NhbCwgcHJlZml4LCBjb250ZXh0KQorCQkvLyBFbnRpdHkKKwkJaWYgKGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCkgaW5zdGFuY2VvZiBSb2xlRW50aXR5QXR0cmlidXRlKSB7CisJCQlyZXR1cm4gaXNFbnRpdHlBdHRyaWJ1dGVWYWxpZFByb3Bvc2FsKGNvbnRleHQuY3VycmVudE1vZGVsIGFzIFJvbGVFbnRpdHlBdHRyaWJ1dGUsIHByb3Bvc2FsLCByZXN1bHQpOworCQl9IGVsc2UgaWYgKGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCkgaW5zdGFuY2VvZiBSb2xlRW50aXR5UmVmZXJlbmNlKSB7CisJCQlyZXR1cm4gaXNFbnRpdHlSZWZlcmVuY2VWYWxpZFByb3Bvc2FsKGNvbnRleHQuY3VycmVudE1vZGVsIGFzIFJvbGVFbnRpdHlSZWZlcmVuY2UsIHByb3Bvc2FsLCByZXN1bHQpOworCQkvLyBCZWFuCisJCX0gZWxzZSBpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFJvbGVCZWFuQXR0cmlidXRlKSB7CisJCQlyZXR1cm4gaXNCZWFuQXR0cmlidXRlVmFsaWRQcm9wb3NhbChjb250ZXh0LmN1cnJlbnRNb2RlbCBhcyBSb2xlQmVhbkF0dHJpYnV0ZSwgcHJvcG9zYWwsIHJlc3VsdCk7CisJCX0gZWxzZSBpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFJvbGVFbnRpdHlSZWZlcmVuY2UpIHsKKwkJCXJldHVybiBpc0JlYW5SZWZlcmVuY2VWYWxpZFByb3Bvc2FsKGNvbnRleHQuY3VycmVudE1vZGVsIGFzIFJvbGVCZWFuUmVmZXJlbmNlLCBwcm9wb3NhbCwgcmVzdWx0KTsKKwkJLy8gRHRvCisJCX0gZWxzZSBpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFJvbGVEdG9BdHRyaWJ1dGUpIHsKKwkJCXJldHVybiBpc0R0b0F0dHJpYnV0ZVZhbGlkUHJvcG9zYWwoY29udGV4dC5jdXJyZW50TW9kZWwgYXMgUm9sZUR0b0F0dHJpYnV0ZSwgcHJvcG9zYWwsIHJlc3VsdCk7CisJCX0gZWxzZSBpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFJvbGVEdG9SZWZlcmVuY2UpIHsKKwkJCXJldHVybiBpc0R0b1JlZmVyZW5jZVZhbGlkUHJvcG9zYWwoY29udGV4dC5jdXJyZW50TW9kZWwgYXMgUm9sZUR0b1JlZmVyZW5jZSwgcHJvcG9zYWwsIHJlc3VsdCk7CisJCX0gZWxzZSBpZiAoY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKSBpbnN0YW5jZW9mIFJvbGVCbGlwVXNlclRhc2spIHsKKwkJCXJldHVybiBpc0JsaXBVc2VyVGFza1ZhbGlkUHJvcG9zYWwoY29udGV4dC5jdXJyZW50TW9kZWwgYXMgUm9sZUJsaXBVc2VyVGFzaywgcHJvcG9zYWwsIHJlc3VsdCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcmVzdWx0CisJCX0KKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9RdWFsaWZpZWROYW1lKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcykKKwl9CisKKwlvdmVycmlkZSBwdWJsaWMgdm9pZCBjb21wbGV0ZV9BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZChFT2JqZWN0IG1vZGVsLCBSdWxlQ2FsbCBydWxlQ2FsbCwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwKKwkJSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisJCXByb3ZpZGVySGVscGVyLmNvbXBsZXRlX1BhY2thZ2VOYW1lKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IsIHRoaXMpCisJfQorCisJLy8gRW50aXR5CisJZGVmIGJvb2xlYW4gaXNFbnRpdHlBdHRyaWJ1dGVWYWxpZFByb3Bvc2FsKFJvbGVFbnRpdHlBdHRyaWJ1dGUgY3VycmVudEF0dHJpYnV0ZSwgU3RyaW5nIHByb3Bvc2FsLCBib29sZWFuIHJlc3VsdCkgeworCQlpZiAoQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJdmFyIGVPYmogPSBjdXJyZW50QXR0cmlidXRlLmVDb250YWluZXIoKQorCQlpZiAoZU9iaiBpbnN0YW5jZW9mIFJvbGVFbnRpdHkpIHsKKwkJCWZvciAoYXR0cmlidXRlIDogKGVPYmogYXMgUm9sZUVudGl0eSkuZW50aXR5UmVmLmFsbEF0dHJpYnV0ZXMpIHsKKwkJCQlpZiAoYXR0cmlidXRlLm5hbWUuZXF1YWxzKHByb3Bvc2FsKSAmJiAhYXR0cmlidXRlLmlzSWQgJiYgIWF0dHJpYnV0ZS5pc1V1aWQpIHsKKwkJCQkJcmV0dXJuIHRydWUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlCisJfQorCisJZGVmIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VWYWxpZFByb3Bvc2FsKEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgY3VycmVudFJlZmVyZW5jZSwgU3RyaW5nIHByb3Bvc2FsLCBib29sZWFuIHJlc3VsdCkgeworCQlpZiAoQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJdmFyIGVPYmogPSBjdXJyZW50UmVmZXJlbmNlLmVDb250YWluZXIoKQorCQlpZiAoZU9iaiBpbnN0YW5jZW9mIFJvbGVFbnRpdHkpIHsKKwkJCWZvciAocmVmZXJlbmNlIDogKGVPYmogYXMgUm9sZUVudGl0eSkuZW50aXR5UmVmLmFsbFJlZmVyZW5jZXMpIHsKKwkJCQlpZiAocmVmZXJlbmNlLm5hbWUuZXF1YWxzKHByb3Bvc2FsKSkgeworCQkJCQlyZXR1cm4gdHJ1ZQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2UKKwl9CisJCisJLy8gQmVhbgorCWRlZiBib29sZWFuIGlzQmVhbkF0dHJpYnV0ZVZhbGlkUHJvcG9zYWwoUm9sZUJlYW5BdHRyaWJ1dGUgY3VycmVudEF0dHJpYnV0ZSwgU3RyaW5nIHByb3Bvc2FsLCBib29sZWFuIHJlc3VsdCkgeworCQlpZiAoQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJdmFyIGVPYmogPSBjdXJyZW50QXR0cmlidXRlLmVDb250YWluZXIoKQorCQlpZiAoZU9iaiBpbnN0YW5jZW9mIFJvbGVCZWFuKSB7CisJCQlmb3IgKGF0dHJpYnV0ZSA6IChlT2JqIGFzIFJvbGVCZWFuKS5iZWFuUmVmLmFsbEF0dHJpYnV0ZXMpIHsKKwkJCQlpZiAoYXR0cmlidXRlLm5hbWUuZXF1YWxzKHByb3Bvc2FsKSAmJiAhYXR0cmlidXRlLmlzSWQgJiYgIWF0dHJpYnV0ZS5pc1V1aWQpIHsKKwkJCQkJcmV0dXJuIHRydWUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlCisJfQorCisJZGVmIGJvb2xlYW4gaXNCZWFuUmVmZXJlbmNlVmFsaWRQcm9wb3NhbChSb2xlQmVhblJlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlLCBTdHJpbmcgcHJvcG9zYWwsIGJvb2xlYW4gcmVzdWx0KSB7CisJCWlmIChBdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMuaXNQcm9wZXJ0eUVudW0ocHJvcG9zYWwpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQl2YXIgZU9iaiA9IGN1cnJlbnRSZWZlcmVuY2UuZUNvbnRhaW5lcigpCisJCWlmIChlT2JqIGluc3RhbmNlb2YgUm9sZUJlYW4pIHsKKwkJCWZvciAocmVmZXJlbmNlIDogKGVPYmogYXMgUm9sZUJlYW4pLmJlYW5SZWYuYWxsUmVmZXJlbmNlcykgeworCQkJCWlmIChyZWZlcmVuY2UubmFtZS5lcXVhbHMocHJvcG9zYWwpKSB7CisJCQkJCXJldHVybiB0cnVlCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZQorCX0KKwkKKwkvLyBEdG8KKwlkZWYgYm9vbGVhbiBpc0R0b0F0dHJpYnV0ZVZhbGlkUHJvcG9zYWwoUm9sZUR0b0F0dHJpYnV0ZSBjdXJyZW50QXR0cmlidXRlLCBTdHJpbmcgcHJvcG9zYWwsIGJvb2xlYW4gcmVzdWx0KSB7CisJCWlmIChBdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMuaXNQcm9wZXJ0eUVudW0ocHJvcG9zYWwpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQl2YXIgZU9iaiA9IGN1cnJlbnRBdHRyaWJ1dGUuZUNvbnRhaW5lcigpCisJCWlmIChlT2JqIGluc3RhbmNlb2YgUm9sZUR0bykgeworCQkJZm9yIChhdHRyaWJ1dGUgOiAoZU9iaiBhcyBSb2xlRHRvKS5kdG9SZWYuYXR0cmlidXRlcykgeworCQkJCWlmIChhdHRyaWJ1dGUubmFtZS5lcXVhbHMocHJvcG9zYWwpICYmICFhdHRyaWJ1dGUuaXNJZCAmJiAhYXR0cmlidXRlLmlzVXVpZCkgeworCQkJCQlyZXR1cm4gdHJ1ZQorCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gZmFsc2UKKwl9CisKKwlkZWYgYm9vbGVhbiBpc0R0b1JlZmVyZW5jZVZhbGlkUHJvcG9zYWwoUm9sZUR0b1JlZmVyZW5jZSBjdXJyZW50UmVmZXJlbmNlLCBTdHJpbmcgcHJvcG9zYWwsIGJvb2xlYW4gcmVzdWx0KSB7CisJCWlmIChBdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMuaXNQcm9wZXJ0eUVudW0ocHJvcG9zYWwpKSB7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQl2YXIgZU9iaiA9IGN1cnJlbnRSZWZlcmVuY2UuZUNvbnRhaW5lcigpCisJCWlmIChlT2JqIGluc3RhbmNlb2YgUm9sZUR0bykgeworCQkJZm9yIChyZWZlcmVuY2UgOiAoZU9iaiBhcyBSb2xlRHRvKS5kdG9SZWYucmVmZXJlbmNlcykgeworCQkJCWlmIChyZWZlcmVuY2UubmFtZS5lcXVhbHMocHJvcG9zYWwpKSB7CisJCQkJCXJldHVybiB0cnVlCisJCQkJfQorCQkJfQorCQl9CisJCXJldHVybiBmYWxzZQorCX0KKworCWRlZiBib29sZWFuIGlzQmxpcFVzZXJUYXNrVmFsaWRQcm9wb3NhbChSb2xlQmxpcFVzZXJUYXNrIGN1cnJlbnRVc2VyVGFzaywgU3RyaW5nIHByb3Bvc2FsLCBib29sZWFuIHJlc3VsdCkgeworCQlpZiAoQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzVXNlclRhc2tFbnVtKHByb3Bvc2FsKSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJdmFyIGVPYmogPSBjdXJyZW50VXNlclRhc2suZUNvbnRhaW5lcigpCisJCWlmIChlT2JqIGluc3RhbmNlb2YgUm9sZUJsaXBQcm9jZXNzKSB7CisJCQlmb3IgKGl0ZW0gOiAoZU9iaiBhcyBSb2xlQmxpcFByb2Nlc3MpLnByb2Nlc3MuaXRlbXMpIHsKKwkJCQlpZgkoaXRlbS5uYW1lLmVxdWFscyhwcm9wb3NhbCkpIHsKKwkJCQkJcmV0dXJuIHRydWUKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIGZhbHNlCisJfQorCQorCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWxlZ2F0ZXMgdG8gVGVybWluYWxzUHJvcG9zYWxQcm92aWRlciAtLS0tLS0tLS0tLS0tLS0tLQorCQorCW92ZXJyaWRlIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lEKEVPYmplY3QgbW9kZWwsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LAorCQlJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKwkJcHJvdmlkZXIuY29tcGxldGVfSUQobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvcikKKwl9CisKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2xhYmVsaW5nL0F1dGhvcml6YXRpb25EU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOTlmN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmxhYmVsaW5nCisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklFT2JqZWN0RGVzY3JpcHRpb24KKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworY2xhc3MgQXV0aG9yaXphdGlvbkRTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnVpLmxhYmVsaW5nLlhiYXNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyIHsKKwkKKy8vCW92ZXJyaWRlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKKy8vCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRPRE86IGF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViIikKKy8vCX0KKworCS8vIExhYmVscyBhbmQgaWNvbnMgY2FuIGJlIGNvbXB1dGVkIGxpa2UgdGhpczoKKwkKKy8vCW92ZXJyaWRlIHRleHQoSUVPYmplY3REZXNjcmlwdGlvbiBlbGUpIHsKKy8vCQllbGUubmFtZS50b1N0cmluZworLy8JfQorLy8JIAorLy8Jb3ZlcnJpZGUgaW1hZ2UoSUVPYmplY3REZXNjcmlwdGlvbiBlbGUpIHsKKy8vCQllbGUuRUNsYXNzLm5hbWUgKyAnLmdpZicKKy8vCX0JIAorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvbGFiZWxpbmcvQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMTGFiZWxQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGY4MmJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvbGFiZWxpbmcvQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmxhYmVsaW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3QKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWRpdC51aS5wcm92aWRlci5BZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGUKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5QXR0cmlidXRlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmxhYmVsaW5nLkJhc2ljRFNMTGFiZWxQcm92aWRlcgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcworCisvKioKKyAqIFByb3ZpZGVzIGxhYmVscyBmb3IgYSBFT2JqZWN0cy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworY2xhc3MgQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBCYXNpY0RTTExhYmVsUHJvdmlkZXIgeworCisJQEluamVjdAorCW5ldyhBZGFwdGVyRmFjdG9yeUxhYmVsUHJvdmlkZXIgZGVsZWdhdGUpIHsKKwkJc3VwZXIoZGVsZWdhdGUpOworCX0KKwkKKwkvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisJLyoqCQkJUHJvdmlkZXMgb3V0bGluZSB0ZXh0IGZvciBBdXRob3JpemF0aW9uLURTTC4KKwkgKgorCSAqCQkJVXNlcyBjb21tb24gKGRlZmF1bHQpIHRleHQgZm9yIHBhY2thZ2UgYW5kIGZvciBpbXBvcnQgZWxlbWVudC4KKwkgKgorCSAqCUBzZWUJQmFzaWNEU0xMYWJlbFByb3ZpZGVyLnRleHQoT2JqZWN0KQorCSAqIAorCSAqCUBwYXJhbQlvCUN1cnJlbnQgb3V0bGluZSBlbGVtZW50CisJICoKKwkgKglAcmV0dXJuCVN0cmluZyBpbnN0YW5jZS4KKwkgKgorCSAqCUBzaW5jZQlARCAxNTA5MjUsIGd1CisJICoJQGRhdGUJQEQgeXltbWRkLCBuYW1lCisJICovIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkgb3ZlcnJpZGUgdGV4dCAoIE9iamVjdCBvICkgeworCQlzd2l0Y2ggKG8pIHsKKwkJCVJvbGUJCQkJCToJZ2VuZXJhdGVUZXh0KCBvLCAncm9sZScgICAgICAgICAgICAgICAgICAsIChvIGFzIFJvbGUpLm5hbWUgKQorCQkJUm9sZUVudGl0eQkJCQk6CWdlbmVyYXRlVGV4dCggbywgJ3JvbGUgZW50aXR5JyAgICAgICAgICAgKQorCQkJUm9sZUJsaXBQcm9jZXNzCQkJOglnZW5lcmF0ZVRleHQoIG8sICdyb2xlIHByb2Nlc3MnICAgICAgICAgICkKKwkJCVJvbGVCbGlwVXNlclRhc2sJCToJZ2VuZXJhdGVUZXh0KCBvLCAncm9sZSB1c2VyIHRhc2snICAgICAgICAgKQorCQkJUm9sZUVudGl0eUF0dHJpYnV0ZQkJOglnZW5lcmF0ZVRleHQoIG8sICdyb2xlIGVudGl0eSBwcm9wZXJ0eScgKQorCQkJUm9sZUVudGl0eVJlZmVyZW5jZQkJOglnZW5lcmF0ZVRleHQoIG8sICdyb2xlIGVudGl0eSByZWZlcmVuY2UnICkKKwkJCWRlZmF1bHQJCQkJCToJc3VwZXIudGV4dCggbyApCisJCX0KKwl9CisKKy8vCisvLwlkZWYgaW1hZ2UoR3JlZXRpbmcgZWxlKSB7CisvLwkJJ0dyZWV0aW5nLmdpZicKKy8vCX0KKworCS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwkvKioJCQlQcm92aWRlcyBvdXRsaW5lIGltYWdlcyBmb3IgQXV0aG9yaXphdGlvbi1EU0wuCisJICoKKwkgKgkJCVVzZXMgY29tbW9uIChkZWZhdWx0KSBpbWFnZSBmb3IgcGFja2FnZSBhbmQgZm9yIGltcG9ydCBlbGVtZW50LgorCSAqCisJICoJQHNlZQlCYXNpY0RTTExhYmVsUHJvdmlkZXIuaW1hZ2UoT2JqZWN0KQorCSAqIAorCSAqCUBwYXJhbQlvCUN1cnJlbnQgb3V0bGluZSBlbGVtZW50CisJICoKKwkgKglAcmV0dXJuCUltYWdlIGluc3RhbmNlIGlmIHJlcXVlc3RlZCBpbWFnZSBmaWxlIHdhcyBmb3VuZCwgcmV0dXJuIHZhbHVlIG9mIG92ZXJyaWRkZW4gc3VwZXJjbGFzcworCSAqCQkJbWV0aG9kIG90aGVyd2lzZS4KKwkgKgorCSAqCUBzaW5jZQlARCAxNTA5MjUsIGd1CisJICoJQGRhdGUJQEQgeXltbWRkLCBuYW1lCisJICovIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKwlvdmVycmlkZSBpbWFnZSAoIE9iamVjdCBvICkgeworCQlzd2l0Y2ggKG8pIHsKKwkJCUF1dGhvcml6YXRpb25Nb2RlbAkJOglnZXRJbnRlcm5hbEltYWdlKCAnbW9kZWwucG5nJywgY2xhc3MpCisJCQlSb2xlCQkJCQk6CWdldEludGVybmFsSW1hZ2UoICdkc2xfcm9sZS5wbmcnLCBjbGFzcykKKwkJCVJvbGVFbnRpdHkJCQkJOglnZXRJbnRlcm5hbEltYWdlKCAncm9sZV9lbnRpdHkucG5nJywgY2xhc3MpCisJCQlSb2xlQmxpcFByb2Nlc3MJCQk6CWdldEludGVybmFsSW1hZ2UoICdkc2xfYmxpcC5wbmcnLCBjbGFzcykKKwkJCVJvbGVFbnRpdHlBdHRyaWJ1dGUJCToJZ2V0SW50ZXJuYWxJbWFnZSggJ3JvbGVfZW50aXR5X2F0dHJpYnV0ZV9hdXRob3JpemF0aW9uLnBuZycsIGNsYXNzKQorCQkJUm9sZUVudGl0eVJlZmVyZW5jZQkJOglnZXRJbnRlcm5hbEltYWdlKCAncm9sZV9lbnRpdHlfcmVmZXJlbmNlX2F1dGhvcml6YXRpb24ucG5nJywgY2xhc3MpCisJCQlkZWZhdWx0CQkJCQk6CXN1cGVyLmltYWdlKCBvICkKKwkJfQorCX0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvb3V0bGluZS9BdXRob3JpemF0aW9uRFNMT3V0bGluZVRyZWVQcm92aWRlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL291dGxpbmUvQXV0aG9yaXphdGlvbkRTTE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg2YjhmOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL291dGxpbmUvQXV0aG9yaXphdGlvbkRTTE91dGxpbmVUcmVlUHJvdmlkZXIueHRlbmQKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkub3V0bGluZQorCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKgorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI291dGxpbmUKKyAqLworY2xhc3MgQXV0aG9yaXphdGlvbkRTTE91dGxpbmVUcmVlUHJvdmlkZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyIHsKKwkKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL3F1aWNrZml4L0F1dGhvcml6YXRpb25EU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvcXVpY2tmaXgvQXV0aG9yaXphdGlvbkRTTFF1aWNrZml4UHJvdmlkZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3ZDVmNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL3F1aWNrZml4L0F1dGhvcml6YXRpb25EU0xRdWlja2ZpeFByb3ZpZGVyLnh0ZW5kCkBAIC0wLDAgKzEsNDAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLnF1aWNrZml4CisKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5GaXgKKy8vaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5xdWlja2ZpeC5Jc3N1ZVJlc29sdXRpb25BY2NlcHRvcgorLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5Jc3N1ZQorCisvKioKKyAqIEN1c3RvbSBxdWlja2ZpeGVzLgorICoKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNxdWlja2ZpeGVzCisgKi8KK2NsYXNzIEF1dGhvcml6YXRpb25EU0xRdWlja2ZpeFByb3ZpZGVyIGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkucXVpY2tmaXguWGJhc2VXaXRoQW5ub3RhdGlvbnNRdWlja2ZpeFByb3ZpZGVyIHsKKworLy8JQEZpeChNeURzbFZhbGlkYXRvcjo6SU5WQUxJRF9OQU1FKQorLy8JZGVmIGNhcGl0YWxpemVOYW1lKElzc3VlIGlzc3VlLCBJc3N1ZVJlc29sdXRpb25BY2NlcHRvciBhY2NlcHRvcikgeworLy8JCWFjY2VwdG9yLmFjY2VwdChpc3N1ZSwgJ0NhcGl0YWxpemUgbmFtZScsICdDYXBpdGFsaXplIHRoZSBuYW1lLicsICd1cGNhc2UucG5nJykgWworLy8JCQljb250ZXh0IHwKKy8vCQkJdmFsIHh0ZXh0RG9jdW1lbnQgPSBjb250ZXh0Lnh0ZXh0RG9jdW1lbnQKKy8vCQkJdmFsIGZpcnN0TGV0dGVyID0geHRleHREb2N1bWVudC5nZXQoaXNzdWUub2Zmc2V0LCAxKQorLy8JCQl4dGV4dERvY3VtZW50LnJlcGxhY2UoaXNzdWUub2Zmc2V0LCAxLCBmaXJzdExldHRlci50b1VwcGVyQ2FzZSkKKy8vCQldCisvLwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L0F1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9jb250ZW50YXNzaXN0L0F1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmYThhNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2NvbnRlbnRhc3Npc3QvQXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLmNvbnRlbnRhc3Npc3Q7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmR0by5MRHRvOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmR0by5MRHRvQWJzdHJhY3RBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG9BYnN0cmFjdFJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEJlYW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxCZWFuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MQmVhblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEVudGl0eVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5QXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5UmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5jb21tb24uQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS5jb250ZW50YXNzaXN0LkFic3RyYWN0QXV0aG9yaXphdGlvbkRTTFByb3Bvc2FsUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy51aS5jb250ZW50YXNzaXN0LkJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcEl0ZW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuS2V5d29yZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5SdWxlQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udWkuY29udGVudGFzc2lzdC5UZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RDb250ZXh0OworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnVpLmVkaXRvci5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvcjsKKworLyoqCisgKiBzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjY29udGVudEFzc2lzdCBvbiBob3cgdG8gY3VzdG9taXplIGNvbnRlbnQgYXNzaXN0YW50CisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xQcm9wb3NhbFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMUHJvcG9zYWxQcm92aWRlciB7CisgIEBJbmplY3QKKyAgcHJpdmF0ZSBUZXJtaW5hbHNQcm9wb3NhbFByb3ZpZGVyIHByb3ZpZGVyOworICAKKyAgQEluamVjdAorICBwcml2YXRlIEJhc2ljRFNMUHJvcG9zYWxQcm92aWRlckhlbHBlciBwcm92aWRlckhlbHBlcjsKKyAgCisgIC8qKgorICAgKiBUaGlzIG92ZXJyaWRlIHdpbGwgZW5hYmxlIDEgbGVuZ3RoIG5vbiBsZXR0ZXIgY2hhcmFjdGVycyBhcyBrZXl3b3JkLgorICAgKi8KKyAgcHJvdGVjdGVkIGJvb2xlYW4gaXNLZXl3b3JkV29ydGh5VG9Qcm9wb3NlKGZpbmFsIEtleXdvcmQga2V5d29yZCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIAorICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkUHJvcG9zYWwoZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgYm9vbGVhbiByZXN1bHQgPSBzdXBlci5pc1ZhbGlkUHJvcG9zYWwocHJvcG9zYWwsIHByZWZpeCwgY29udGV4dCk7CisgICAgRU9iamVjdCBfY3VycmVudE1vZGVsID0gY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKTsKKyAgICBpZiAoKF9jdXJyZW50TW9kZWwgaW5zdGFuY2VvZiBSb2xlRW50aXR5QXR0cmlidXRlKSkgeworICAgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzEgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgcmV0dXJuIHRoaXMuaXNFbnRpdHlBdHRyaWJ1dGVWYWxpZFByb3Bvc2FsKCgoUm9sZUVudGl0eUF0dHJpYnV0ZSkgX2N1cnJlbnRNb2RlbF8xKSwgcHJvcG9zYWwsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEVPYmplY3QgX2N1cnJlbnRNb2RlbF8yID0gY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKTsKKyAgICAgIGlmICgoX2N1cnJlbnRNb2RlbF8yIGluc3RhbmNlb2YgUm9sZUVudGl0eVJlZmVyZW5jZSkpIHsKKyAgICAgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzMgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICByZXR1cm4gdGhpcy5pc0VudGl0eVJlZmVyZW5jZVZhbGlkUHJvcG9zYWwoKChSb2xlRW50aXR5UmVmZXJlbmNlKSBfY3VycmVudE1vZGVsXzMpLCBwcm9wb3NhbCwgcmVzdWx0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEVPYmplY3QgX2N1cnJlbnRNb2RlbF80ID0gY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKTsKKyAgICAgICAgaWYgKChfY3VycmVudE1vZGVsXzQgaW5zdGFuY2VvZiBSb2xlQmVhbkF0dHJpYnV0ZSkpIHsKKyAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfNSA9IGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisgICAgICAgICAgcmV0dXJuIHRoaXMuaXNCZWFuQXR0cmlidXRlVmFsaWRQcm9wb3NhbCgoKFJvbGVCZWFuQXR0cmlidXRlKSBfY3VycmVudE1vZGVsXzUpLCBwcm9wb3NhbCwgcmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfNiA9IGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisgICAgICAgICAgaWYgKChfY3VycmVudE1vZGVsXzYgaW5zdGFuY2VvZiBSb2xlRW50aXR5UmVmZXJlbmNlKSkgeworICAgICAgICAgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzcgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNCZWFuUmVmZXJlbmNlVmFsaWRQcm9wb3NhbCgoKFJvbGVCZWFuUmVmZXJlbmNlKSBfY3VycmVudE1vZGVsXzcpLCBwcm9wb3NhbCwgcmVzdWx0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzggPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICAgICAgaWYgKChfY3VycmVudE1vZGVsXzggaW5zdGFuY2VvZiBSb2xlRHRvQXR0cmlidXRlKSkgeworICAgICAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfOSA9IGNvbnRleHQuZ2V0Q3VycmVudE1vZGVsKCk7CisgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRHRvQXR0cmlidXRlVmFsaWRQcm9wb3NhbCgoKFJvbGVEdG9BdHRyaWJ1dGUpIF9jdXJyZW50TW9kZWxfOSksIHByb3Bvc2FsLCByZXN1bHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgRU9iamVjdCBfY3VycmVudE1vZGVsXzEwID0gY29udGV4dC5nZXRDdXJyZW50TW9kZWwoKTsKKyAgICAgICAgICAgICAgaWYgKChfY3VycmVudE1vZGVsXzEwIGluc3RhbmNlb2YgUm9sZUR0b1JlZmVyZW5jZSkpIHsKKyAgICAgICAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfMTEgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRHRvUmVmZXJlbmNlVmFsaWRQcm9wb3NhbCgoKFJvbGVEdG9SZWZlcmVuY2UpIF9jdXJyZW50TW9kZWxfMTEpLCBwcm9wb3NhbCwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfMTIgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICAgICAgICAgIGlmICgoX2N1cnJlbnRNb2RlbF8xMiBpbnN0YW5jZW9mIFJvbGVCbGlwVXNlclRhc2spKSB7CisgICAgICAgICAgICAgICAgICBFT2JqZWN0IF9jdXJyZW50TW9kZWxfMTMgPSBjb250ZXh0LmdldEN1cnJlbnRNb2RlbCgpOworICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNCbGlwVXNlclRhc2tWYWxpZFByb3Bvc2FsKCgoUm9sZUJsaXBVc2VyVGFzaykgX2N1cnJlbnRNb2RlbF8xMyksIHByb3Bvc2FsLCByZXN1bHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfUXVhbGlmaWVkTmFtZShmaW5hbCBFT2JqZWN0IG1vZGVsLCBmaW5hbCBSdWxlQ2FsbCBydWxlQ2FsbCwgZmluYWwgQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCwgZmluYWwgSUNvbXBsZXRpb25Qcm9wb3NhbEFjY2VwdG9yIGFjY2VwdG9yKSB7CisgICAgdGhpcy5wcm92aWRlckhlbHBlci5jb21wbGV0ZV9QYWNrYWdlTmFtZShtb2RlbCwgcnVsZUNhbGwsIGNvbnRleHQsIGFjY2VwdG9yLCB0aGlzKTsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgY29tcGxldGVfQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgUnVsZUNhbGwgcnVsZUNhbGwsIGZpbmFsIENvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxBY2NlcHRvciBhY2NlcHRvcikgeworICAgIHRoaXMucHJvdmlkZXJIZWxwZXIuY29tcGxldGVfUGFja2FnZU5hbWUobW9kZWwsIHJ1bGVDYWxsLCBjb250ZXh0LCBhY2NlcHRvciwgdGhpcyk7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzRW50aXR5QXR0cmlidXRlVmFsaWRQcm9wb3NhbChmaW5hbCBSb2xlRW50aXR5QXR0cmlidXRlIGN1cnJlbnRBdHRyaWJ1dGUsIGZpbmFsIFN0cmluZyBwcm9wb3NhbCwgZmluYWwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICBib29sZWFuIF9pc1Byb3BlcnR5RW51bSA9IEF1dGhvcml6YXRpb25EU0xMaXRlcmFscy5pc1Byb3BlcnR5RW51bShwcm9wb3NhbCk7CisgICAgaWYgKF9pc1Byb3BlcnR5RW51bSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEVPYmplY3QgZU9iaiA9IGN1cnJlbnRBdHRyaWJ1dGUuZUNvbnRhaW5lcigpOworICAgIGlmICgoZU9iaiBpbnN0YW5jZW9mIFJvbGVFbnRpdHkpKSB7CisgICAgICBMRW50aXR5IF9lbnRpdHlSZWYgPSAoKFJvbGVFbnRpdHkpIGVPYmopLmdldEVudGl0eVJlZigpOworICAgICAgTGlzdDxMRW50aXR5QXR0cmlidXRlPiBfYWxsQXR0cmlidXRlcyA9IF9lbnRpdHlSZWYuZ2V0QWxsQXR0cmlidXRlcygpOworICAgICAgZm9yIChmaW5hbCBMRW50aXR5QXR0cmlidXRlIGF0dHJpYnV0ZSA6IF9hbGxBdHRyaWJ1dGVzKSB7CisgICAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIF9hbmRfMSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgX25hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbmFtZS5lcXVhbHMocHJvcG9zYWwpOworICAgICAgICBpZiAoIV9lcXVhbHMpIHsKKyAgICAgICAgICBfYW5kXzEgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sZWFuIF9pc0lkID0gYXR0cmlidXRlLmlzSWQoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3QgPSAoIV9pc0lkKTsKKyAgICAgICAgICBfYW5kXzEgPSBfbm90OworICAgICAgICB9CisgICAgICAgIGlmICghX2FuZF8xKSB7CisgICAgICAgICAgX2FuZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJvb2xlYW4gX2lzVXVpZCA9IGF0dHJpYnV0ZS5pc1V1aWQoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RfMSA9ICghX2lzVXVpZCk7CisgICAgICAgICAgX2FuZCA9IF9ub3RfMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX2FuZCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNFbnRpdHlSZWZlcmVuY2VWYWxpZFByb3Bvc2FsKGZpbmFsIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgY3VycmVudFJlZmVyZW5jZSwgZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBib29sZWFuIHJlc3VsdCkgeworICAgIGJvb2xlYW4gX2lzUHJvcGVydHlFbnVtID0gQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKTsKKyAgICBpZiAoX2lzUHJvcGVydHlFbnVtKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBlT2JqID0gY3VycmVudFJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUVudGl0eSkpIHsKKyAgICAgIExFbnRpdHkgX2VudGl0eVJlZiA9ICgoUm9sZUVudGl0eSkgZU9iaikuZ2V0RW50aXR5UmVmKCk7CisgICAgICBMaXN0PExFbnRpdHlSZWZlcmVuY2U+IF9hbGxSZWZlcmVuY2VzID0gX2VudGl0eVJlZi5nZXRBbGxSZWZlcmVuY2VzKCk7CisgICAgICBmb3IgKGZpbmFsIExFbnRpdHlSZWZlcmVuY2UgcmVmZXJlbmNlIDogX2FsbFJlZmVyZW5jZXMpIHsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gcmVmZXJlbmNlLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX25hbWUuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzQmVhbkF0dHJpYnV0ZVZhbGlkUHJvcG9zYWwoZmluYWwgUm9sZUJlYW5BdHRyaWJ1dGUgY3VycmVudEF0dHJpYnV0ZSwgZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBib29sZWFuIHJlc3VsdCkgeworICAgIGJvb2xlYW4gX2lzUHJvcGVydHlFbnVtID0gQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKTsKKyAgICBpZiAoX2lzUHJvcGVydHlFbnVtKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBlT2JqID0gY3VycmVudEF0dHJpYnV0ZS5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUJlYW4pKSB7CisgICAgICBMQmVhbiBfYmVhblJlZiA9ICgoUm9sZUJlYW4pIGVPYmopLmdldEJlYW5SZWYoKTsKKyAgICAgIExpc3Q8TEJlYW5BdHRyaWJ1dGU+IF9hbGxBdHRyaWJ1dGVzID0gX2JlYW5SZWYuZ2V0QWxsQXR0cmlidXRlcygpOworICAgICAgZm9yIChmaW5hbCBMQmVhbkF0dHJpYnV0ZSBhdHRyaWJ1dGUgOiBfYWxsQXR0cmlidXRlcykgeworICAgICAgICBib29sZWFuIF9hbmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBfYW5kXzEgPSBmYWxzZTsKKyAgICAgICAgU3RyaW5nIF9uYW1lID0gYXR0cmlidXRlLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX25hbWUuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgICAgaWYgKCFfZXF1YWxzKSB7CisgICAgICAgICAgX2FuZF8xID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgYm9vbGVhbiBfaXNJZCA9IGF0dHJpYnV0ZS5pc0lkKCk7CisgICAgICAgICAgYm9vbGVhbiBfbm90ID0gKCFfaXNJZCk7CisgICAgICAgICAgX2FuZF8xID0gX25vdDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIV9hbmRfMSkgeworICAgICAgICAgIF9hbmQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sZWFuIF9pc1V1aWQgPSBhdHRyaWJ1dGUuaXNVdWlkKCk7CisgICAgICAgICAgYm9vbGVhbiBfbm90XzEgPSAoIV9pc1V1aWQpOworICAgICAgICAgIF9hbmQgPSBfbm90XzE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9hbmQpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyBib29sZWFuIGlzQmVhblJlZmVyZW5jZVZhbGlkUHJvcG9zYWwoZmluYWwgUm9sZUJlYW5SZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSwgZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBib29sZWFuIHJlc3VsdCkgeworICAgIGJvb2xlYW4gX2lzUHJvcGVydHlFbnVtID0gQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKTsKKyAgICBpZiAoX2lzUHJvcGVydHlFbnVtKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBlT2JqID0gY3VycmVudFJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUJlYW4pKSB7CisgICAgICBMQmVhbiBfYmVhblJlZiA9ICgoUm9sZUJlYW4pIGVPYmopLmdldEJlYW5SZWYoKTsKKyAgICAgIExpc3Q8TEJlYW5SZWZlcmVuY2U+IF9hbGxSZWZlcmVuY2VzID0gX2JlYW5SZWYuZ2V0QWxsUmVmZXJlbmNlcygpOworICAgICAgZm9yIChmaW5hbCBMQmVhblJlZmVyZW5jZSByZWZlcmVuY2UgOiBfYWxsUmVmZXJlbmNlcykgeworICAgICAgICBTdHJpbmcgX25hbWUgPSByZWZlcmVuY2UuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbmFtZS5lcXVhbHMocHJvcG9zYWwpOworICAgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNEdG9BdHRyaWJ1dGVWYWxpZFByb3Bvc2FsKGZpbmFsIFJvbGVEdG9BdHRyaWJ1dGUgY3VycmVudEF0dHJpYnV0ZSwgZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBib29sZWFuIHJlc3VsdCkgeworICAgIGJvb2xlYW4gX2lzUHJvcGVydHlFbnVtID0gQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKTsKKyAgICBpZiAoX2lzUHJvcGVydHlFbnVtKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBlT2JqID0gY3VycmVudEF0dHJpYnV0ZS5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUR0bykpIHsKKyAgICAgIExEdG8gX2R0b1JlZiA9ICgoUm9sZUR0bykgZU9iaikuZ2V0RHRvUmVmKCk7CisgICAgICBMaXN0PExEdG9BYnN0cmFjdEF0dHJpYnV0ZT4gX2F0dHJpYnV0ZXMgPSBfZHRvUmVmLmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgIGZvciAoZmluYWwgTER0b0Fic3RyYWN0QXR0cmlidXRlIGF0dHJpYnV0ZSA6IF9hdHRyaWJ1dGVzKSB7CisgICAgICAgIGJvb2xlYW4gX2FuZCA9IGZhbHNlOworICAgICAgICBib29sZWFuIF9hbmRfMSA9IGZhbHNlOworICAgICAgICBTdHJpbmcgX25hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOworICAgICAgICBib29sZWFuIF9lcXVhbHMgPSBfbmFtZS5lcXVhbHMocHJvcG9zYWwpOworICAgICAgICBpZiAoIV9lcXVhbHMpIHsKKyAgICAgICAgICBfYW5kXzEgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sZWFuIF9pc0lkID0gYXR0cmlidXRlLmlzSWQoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3QgPSAoIV9pc0lkKTsKKyAgICAgICAgICBfYW5kXzEgPSBfbm90OworICAgICAgICB9CisgICAgICAgIGlmICghX2FuZF8xKSB7CisgICAgICAgICAgX2FuZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGJvb2xlYW4gX2lzVXVpZCA9IGF0dHJpYnV0ZS5pc1V1aWQoKTsKKyAgICAgICAgICBib29sZWFuIF9ub3RfMSA9ICghX2lzVXVpZCk7CisgICAgICAgICAgX2FuZCA9IF9ub3RfMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX2FuZCkgeworICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAKKyAgcHVibGljIGJvb2xlYW4gaXNEdG9SZWZlcmVuY2VWYWxpZFByb3Bvc2FsKGZpbmFsIFJvbGVEdG9SZWZlcmVuY2UgY3VycmVudFJlZmVyZW5jZSwgZmluYWwgU3RyaW5nIHByb3Bvc2FsLCBmaW5hbCBib29sZWFuIHJlc3VsdCkgeworICAgIGJvb2xlYW4gX2lzUHJvcGVydHlFbnVtID0gQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmlzUHJvcGVydHlFbnVtKHByb3Bvc2FsKTsKKyAgICBpZiAoX2lzUHJvcGVydHlFbnVtKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgRU9iamVjdCBlT2JqID0gY3VycmVudFJlZmVyZW5jZS5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUR0bykpIHsKKyAgICAgIExEdG8gX2R0b1JlZiA9ICgoUm9sZUR0bykgZU9iaikuZ2V0RHRvUmVmKCk7CisgICAgICBMaXN0PExEdG9BYnN0cmFjdFJlZmVyZW5jZT4gX3JlZmVyZW5jZXMgPSBfZHRvUmVmLmdldFJlZmVyZW5jZXMoKTsKKyAgICAgIGZvciAoZmluYWwgTER0b0Fic3RyYWN0UmVmZXJlbmNlIHJlZmVyZW5jZSA6IF9yZWZlcmVuY2VzKSB7CisgICAgICAgIFN0cmluZyBfbmFtZSA9IHJlZmVyZW5jZS5nZXROYW1lKCk7CisgICAgICAgIGJvb2xlYW4gX2VxdWFscyA9IF9uYW1lLmVxdWFscyhwcm9wb3NhbCk7CisgICAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIAorICBwdWJsaWMgYm9vbGVhbiBpc0JsaXBVc2VyVGFza1ZhbGlkUHJvcG9zYWwoZmluYWwgUm9sZUJsaXBVc2VyVGFzayBjdXJyZW50VXNlclRhc2ssIGZpbmFsIFN0cmluZyBwcm9wb3NhbCwgZmluYWwgYm9vbGVhbiByZXN1bHQpIHsKKyAgICBib29sZWFuIF9pc1VzZXJUYXNrRW51bSA9IEF1dGhvcml6YXRpb25EU0xMaXRlcmFscy5pc1VzZXJUYXNrRW51bShwcm9wb3NhbCk7CisgICAgaWYgKF9pc1VzZXJUYXNrRW51bSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEVPYmplY3QgZU9iaiA9IGN1cnJlbnRVc2VyVGFzay5lQ29udGFpbmVyKCk7CisgICAgaWYgKChlT2JqIGluc3RhbmNlb2YgUm9sZUJsaXBQcm9jZXNzKSkgeworICAgICAgQmxpcCBfcHJvY2VzcyA9ICgoUm9sZUJsaXBQcm9jZXNzKSBlT2JqKS5nZXRQcm9jZXNzKCk7CisgICAgICBFTGlzdDxCbGlwSXRlbT4gX2l0ZW1zID0gX3Byb2Nlc3MuZ2V0SXRlbXMoKTsKKyAgICAgIGZvciAoZmluYWwgQmxpcEl0ZW0gaXRlbSA6IF9pdGVtcykgeworICAgICAgICBTdHJpbmcgX25hbWUgPSBpdGVtLmdldE5hbWUoKTsKKyAgICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX25hbWUuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgICAgaWYgKF9lcXVhbHMpIHsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyB2b2lkIGNvbXBsZXRlX0lEKGZpbmFsIEVPYmplY3QgbW9kZWwsIGZpbmFsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBmaW5hbCBDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsQWNjZXB0b3IgYWNjZXB0b3IpIHsKKyAgICB0aGlzLnByb3ZpZGVyLmNvbXBsZXRlX0lEKG1vZGVsLCBydWxlQ2FsbCwgY29udGV4dCwgYWNjZXB0b3IpOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZkY2ZkMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2xhYmVsaW5nL0F1dGhvcml6YXRpb25EU0xEZXNjcmlwdGlvbkxhYmVsUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkubGFiZWxpbmc7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS51aS5sYWJlbGluZy5YYmFzZURlc2NyaXB0aW9uTGFiZWxQcm92aWRlcjsKKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgSUVPYmplY3REZXNjcmlwdGlvbnMgYW5kIElSZXNvdXJjZURlc2NyaXB0aW9ucy4KKyAqIAorICogc2VlIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvWHRleHQvZG9jdW1lbnRhdGlvbi5odG1sI2xhYmVsUHJvdmlkZXIKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTERlc2NyaXB0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIFhiYXNlRGVzY3JpcHRpb25MYWJlbFByb3ZpZGVyIHsKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL2xhYmVsaW5nL0F1dGhvcml6YXRpb25EU0xMYWJlbFByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMTGFiZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZjJlN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9sYWJlbGluZy9BdXRob3JpemF0aW9uRFNMTGFiZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkubGFiZWxpbmc7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVkaXQudWkucHJvdmlkZXIuQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTW9kZWw7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJhc2ljLnVpLmxhYmVsaW5nLkJhc2ljRFNMTGFiZWxQcm92aWRlcjsKKworLyoqCisgKiBQcm92aWRlcyBsYWJlbHMgZm9yIGEgRU9iamVjdHMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNsYWJlbFByb3ZpZGVyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xMYWJlbFByb3ZpZGVyIGV4dGVuZHMgQmFzaWNEU0xMYWJlbFByb3ZpZGVyIHsKKyAgQEluamVjdAorICBwdWJsaWMgQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXIoZmluYWwgQWRhcHRlckZhY3RvcnlMYWJlbFByb3ZpZGVyIGRlbGVnYXRlKSB7CisgICAgc3VwZXIoZGVsZWdhdGUpOworICB9CisgIAorICBwdWJsaWMgT2JqZWN0IHRleHQoZmluYWwgT2JqZWN0IG8pIHsKKyAgICBPYmplY3QgX3N3aXRjaFJlc3VsdCA9IG51bGw7CisgICAgYm9vbGVhbiBfbWF0Y2hlZCA9IGZhbHNlOworICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUm9sZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBTdHJpbmcgX25hbWUgPSAoKFJvbGUpIG8pLmdldE5hbWUoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyb2xlIiwgX25hbWUpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVFbnRpdHkpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyb2xlIGVudGl0eSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVCbGlwUHJvY2VzcykgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZW5lcmF0ZVRleHQobywgInJvbGUgcHJvY2VzcyIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVCbGlwVXNlclRhc2spIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyb2xlIHVzZXIgdGFzayIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVFbnRpdHlBdHRyaWJ1dGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyb2xlIGVudGl0eSBwcm9wZXJ0eSIpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVFbnRpdHlSZWZlcmVuY2UpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2VuZXJhdGVUZXh0KG8sICJyb2xlIGVudGl0eSByZWZlcmVuY2UiKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgX3N3aXRjaFJlc3VsdCA9IHN1cGVyLnRleHQobyk7CisgICAgfQorICAgIHJldHVybiBfc3dpdGNoUmVzdWx0OworICB9CisgIAorICBwdWJsaWMgT2JqZWN0IGltYWdlKGZpbmFsIE9iamVjdCBvKSB7CisgICAgT2JqZWN0IF9zd2l0Y2hSZXN1bHQgPSBudWxsOworICAgIGJvb2xlYW4gX21hdGNoZWQgPSBmYWxzZTsKKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIEF1dGhvcml6YXRpb25Nb2RlbCkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgibW9kZWwucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSb2xlKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBdXRob3JpemF0aW9uRFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfcm9sZS5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVFbnRpdHkpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEF1dGhvcml6YXRpb25EU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInJvbGVfZW50aXR5LnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUm9sZUJsaXBQcm9jZXNzKSB7CisgICAgICAgIF9tYXRjaGVkPXRydWU7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBdXRob3JpemF0aW9uRFNMTGFiZWxQcm92aWRlcj4gX2NsYXNzID0gdGhpcy5nZXRDbGFzcygpOworICAgICAgICBfc3dpdGNoUmVzdWx0ID0gdGhpcy5nZXRJbnRlcm5hbEltYWdlKCJkc2xfYmxpcC5wbmciLCBfY2xhc3MpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoIV9tYXRjaGVkKSB7CisgICAgICBpZiAobyBpbnN0YW5jZW9mIFJvbGVFbnRpdHlBdHRyaWJ1dGUpIHsKKyAgICAgICAgX21hdGNoZWQ9dHJ1ZTsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEF1dGhvcml6YXRpb25EU0xMYWJlbFByb3ZpZGVyPiBfY2xhc3MgPSB0aGlzLmdldENsYXNzKCk7CisgICAgICAgIF9zd2l0Y2hSZXN1bHQgPSB0aGlzLmdldEludGVybmFsSW1hZ2UoInJvbGVfZW50aXR5X2F0dHJpYnV0ZV9hdXRob3JpemF0aW9uLnBuZyIsIF9jbGFzcyk7CisgICAgICB9CisgICAgfQorICAgIGlmICghX21hdGNoZWQpIHsKKyAgICAgIGlmIChvIGluc3RhbmNlb2YgUm9sZUVudGl0eVJlZmVyZW5jZSkgeworICAgICAgICBfbWF0Y2hlZD10cnVlOworICAgICAgICBDbGFzczw/IGV4dGVuZHMgQXV0aG9yaXphdGlvbkRTTExhYmVsUHJvdmlkZXI+IF9jbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKyAgICAgICAgX3N3aXRjaFJlc3VsdCA9IHRoaXMuZ2V0SW50ZXJuYWxJbWFnZSgicm9sZV9lbnRpdHlfcmVmZXJlbmNlX2F1dGhvcml6YXRpb24ucG5nIiwgX2NsYXNzKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFfbWF0Y2hlZCkgeworICAgICAgX3N3aXRjaFJlc3VsdCA9IHN1cGVyLmltYWdlKG8pOworICAgIH0KKyAgICByZXR1cm4gX3N3aXRjaFJlc3VsdDsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvb3V0bGluZS9BdXRob3JpemF0aW9uRFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvb3V0bGluZS9BdXRob3JpemF0aW9uRFNMT3V0bGluZVRyZWVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMWUyY2UKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWkveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91aS9vdXRsaW5lL0F1dGhvcml6YXRpb25EU0xPdXRsaW5lVHJlZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLm91dGxpbmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5lZGl0b3Iub3V0bGluZS5pbXBsLkRlZmF1bHRPdXRsaW5lVHJlZVByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbWl6YXRpb24gb2YgdGhlIGRlZmF1bHQgb3V0bGluZSBzdHJ1Y3R1cmUuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNvdXRsaW5lCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xPdXRsaW5lVHJlZVByb3ZpZGVyIGV4dGVuZHMgRGVmYXVsdE91dGxpbmVUcmVlUHJvdmlkZXIgeworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdWkvcXVpY2tmaXgvQXV0aG9yaXphdGlvbkRTTFF1aWNrZml4UHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL3F1aWNrZml4L0F1dGhvcml6YXRpb25EU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg5MDgyNgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC51aS94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3VpL3F1aWNrZml4L0F1dGhvcml6YXRpb25EU0xRdWlja2ZpeFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogIENvbnRyaWJ1dG9yczoKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnVpLnF1aWNrZml4OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudWkucXVpY2tmaXguWGJhc2VXaXRoQW5ub3RhdGlvbnNRdWlja2ZpeFByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbSBxdWlja2ZpeGVzLgorICogCisgKiBzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjcXVpY2tmaXhlcworICovCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMUXVpY2tmaXhQcm92aWRlciBleHRlbmRzIFhiYXNlV2l0aEFubm90YXRpb25zUXVpY2tmaXhQcm92aWRlciB7Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvLnByb2plY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhMDE4ZQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC8ucHJvamVjdApAQCAtMCwwICsxLDUxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHByb2plY3REZXNjcmlwdGlvbj4KKwk8bmFtZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w8L25hbWU+CisJPGNvbW1lbnQ+PC9jb21tZW50PgorCTxwcm9qZWN0cz4KKwk8L3Byb2plY3RzPgorCTxidWlsZFNwZWM+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwkJPGJ1aWxkQ29tbWFuZD4KKwkJCTxuYW1lPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dEJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLmVjbGlwc2UuYmFiZWwuZWRpdG9yLnJiZUJ1aWxkZXI8L25hbWU+CisJCQk8YXJndW1lbnRzPgorCQkJPC9hcmd1bWVudHM+CisJCTwvYnVpbGRDb21tYW5kPgorCQk8YnVpbGRDb21tYW5kPgorCQkJPG5hbWU+b3JnLnNvbmFybGludC5lY2xpcHNlLmNvcmUuc29uYXJsaW50QnVpbGRlcjwvbmFtZT4KKwkJCTxhcmd1bWVudHM+CisJCQk8L2FyZ3VtZW50cz4KKwkJPC9idWlsZENvbW1hbmQ+CisJCTxidWlsZENvbW1hbmQ+CisJCQk8bmFtZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJCdWlsZGVyPC9uYW1lPgorCQkJPGFyZ3VtZW50cz4KKwkJCTwvYXJndW1lbnRzPgorCQk8L2J1aWxkQ29tbWFuZD4KKwk8L2J1aWxkU3BlYz4KKwk8bmF0dXJlcz4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5tMmUuY29yZS5tYXZlbjJOYXR1cmU8L25hdHVyZT4KKwkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+CisJCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnh0ZXh0LnVpLnNoYXJlZC54dGV4dE5hdHVyZTwvbmF0dXJlPgorCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmJhYmVsLmVkaXRvci5yYmVOYXR1cmU8L25hdHVyZT4KKwk8L25hdHVyZXM+Cis8L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9MSUNFTlNFLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQyYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTYxIEBACitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC12IDEuMAorCitUSEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIgVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoIkFHUkVFTUVOVCIpLiBBTlkgVVNFLCBSRVBST0RVQ1RJT04KK09SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisxLiBERUZJTklUSU9OUworCisiQ29udHJpYnV0aW9uIiBtZWFuczoKKworYSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCitiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisKK2kpIGNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZAorCitpaSkgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOworCit3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4KK0EgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IgaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZQorYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlCittb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90CitkZXJpdmF0aXZlIHdvcmtzIG9mIHRoZSBQcm9ncmFtLgorCisiQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uCisKKyJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZgoraXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uCisKKyJQcm9ncmFtIiBtZWFucyB0aGUgQ29udHJpYnV0aW9ucyBkaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuCisKKyJSZWNpcGllbnQiIG1lYW5zIGFueW9uZSB3aG8gcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLgorCisyLiBHUkFOVCBPRiBSSUdIVFMKKworYSkgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsCityb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUKK2FuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKK2Zvcm0uCisKK2IpIFN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLAorcm95YWx0eS1mcmVlIHBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUKK0NvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZQorY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQgYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoCithZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QKK2FwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMgbGljZW5zZWQgaGVyZXVuZGVyLgorCitjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzIENvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8KK2Fzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvciB0aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5CityaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQgZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkKK2Jhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAorbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKK3JpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlCitQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCitkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0bworZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KKworMy4gUkVRVUlSRU1FTlRTCisKK0EgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDoKKworYSkgaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZAorCitiKSBpdHMgbGljZW5zZSBhZ3JlZW1lbnQ6CisKK2kpIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nCit3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUgYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCitmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAoraW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoIGFzIGxvc3QgcHJvZml0czsKKworaWlpKSBzdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0IENvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55CitvdGhlciBwYXJ0eTsgYW5kCisKK2l2KSBzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQKK2luIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS4KKworV2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UgY29kZSBmb3JtOgorCithKSBpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQKKworYikgYSBjb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uCisKK0NvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkgY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4KKworRWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKK3N1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLgorCis0LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTgorCitDb21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkgYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycyBhbmQKK3RoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2Ugb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMKK3RoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3IKK290aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yCisoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKQorYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIgbGVnYWwgYWN0aW9ucworYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCitDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUKK29ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbAorcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKK0NvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUKK0NvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heQorIHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS4KKworRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzCit0aGVuIGEgQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcworcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuCitVbmRlciB0aGlzIHNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0bwordGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYSBjb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LAordGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy4KKworNS4gTk8gV0FSUkFOVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUgorQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwKK05PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5IHJlc3BvbnNpYmxlIGZvcgorZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzCitleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2UKK3dpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4KKworNi4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFkKKworRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZCitESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLAorSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQKK0hFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKzcuIEdFTkVSQUwKKworSWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCitlbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoCitwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlIG1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS4KKworSWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQorYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2gKK1JlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaAorbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworQWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgorY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlIHBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2gKK25vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQgZGlzdHJpYnV0aW9uCitvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsIFJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMKKyBncmFudGVkIGJ5IFJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4KKworRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50CitpcyBjb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQgU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaAorbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZiB0aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUKK3JpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbCBBZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkKK2Fzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZQorQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCitkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgordGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZQorbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KK3RoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yCitvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90IGV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4KKworVGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMKK29mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZQorb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL01FVEEtSU5GL01BTklGRVNULk1GCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNWU3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTAsMCArMSw2OSBAQAorTWFuaWZlc3QtVmVyc2lvbjogMS4wCitCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCitCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsCitCdW5kbGUtVmVuZG9yOiBFY2xpcHNlIE9TQlAKK0J1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgorQnVuZGxlLVZlcnNpb246IDAuOS4wLnF1YWxpZmllcgorQnVuZGxlLUNsYXNzUGF0aDogLgorQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsO3NpbmdsZXRvbjo9dHJ1ZQorQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKK1JlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iMi45LjAiLAorIGphdmF4LmFubm90YXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAorIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iMy4xMC4wIiwKKyBvcmcuZWNsaXBzZS54dGV4dDtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSIsCisgb3JnLmVjbGlwc2UueHRleHQueGJhc2U7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmJwbW4yO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvcjtidW5kbGUtdmVyc2lvbj0iWzIuNy4zLDIuOC4wKSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2UuZW1mLmNvZGVnZW4uZWNvcmU7YnVuZGxlLXZlcnNpb249IjIuMTAuMiIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlO2J1bmRsZS12ZXJzaW9uPSIyLjEwLjIiO3Zpc2liaWxpdHk6PXJlZXhwb3J0LAorIG9yZy5lY2xpcHNlLmVtZi5jb21tb24sCisgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzO2J1bmRsZS12ZXJzaW9uPSJbMi43LjMsMi44LjApIjt2aXNpYmlsaXR5Oj1yZWV4cG9ydCwKKyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saWI7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5lY2xpcHNlLnh0ZXh0LnV0aWw7YnVuZGxlLXZlcnNpb249IlsyLjcuMywyLjguMCkiLAorIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMztidW5kbGUtdmVyc2lvbj0iMy4xLjAiLAorIG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO2J1bmRsZS12ZXJzaW9uPSIxLjAuNCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhjb3JlO2J1bmRsZS12ZXJzaW9uPSIxLjIuMSIsCisgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnhjb3JlLmxpYjtidW5kbGUtdmVyc2lvbj0iMS4xLjAiLAorIG9yZy5lY2xpcHNlLmVtZi5td2UudXRpbHM7YnVuZGxlLXZlcnNpb249IjEuMy41IjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuYW50bHIucnVudGltZSwKKyBvcmcub2JqZWN0d2ViLmFzbTtidW5kbGUtdmVyc2lvbj0iMy4zLjEiLAorIGphdmF4LnBlcnNpc3RlbmNlO2J1bmRsZS12ZXJzaW9uPSIyLjEuMCIsCisgb3JnLmVjbGlwc2Uub3NicC5ydW50aW1lLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5hcGk7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLmRzbC5td2U7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSI7dmlzaWJpbGl0eTo9cmVleHBvcnQsCisgb3JnLmVjbGlwc2UuZW1mLm13ZTIubGF1bmNoO2J1bmRsZS12ZXJzaW9uPSIyLjcuMSI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLm9zYnAuZ2l0aW5mbztidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYWRkb25zO2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLnNsZjRqLmFwaTtidW5kbGUtdmVyc2lvbj0iMS43LjIiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nO2J1bmRsZS12ZXJzaW9uPSIyLjYuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wuZHRvLnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMC45LjAsMC4xMC4wKSIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmJ1bmRsZXM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIudHlwZXMubG9hZGVyLmFwaTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzAuOS4wLDAuMTAuMCkiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci54YmFzZS5zZXR1cHM7YnVuZGxlLXZlcnNpb249IlswLjkuMCwwLjEwLjApIgorQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5jb21tb247dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mb3JtYXR0aW5nO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZ2VuZXJhdG9yO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmp2bW1vZGVsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2NvcGluZzt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcmlhbGl6ZXI7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5zZXJ2aWNlczt2ZXJzaW9uPSIwLjkuMCIsCisgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnV0aWw7dmVyc2lvbj0iMC45LjAiLAorIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC52YWxpZGF0aW9uO3ZlcnNpb249IjAuOS4wIgorSW1wb3J0LVBhY2thZ2U6IGphdmF4LnZhbGlkYXRpb24sCisgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cywKKyBvcmcuYXBhY2hlLmxvZzRqLAorIG9yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dC5leHRlbnNpb25zO3ZlcnNpb249IjAuOS4wIiwKKyBvcmcuZWNsaXBzZS5vc2JwLnVpLmFwaS51c2VyYWNjZXNzCitCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQWN0aXZhdG9yCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQuaHRtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9hYm91dC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzA1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQuaHRtbApAQCAtMCwwICsxLDI4IEBACis8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgorICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgorPHRpdGxlPkFib3V0PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5IGxhbmc9IkVOLVVTIj4KKzxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgorIAorPHA+SnVuZSAxLCAyMDE2PC9wPgkKKzxoMz5MaWNlbnNlPC9oMz4KKworPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCitpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCitFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAorYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KK0ZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisKKzxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCitiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5CithcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCitwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKK2luZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50CithbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KKworPC9ib2R5PgorPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9hYm91dC5pbmkgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQuaW5pCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjY3MWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQuaW5pCkBAIC0wLDAgKzEsMTcgQEAKKyMgYWJvdXQuaW5pCisjIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQorIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQorIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcworIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgorCisjIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKK2Fib3V0VGV4dD0lZmVhdHVyZVRleHQKKworIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQorZmVhdHVyZUltYWdlPQorCisjIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAodHJhbnNsYXRlZCkKK2FwcE5hbWU9JWZlYXR1cmVOYW1lCisKKyMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQord2VsY29tZVBhZ2U9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQubWFwcGluZ3MgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYWJvdXQubWFwcGluZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxMWEwYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9hYm91dC5tYXBwaW5ncwpAQCAtMCwwICsxLDYgQEAKKyMgYWJvdXQubWFwcGluZ3MKKyMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMKKyMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKKyMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KKworMD1xdWFsaWZpZXIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9hYm91dC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2Fib3V0LnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFjNjIxMQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9hYm91dC5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoSGVpZGVsYmVyZykKKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyMKKyMgQ29udHJpYnV0b3JzOgorIyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorIworCisjIE5MU19NRVNTQUdFRk9STUFUX1ZBUgorCitmZWF0dXJlTmFtZT1vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wKKworIyMjIyMjIyMjIyMjIyMjIyBibHVyYiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKK2ZlYXR1cmVUZXh0PVwKK0NvcHlyaWdodCAoYykgMjAxMi0yMDE2IC0gTG9ldHogR21iSCZDby5LRyBcblwKK0FsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKK2FyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAord2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCitcblwKK0NvbnRyaWJ1dG9yczpcblwKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb25cbgorIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgYmx1cmIgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYnVpbGQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTE5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACitzb3VyY2UuLiA9IHNyYy8sXAorICAgICAgICAgICBzcmMtZ2VuLyxcCisgICAgICAgICAgIHh0ZW5kLWdlbi8sXAorICAgICAgICAgICBlbWYtZ2VuLworYmluLmluY2x1ZGVzID0gYWJvdXQucHJvcGVydGllcywgIGFib3V0Lm1hcHBpbmdzLCAgYWJvdXQuaW5pLCAgYWJvdXQuaHRtbCwgIG1vZGVsLyxcCisgICAgICAgICAgICAgICBNRVRBLUlORi8sXAorICAgICAgICAgICAgICAgLixcCisgICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKKyAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKKyAgICAgICAgICAgICAgIC5jbGFzc3BhdGgsXAorICAgICAgICAgICAgICAgLnByb2plY3QsXAorICAgICAgICAgICAgICAgLnNldHRpbmdzLyxcCisgICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAorICAgICAgICAgICAgICAgTElDRU5TRS50eHQsXAorICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sCitzcmMuaW5jbHVkZXMgPSBhYm91dC5wcm9wZXJ0aWVzLCAgYWJvdXQubWFwcGluZ3MsICBhYm91dC5pbmksICBhYm91dC5odG1sLCAgbGljZW5zZS5odG1sLFwKKyAgICAgICAgICAgICAgIExJQ0VOU0UudHh0LFwKKyAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbAkJCSAgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uQmFzZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25CYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk3YjNlMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uQmFzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aG9yaXphdGlvbiBCYXNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uQmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0QXV0aG9yaXphdGlvbkJhc2UoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkJhc2UgZXh0ZW5kcyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5OYW1lPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI3NldE5hbWUoU3RyaW5nKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldEF1dGhvcml6YXRpb25CYXNlX05hbWUoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZ2V0TmFtZSgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25CYXNlI2dldE5hbWUgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5hbWU8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKTsKKworfSAvLyBBdXRob3JpemF0aW9uQmFzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmI1NTc3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5GYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkRTTEZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7CisJLyoqCisJICogVGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uRFNMRmFjdG9yeSBlSU5TVEFOQ0UgPSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMRmFjdG9yeUltcGwuaW5pdCgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uTW9kZWwgY3JlYXRlQXV0aG9yaXphdGlvbk1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dGhvcml6YXRpb24gTGF6eSBSZXNvbHZlcjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIGNyZWF0ZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BdXRob3JpemF0aW9uIFBhY2thZ2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCUF1dGhvcml6YXRpb25QYWNrYWdlIGNyZWF0ZUF1dGhvcml6YXRpb25QYWNrYWdlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkF1dGhvcml6YXRpb24gQmFzZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXV0aG9yaXphdGlvbiBCYXNlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uQmFzZSBjcmVhdGVBdXRob3JpemF0aW9uQmFzZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlIGNyZWF0ZVJvbGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBFbGVtZW50PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEVsZW1lbnQ8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVFbGVtZW50IGNyZWF0ZVJvbGVFbGVtZW50KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRW50aXR5PC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEVudGl0eTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUVudGl0eSBjcmVhdGVSb2xlRW50aXR5KCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbjwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBCZWFuPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlQmVhbiBjcmVhdGVSb2xlQmVhbigpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIER0bzwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEdG88L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVEdG8gY3JlYXRlUm9sZUR0bygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEJsaXAgQWxsIFVzZXIgVGFza3M8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmxpcCBBbGwgVXNlciBUYXNrczwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBBbGxVc2VyVGFza3MgY3JlYXRlUm9sZUJsaXBBbGxVc2VyVGFza3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBVc2VyVGFzayBjcmVhdGVSb2xlQmxpcFVzZXJUYXNrKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmxpcCBQcm9jZXNzPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEJsaXAgUHJvY2VzczwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBQcm9jZXNzIGNyZWF0ZVJvbGVCbGlwUHJvY2VzcygpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlRW50aXR5RmVhdHVyZSBjcmVhdGVSb2xlRW50aXR5RmVhdHVyZSgpOworCisJLyoqCisJICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIEVudGl0eSBBdHRyaWJ1dGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRW50aXR5IEF0dHJpYnV0ZTwvZW0+Jy4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUVudGl0eUF0dHJpYnV0ZSBjcmVhdGVSb2xlRW50aXR5QXR0cmlidXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlRW50aXR5UmVmZXJlbmNlIGNyZWF0ZVJvbGVFbnRpdHlSZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBCZWFuIEZlYXR1cmU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlQmVhbkZlYXR1cmUgY3JlYXRlUm9sZUJlYW5GZWF0dXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVCZWFuQXR0cmlidXRlIGNyZWF0ZVJvbGVCZWFuQXR0cmlidXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbiBSZWZlcmVuY2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgQmVhbiBSZWZlcmVuY2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVCZWFuUmVmZXJlbmNlIGNyZWF0ZVJvbGVCZWFuUmVmZXJlbmNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRHRvIEZlYXR1cmU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRHRvIEZlYXR1cmU8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVEdG9GZWF0dXJlIGNyZWF0ZVJvbGVEdG9GZWF0dXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlJvbGUgRHRvIEF0dHJpYnV0ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEdG8gQXR0cmlidXRlPC9lbT4nLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlRHRvQXR0cmlidXRlIGNyZWF0ZVJvbGVEdG9BdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Um9sZSBEdG8gUmVmZXJlbmNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPicuCisJICogQGdlbmVyYXRlZAorCSAqLworCVJvbGVEdG9SZWZlcmVuY2UgY3JlYXRlUm9sZUR0b1JlZmVyZW5jZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uRFNMUGFja2FnZSBnZXRBdXRob3JpemF0aW9uRFNMUGFja2FnZSgpOworCit9IC8vQXV0aG9yaXphdGlvbkRTTEZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMUGFja2FnZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xQYWNrYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3YjY4MAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMjM1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLk9TQlBUeXBlc1BhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIFRoZSA8Yj5QYWNrYWdlPC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgY29udGFpbnMgYWNjZXNzb3JzIGZvciB0aGUgbWV0YSBvYmplY3RzIHRvIHJlcHJlc2VudAorICogPHVsPgorICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorICogICA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggb3BlcmF0aW9uIG9mIGVhY2ggY2xhc3MsPC9saT4KKyAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorICogICA8bGk+YW5kIGVhY2ggZGF0YSB0eXBlPC9saT4KKyAqIDwvdWw+CisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xGYWN0b3J5CisgKiBAbW9kZWwga2luZD0icGFja2FnZSIKKyAqICAgICAgICBhbm5vdGF0aW9uPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0dlbk1vZGVsIGZpbGVFeHRlbnNpb25zPSdhdXRob3JpemF0aW9uJyBtb2RlbE5hbWU9J0F1dGhvcml6YXRpb25EU0wnIHByZWZpeD0nQXV0aG9yaXphdGlvbkRTTCcgY29weXJpZ2h0VGV4dD0nQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSlcclxuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcclxuIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxyXG4gd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcclxuIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXHJcbiBcclxuIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvblxyXG4gXHJcbiBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlXHJcblxyXG4gJyB1cGRhdGVDbGFzc3BhdGg9J2ZhbHNlJyBiYXNlUGFja2FnZT0nb3JnLmVjbGlwc2Uub3NicC54dGV4dCciCisgKiAgICAgICAgYW5ub3RhdGlvbj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSByb290UGFja2FnZT0nYXV0aG9yaXphdGlvbkRTTCciCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7CisJLyoqCisJICogVGhlIHBhY2thZ2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5BTUUgPSAiYXV0aG9yaXphdGlvbmRzbCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgVVJJLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTCI7CisKKwkvKioKKwkgKiBUaGUgcGFja2FnZSBuYW1lc3BhY2UgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlTdHJpbmcgZU5TX1BSRUZJWCA9ICJhdXRob3JpemF0aW9uRFNMIjsKKworCS8qKgorCSAqIFRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHBhY2thZ2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UgZUlOU1RBTkNFID0gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsLmluaXQoKTsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbk1vZGVsSW1wbCA8ZW0+QXV0aG9yaXphdGlvbiBNb2RlbDwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25Nb2RlbEltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRBdXRob3JpemF0aW9uTW9kZWwoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9NT0RFTCA9IDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGNrZzwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fTU9ERUxfX1BDS0cgPSAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGhvcml6YXRpb24gTW9kZWw8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9NT0RFTF9GRUFUVVJFX0NPVU5UID0gMTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fTU9ERUxfT1BFUkFUSU9OX0NPVU5UID0gMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwgPGVtPkF1dGhvcml6YXRpb24gTGF6eSBSZXNvbHZlcjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0QXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcigpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVIgPSAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGhvcml6YXRpb24gTGF6eSBSZXNvbHZlcjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgPSAxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uUGFja2FnZUltcGwgPGVtPkF1dGhvcml6YXRpb24gUGFja2FnZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25QYWNrYWdlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldEF1dGhvcml6YXRpb25QYWNrYWdlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fUEFDS0FHRSA9IDI7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fUEFDS0FHRV9fTkFNRSA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfX05BTUU7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW1wb3J0czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9QQUNLQUdFX19JTVBPUlRTID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fSU1QT1JUUzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9QQUNLQUdFX19ST0xFUyA9IE9TQlBUeXBlc1BhY2thZ2UuTFBBQ0tBR0VfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fUEFDS0FHRV9GRUFUVVJFX0NPVU5UID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRIT1JJWkFUSU9OX1BBQ0tBR0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gT1NCUFR5cGVzUGFja2FnZS5MUEFDS0FHRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IEFVVEhPUklaQVRJT05fUEFDS0FHRV9PUEVSQVRJT05fQ09VTlQgPSBPU0JQVHlwZXNQYWNrYWdlLkxQQUNLQUdFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25CYXNlSW1wbCA8ZW0+QXV0aG9yaXphdGlvbiBCYXNlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkJhc2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0QXV0aG9yaXphdGlvbkJhc2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9CQVNFID0gMzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9CQVNFX19OQU1FID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPkF1dGhvcml6YXRpb24gQmFzZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRIT1JJWkFUSU9OX0JBU0VfRkVBVFVSRV9DT1VOVCA9IEFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUl9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBBVVRIT1JJWkFUSU9OX0JBU0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5BdXRob3JpemF0aW9uIEJhc2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgQVVUSE9SSVpBVElPTl9CQVNFX09QRVJBVElPTl9DT1VOVCA9IEFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUl9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlSW1wbCA8ZW0+Um9sZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFID0gNDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9fTkFNRSA9IEFVVEhPUklaQVRJT05fQkFTRV9fTkFNRTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Sb2xlIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX19ST0xFX0VMRU1FTlRTID0gQVVUSE9SSVpBVElPTl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9GRUFUVVJFX0NPVU5UID0gQVVUSE9SSVpBVElPTl9CQVNFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQVVUSE9SSVpBVElPTl9CQVNFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfT1BFUkFUSU9OX0NPVU5UID0gQVVUSE9SSVpBVElPTl9CQVNFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbGVtZW50SW1wbCA8ZW0+Um9sZSBFbGVtZW50PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVsZW1lbnRJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUVsZW1lbnQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9FTEVNRU5UID0gNTsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIEVsZW1lbnQ8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IEFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Um9sZSBFbGVtZW50PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUltcGwgPGVtPlJvbGUgRW50aXR5PC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJPTEVfRU5USVRZID0gNjsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfX0VOVElUWV9BVVRIT1JJWkVEID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfX0VOVElUWV9GRUFUVVJFUyA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfX0VOVElUWV9SRUYgPSBST0xFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDI7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBFbnRpdHk8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfRkVBVFVSRV9DT1VOVCA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0VOVElUWV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBST0xFX0VMRU1FTlRfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJvbGUgRW50aXR5PC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmVhbkltcGwgPGVtPlJvbGUgQmVhbjwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJPTEVfQkVBTiA9IDc7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBBdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRCA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CZWFuIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fX0JFQU5fRkVBVFVSRVMgPSBST0xFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fX0JFQU5fUkVGID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmVhbjwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fRkVBVFVSRV9DT1VOVCA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMzsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEJlYW48L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvSW1wbCA8ZW0+Um9sZSBEdG88L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVEdG8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE8gPSA4OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR0byBBdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0RUT19fRFRPX0FVVEhPUklaRUQgPSBST0xFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHRvIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0RUT19fRFRPX0ZFQVRVUkVTID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkR0byBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0RUT19fRFRPX1JFRiA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMjsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIER0bzwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0RUT19GRUFUVVJFX0NPVU5UID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRFRPX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IFJPTEVfRUxFTUVOVF9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Um9sZSBEdG88L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fT1BFUkFUSU9OX0NPVU5UID0gUk9MRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwQWxsVXNlclRhc2tzSW1wbCA8ZW0+Um9sZSBCbGlwIEFsbCBVc2VyIFRhc2tzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX0FMTF9VU0VSX1RBU0tTID0gOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX0FMTF9VU0VSX1RBU0tTX19BVVRIT1JJWkVEID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmxpcCBBbGwgVXNlciBUYXNrczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfRkVBVFVSRV9DT1VOVCA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEJsaXAgQWxsIFVzZXIgVGFza3M8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX0FMTF9VU0VSX1RBU0tTX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfRUxFTUVOVF9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmxpcFVzZXJUYXNrSW1wbCA8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwVXNlclRhc2tJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJsaXBVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0JMSVBfVVNFUl9UQVNLID0gMTA7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VXNlciBUYXNrPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1VTRVJfVEFTS19fVVNFUl9UQVNLID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfVVNFUl9UQVNLX19BVVRIT1JJWkVEID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2s8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1VTRVJfVEFTS19GRUFUVVJFX0NPVU5UID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkxJUF9VU0VSX1RBU0tfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEJsaXAgVXNlciBUYXNrPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkxJUF9VU0VSX1RBU0tfT1BFUkFUSU9OX0NPVU5UID0gUk9MRV9FTEVNRU5UX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwUHJvY2Vzc0ltcGwgPGVtPlJvbGUgQmxpcCBQcm9jZXNzPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBQcm9jZXNzSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCbGlwUHJvY2VzcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0JMSVBfUFJPQ0VTUyA9IDExOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTUyA9IFJPTEVfRUxFTUVOVF9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFsbCBVc2VyIFRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1BST0NFU1NfX0FMTF9VU0VSX1RBU0tTID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlVzZXIgVGFza3M8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkxJUF9QUk9DRVNTX19VU0VSX1RBU0tTID0gUk9MRV9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgKyAzOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmxpcCBQcm9jZXNzPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkxJUF9QUk9DRVNTX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0VMRU1FTlRfRkVBVFVSRV9DT1VOVCArIDQ7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1BST0NFU1NfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTEVNRU5UX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEJsaXAgUHJvY2VzczwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JMSVBfUFJPQ0VTU19PUEVSQVRJT05fQ09VTlQgPSBST0xFX0VMRU1FTlRfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUZlYXR1cmVJbXBsIDxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUZlYXR1cmVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUVudGl0eUZlYXR1cmUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfRkVBVFVSRSA9IDEyOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBBdHRyaSBDb2w8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0VOVElUWV9GRUFUVVJFX19FTlRJVFlfQVRUUklfQ09MID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgRW50aXR5IEZlYXR1cmU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfRkVBVFVSRV9GRUFUVVJFX0NPVU5UID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0ZFQVRVUkVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0ZFQVRVUkVfT1BFUkFUSU9OX0NPVU5UID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlBdHRyaWJ1dGVJbXBsIDxlbT5Sb2xlIEVudGl0eSBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5QXR0cmlidXRlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVFbnRpdHlBdHRyaWJ1dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfQVRUUklCVVRFID0gMTM7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0FUVFJJQlVURV9fRU5USVRZX0FUVFJJX0NPTCA9IFJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0w7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0FUVFJJQlVURV9fRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRCA9IFJPTEVfRU5USVRZX0ZFQVRVUkVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBFbnRpdHkgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gUk9MRV9FTlRJVFlfRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0VOVElUWV9BVFRSSUJVVEVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTlRJVFlfRkVBVFVSRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Um9sZSBFbnRpdHkgQXR0cmlidXRlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX0FUVFJJQlVURV9PUEVSQVRJT05fQ09VTlQgPSBST0xFX0VOVElUWV9GRUFUVVJFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlSZWZlcmVuY2VJbXBsIDxlbT5Sb2xlIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5UmVmZXJlbmNlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVFbnRpdHlSZWZlcmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9FTlRJVFlfUkVGRVJFTkNFID0gMTQ7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZX0FUVFJJX0NPTCA9IFJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0w7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRCA9IFJPTEVfRU5USVRZX0ZFQVRVUkVfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX1JFRkVSRU5DRV9GRUFUVVJFX0NPVU5UID0gUk9MRV9FTlRJVFlfRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMTsKKworCS8qKgorCSAqIFRoZSBvcGVyYXRpb24gaWQgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0VOVElUWV9SRUZFUkVOQ0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9FTlRJVFlfRkVBVFVSRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRU5USVRZX1JFRkVSRU5DRV9PUEVSQVRJT05fQ09VTlQgPSBST0xFX0VOVElUWV9GRUFUVVJFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuRmVhdHVyZUltcGwgPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5GZWF0dXJlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCZWFuRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0JFQU5fRkVBVFVSRSA9IDE1OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gQXR0cmkgQ29sPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0ZFQVRVUkVfX0JFQU5fQVRUUklfQ09MID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkVBTl9GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0ZFQVRVUkVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIEJlYW4gRmVhdHVyZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fRkVBVFVSRV9PUEVSQVRJT05fQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5BdHRyaWJ1dGVJbXBsIDxlbT5Sb2xlIEJlYW4gQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5BdHRyaWJ1dGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJlYW5BdHRyaWJ1dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0FUVFJJQlVURSA9IDE2OworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gQXR0cmkgQ29sPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0FUVFJJQlVURV9fQkVBTl9BVFRSSV9DT0wgPSBST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0w7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCA9IFJPTEVfQkVBTl9GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSAnPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gUk9MRV9CRUFOX0ZFQVRVUkVfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX0FUVFJJQlVURV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBST0xFX0JFQU5fRkVBVFVSRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIG9wZXJhdGlvbnMgb2YgdGhlICc8ZW0+Um9sZSBCZWFuIEF0dHJpYnV0ZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0JFQU5fQVRUUklCVVRFX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfQkVBTl9GRUFUVVJFX09QRVJBVElPTl9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuUmVmZXJlbmNlSW1wbCA8ZW0+Um9sZSBCZWFuIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuUmVmZXJlbmNlSW1wbAorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCZWFuUmVmZXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJPTEVfQkVBTl9SRUZFUkVOQ0UgPSAxNzsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5CZWFuIEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfQ09MID0gUk9MRV9CRUFOX0ZFQVRVUkVfX0JFQU5fQVRUUklfQ09MOworCisJLyoqCisJICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX1JFRkVSRU5DRV9fQkVBTl9BVFRSSV9VTkFVVEhPUklaRUQgPSBST0xFX0JFQU5fRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIEJlYW4gUmVmZXJlbmNlPC9lbT4nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkVBTl9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCA9IFJPTEVfQkVBTl9GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfQkVBTl9SRUZFUkVOQ0VfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUID0gUk9MRV9CRUFOX0ZFQVRVUkVfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJvbGUgQmVhbiBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9CRUFOX1JFRkVSRU5DRV9PUEVSQVRJT05fQ09VTlQgPSBST0xFX0JFQU5fRkVBVFVSRV9PUEVSQVRJT05fQ09VTlQgKyAwOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvRmVhdHVyZUltcGwgPGVtPlJvbGUgRHRvIEZlYXR1cmU8L2VtPn0nIGNsYXNzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvRmVhdHVyZUltcGwKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlRHRvRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0RUT19GRUFUVVJFID0gMTg7CisKKwkvKioKKwkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RHRvIEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRFRPX0ZFQVRVUkVfX0RUT19BVFRSSV9DT0wgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDA7CisKKwkvKioKKwkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlICc8ZW0+Um9sZSBEdG8gRmVhdHVyZTwvZW0+JyBjbGFzcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCWludCBST0xFX0RUT19GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfRkVBVFVSRV9DT1VOVCArIDE7CisKKwkvKioKKwkgKiBUaGUgb3BlcmF0aW9uIGlkIGZvciB0aGUgJzxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+JyBvcGVyYXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fRkVBVFVSRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUOworCisJLyoqCisJICogVGhlIG51bWJlciBvZiBvcGVyYXRpb25zIG9mIHRoZSAnPGVtPlJvbGUgRHRvIEZlYXR1cmU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fRkVBVFVSRV9PUEVSQVRJT05fQ09VTlQgPSBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0F0dHJpYnV0ZUltcGwgPGVtPlJvbGUgRHRvIEF0dHJpYnV0ZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVEdG9BdHRyaWJ1dGVJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUR0b0F0dHJpYnV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0RUT19BVFRSSUJVVEUgPSAxOTsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdG8gQXR0cmkgQ29sPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fQVRUUklCVVRFX19EVE9fQVRUUklfQ09MID0gUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fQVRUUklCVVRFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEID0gUk9MRV9EVE9fRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIER0byBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RUT19GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRFRPX0FUVFJJQlVURV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBST0xFX0RUT19GRUFUVVJFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIER0byBBdHRyaWJ1dGU8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fQVRUUklCVVRFX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfRFRPX0ZFQVRVUkVfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b1JlZmVyZW5jZUltcGwgPGVtPlJvbGUgRHRvIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVEdG9SZWZlcmVuY2VJbXBsCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUR0b1JlZmVyZW5jZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCWludCBST0xFX0RUT19SRUZFUkVOQ0UgPSAyMDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdG8gQXR0cmkgQ29sPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fUkVGRVJFTkNFX19EVE9fQVRUUklfQ09MID0gUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTDsKKworCS8qKgorCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fUkVGRVJFTkNFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEID0gUk9MRV9EVE9fRkVBVFVSRV9GRUFUVVJFX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgJzxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fUkVGRVJFTkNFX0ZFQVRVUkVfQ09VTlQgPSBST0xFX0RUT19GRUFUVVJFX0ZFQVRVUkVfQ09VTlQgKyAxOworCisJLyoqCisJICogVGhlIG9wZXJhdGlvbiBpZCBmb3IgdGhlICc8ZW0+RVJlc29sdmUgUHJveHk8L2VtPicgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJaW50IFJPTEVfRFRPX1JFRkVSRU5DRV9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1QgPSBST0xFX0RUT19GRUFUVVJFX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVDsKKworCS8qKgorCSAqIFRoZSBudW1iZXIgb2Ygb3BlcmF0aW9ucyBvZiB0aGUgJzxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPicgY2xhc3MuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlpbnQgUk9MRV9EVE9fUkVGRVJFTkNFX09QRVJBVElPTl9DT1VOVCA9IFJPTEVfRFRPX0ZFQVRVUkVfT1BFUkFUSU9OX0NPVU5UICsgMDsKKworCS8qKgorCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtIDxlbT5Sb2xlIEVudW08L2VtPn0nIGVudW0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVFbnVtKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IFJPTEVfRU5VTSA9IDIxOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bSA8ZW0+Um9sZSBQcm9wZXJ0eSBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVQcm9wZXJ0eUVudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9QUk9QRVJUWV9FTlVNID0gMjI7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3NFbnVtIDxlbT5Sb2xlIEJsaXAgUHJvY2VzcyBFbnVtPC9lbT59JyBlbnVtLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCbGlwUHJvY2Vzc0VudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1BST0NFU1NfRU5VTSA9IDIzOworCisJLyoqCisJICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW0gPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2sgRW51bTwvZW0+fScgZW51bS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJsaXBVc2VyVGFza0VudW0oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlpbnQgUk9MRV9CTElQX1VTRVJfVEFTS19FTlVNID0gMjQ7CisKKwkvKioKKwkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicgZGF0YSB0eXBlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0SW50ZXJuYWxFT2JqZWN0KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50IElOVEVSTkFMX0VPQkpFQ1QgPSAyNTsKKworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbCA8ZW0+QXV0aG9yaXphdGlvbiBNb2RlbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXV0aG9yaXphdGlvbk1vZGVsKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTW9kZWwjZ2V0UGNrZyA8ZW0+UGNrZzwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPlBja2c8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsI2dldFBja2coKQorCSAqIEBzZWUgI2dldEF1dGhvcml6YXRpb25Nb2RlbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0QXV0aG9yaXphdGlvbk1vZGVsX1Bja2coKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIDxlbT5BdXRob3JpemF0aW9uIExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciNlUmVzb2x2ZVByb3h5KG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QpIDxlbT5FUmVzb2x2ZSBQcm94eTwvZW0+fScgb3BlcmF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSAnPGVtPkVSZXNvbHZlIFByb3h5PC9lbT4nIG9wZXJhdGlvbi4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTGF6eVJlc29sdmVyI2VSZXNvbHZlUHJveHkob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRU9wZXJhdGlvbiBnZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZSA8ZW0+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkF1dGhvcml6YXRpb24gUGFja2FnZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0QXV0aG9yaXphdGlvblBhY2thZ2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvblBhY2thZ2UjZ2V0Um9sZXMgPGVtPlJvbGVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZSNnZXRSb2xlcygpCisJICogQHNlZSAjZ2V0QXV0aG9yaXphdGlvblBhY2thZ2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldEF1dGhvcml6YXRpb25QYWNrYWdlX1JvbGVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkJhc2UgPGVtPkF1dGhvcml6YXRpb24gQmFzZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdXRob3JpemF0aW9uIEJhc2U8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkJhc2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldEF1dGhvcml6YXRpb25CYXNlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uQmFzZSNnZXROYW1lIDxlbT5OYW1lPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+TmFtZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uQmFzZSNnZXROYW1lKCkKKwkgKiBAc2VlICNnZXRBdXRob3JpemF0aW9uQmFzZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0QXV0aG9yaXphdGlvbkJhc2VfTmFtZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGUgPGVtPlJvbGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGUjZ2V0Um9sZUVsZW1lbnRzIDxlbT5Sb2xlIEVsZW1lbnRzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5Sb2xlIEVsZW1lbnRzPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGUjZ2V0Um9sZUVsZW1lbnRzKCkKKwkgKiBAc2VlICNnZXRSb2xlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSb2xlX1JvbGVFbGVtZW50cygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbGVtZW50IDxlbT5Sb2xlIEVsZW1lbnQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBFbGVtZW50PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbGVtZW50CisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlRWxlbWVudCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkgPGVtPlJvbGUgRW50aXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgRW50aXR5PC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVFbnRpdHkoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlBdXRob3JpemVkIDxlbT5FbnRpdHkgQXV0aG9yaXplZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSBsaXN0ICc8ZW0+RW50aXR5IEF1dGhvcml6ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlBdXRob3JpemVkKCkKKwkgKiBAc2VlICNnZXRSb2xlRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSb2xlRW50aXR5X0VudGl0eUF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlGZWF0dXJlcyA8ZW0+RW50aXR5IEZlYXR1cmVzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5FbnRpdHkgRmVhdHVyZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlGZWF0dXJlcygpCisJICogQHNlZSAjZ2V0Um9sZUVudGl0eSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUVudGl0eV9FbnRpdHlGZWF0dXJlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlSZWYgPGVtPkVudGl0eSBSZWY8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHkgUmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkjZ2V0RW50aXR5UmVmKCkKKwkgKiBAc2VlICNnZXRSb2xlRW50aXR5KCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSb2xlRW50aXR5X0VudGl0eVJlZigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuIDxlbT5Sb2xlIEJlYW48L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBCZWFuPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlQmVhbigpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbiNnZXRCZWFuQXV0aG9yaXplZCA8ZW0+QmVhbiBBdXRob3JpemVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5CZWFuIEF1dGhvcml6ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW4jZ2V0QmVhbkF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSb2xlQmVhbl9CZWFuQXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbiNnZXRCZWFuRmVhdHVyZXMgPGVtPkJlYW4gRmVhdHVyZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkJlYW4gRmVhdHVyZXM8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW4jZ2V0QmVhbkZlYXR1cmVzKCkKKwkgKiBAc2VlICNnZXRSb2xlQmVhbigpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUJlYW5fQmVhbkZlYXR1cmVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbiNnZXRCZWFuUmVmIDxlbT5CZWFuIFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJlYW4gUmVmPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuI2dldEJlYW5SZWYoKQorCSAqIEBzZWUgI2dldFJvbGVCZWFuKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSb2xlQmVhbl9CZWFuUmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0byA8ZW0+Um9sZSBEdG88L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEdG88L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0bworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Um9sZUR0bygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b0F1dGhvcml6ZWQgPGVtPkR0byBBdXRob3JpemVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlIGxpc3QgJzxlbT5EdG8gQXV0aG9yaXplZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b0F1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVEdG8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVEdG9fRHRvQXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b0ZlYXR1cmVzIDxlbT5EdG8gRmVhdHVyZXM8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkR0byBGZWF0dXJlczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b0ZlYXR1cmVzKCkKKwkgKiBAc2VlICNnZXRSb2xlRHRvKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSb2xlRHRvX0R0b0ZlYXR1cmVzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b1JlZiA8ZW0+RHRvIFJlZjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkR0byBSZWY8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0byNnZXREdG9SZWYoKQorCSAqIEBzZWUgI2dldFJvbGVEdG8oKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJvbGVEdG9fRHRvUmVmKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3MgPGVtPlJvbGUgQmxpcCBBbGwgVXNlciBUYXNrczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIEJsaXAgQWxsIFVzZXIgVGFza3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3MKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVCbGlwQWxsVXNlclRhc2tzKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEFsbFVzZXJUYXNrcyNnZXRBdXRob3JpemVkIDxlbT5BdXRob3JpemVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yaXplZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEFsbFVzZXJUYXNrcyNnZXRBdXRob3JpemVkKCkKKwkgKiBAc2VlICNnZXRSb2xlQmxpcEFsbFVzZXJUYXNrcygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NfQXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sgPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlQmxpcFVzZXJUYXNrKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrI2dldFVzZXJUYXNrIDxlbT5Vc2VyIFRhc2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5Vc2VyIFRhc2s8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzayNnZXRVc2VyVGFzaygpCisJICogQHNlZSAjZ2V0Um9sZUJsaXBVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUJsaXBVc2VyVGFza19Vc2VyVGFzaygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzayNnZXRBdXRob3JpemVkIDxlbT5BdXRob3JpemVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QXV0aG9yaXplZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrI2dldEF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVCbGlwVXNlclRhc2soKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVCbGlwVXNlclRhc2tfQXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcyA8ZW0+Um9sZSBCbGlwIFByb2Nlc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBCbGlwIFByb2Nlc3M8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlQmxpcFByb2Nlc3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcyNnZXRQcm9jZXNzIDxlbT5Qcm9jZXNzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UHJvY2VzczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0UHJvY2VzcygpCisJICogQHNlZSAjZ2V0Um9sZUJsaXBQcm9jZXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRVJlZmVyZW5jZSBnZXRSb2xlQmxpcFByb2Nlc3NfUHJvY2VzcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldFByb2Nlc3NTdGFydEF1dGhvcml6ZWQgPGVtPlByb2Nlc3MgU3RhcnQgQXV0aG9yaXplZDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlByb2Nlc3MgU3RhcnQgQXV0aG9yaXplZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCgpCisJICogQHNlZSAjZ2V0Um9sZUJsaXBQcm9jZXNzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSb2xlQmxpcFByb2Nlc3NfUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldEFsbFVzZXJUYXNrcyA8ZW0+QWxsIFVzZXIgVGFza3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5BbGwgVXNlciBUYXNrczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0QWxsVXNlclRhc2tzKCkKKwkgKiBAc2VlICNnZXRSb2xlQmxpcFByb2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJvbGVCbGlwUHJvY2Vzc19BbGxVc2VyVGFza3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldFVzZXJUYXNrcyA8ZW0+VXNlciBUYXNrczwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+VXNlciBUYXNrczwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0VXNlclRhc2tzKCkKKwkgKiBAc2VlICNnZXRSb2xlQmxpcFByb2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFUmVmZXJlbmNlIGdldFJvbGVCbGlwUHJvY2Vzc19Vc2VyVGFza3MoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RmVhdHVyZSA8ZW0+Um9sZSBFbnRpdHkgRmVhdHVyZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlGZWF0dXJlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlRW50aXR5RmVhdHVyZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUZlYXR1cmUjZ2V0RW50aXR5QXR0cmlDb2wgPGVtPkVudGl0eSBBdHRyaSBDb2w8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHkgQXR0cmkgQ29sPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlGZWF0dXJlI2dldEVudGl0eUF0dHJpQ29sKCkKKwkgKiBAc2VlICNnZXRSb2xlRW50aXR5RmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUVudGl0eUZlYXR1cmVfRW50aXR5QXR0cmlDb2woKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5QXR0cmlidXRlIDxlbT5Sb2xlIEVudGl0eSBBdHRyaWJ1dGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBFbnRpdHkgQXR0cmlidXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVFbnRpdHlBdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGUjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGUjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVFbnRpdHlBdHRyaWJ1dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVFbnRpdHlBdHRyaWJ1dGVfRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5UmVmZXJlbmNlIDxlbT5Sb2xlIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVFbnRpdHlSZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVFbnRpdHlSZWZlcmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVFbnRpdHlSZWZlcmVuY2VfRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkZlYXR1cmUgPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuRmVhdHVyZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Um9sZUJlYW5GZWF0dXJlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkZlYXR1cmUjZ2V0QmVhbkF0dHJpQ29sIDxlbT5CZWFuIEF0dHJpIENvbDwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPkJlYW4gQXR0cmkgQ29sPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuRmVhdHVyZSNnZXRCZWFuQXR0cmlDb2woKQorCSAqIEBzZWUgI2dldFJvbGVCZWFuRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUJlYW5GZWF0dXJlX0JlYW5BdHRyaUNvbCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuQXR0cmlidXRlIDxlbT5Sb2xlIEJlYW4gQXR0cmlidXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5BdHRyaWJ1dGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVCZWFuQXR0cmlidXRlKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZSNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5BdHRyaWJ1dGUjZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAc2VlICNnZXRSb2xlQmVhbkF0dHJpYnV0ZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVBdHRyaWJ1dGUgZ2V0Um9sZUJlYW5BdHRyaWJ1dGVfQmVhbkF0dHJpVW5hdXRob3JpemVkKCk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5SZWZlcmVuY2UgPGVtPlJvbGUgQmVhbiBSZWZlcmVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBCZWFuIFJlZmVyZW5jZTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQ2xhc3MgZ2V0Um9sZUJlYW5SZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuUmVmZXJlbmNlI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5CZWFuIEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZSNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVCZWFuUmVmZXJlbmNlKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUF0dHJpYnV0ZSBnZXRSb2xlQmVhblJlZmVyZW5jZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvRmVhdHVyZSA8ZW0+Um9sZSBEdG8gRmVhdHVyZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Sb2xlIER0byBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlCisJICogQGdlbmVyYXRlZAorCSAqLworCUVDbGFzcyBnZXRSb2xlRHRvRmVhdHVyZSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0ZlYXR1cmUjZ2V0RHRvQXR0cmlDb2wgPGVtPkR0byBBdHRyaSBDb2w8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5EdG8gQXR0cmkgQ29sPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlI2dldER0b0F0dHJpQ29sKCkKKwkgKiBAc2VlICNnZXRSb2xlRHRvRmVhdHVyZSgpCisJICogQGdlbmVyYXRlZAorCSAqLworCUVSZWZlcmVuY2UgZ2V0Um9sZUR0b0ZlYXR1cmVfRHRvQXR0cmlDb2woKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvQXR0cmlidXRlIDxlbT5Sb2xlIER0byBBdHRyaWJ1dGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEdG8gQXR0cmlidXRlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVEdG9BdHRyaWJ1dGUoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGUjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGUjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVEdG9BdHRyaWJ1dGUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVEdG9BdHRyaWJ1dGVfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlIDxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+Um9sZSBEdG8gUmVmZXJlbmNlPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9SZWZlcmVuY2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUNsYXNzIGdldFJvbGVEdG9SZWZlcmVuY2UoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9SZWZlcmVuY2UjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9SZWZlcmVuY2UjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBzZWUgI2dldFJvbGVEdG9SZWZlcmVuY2UoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFQXR0cmlidXRlIGdldFJvbGVEdG9SZWZlcmVuY2VfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtIDxlbT5Sb2xlIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Sb2xlIEVudW08L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0Um9sZUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0gPGVtPlJvbGUgUHJvcGVydHkgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJvbGUgUHJvcGVydHkgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtCisJICogQGdlbmVyYXRlZAorCSAqLworCUVFbnVtIGdldFJvbGVQcm9wZXJ0eUVudW0oKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzc0VudW0gPGVtPlJvbGUgQmxpcCBQcm9jZXNzIEVudW08L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Sb2xlIEJsaXAgUHJvY2VzcyBFbnVtPC9lbT4nLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzc0VudW0KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUVudW0gZ2V0Um9sZUJsaXBQcm9jZXNzRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW0gPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2sgRW51bTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2sgRW51bTwvZW0+Jy4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrRW51bQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFRW51bSBnZXRSb2xlQmxpcFVzZXJUYXNrRW51bSgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAne0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QgPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGRhdGEgdHlwZSAnPGVtPkludGVybmFsIEVPYmplY3Q8L2VtPicuCisJICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0CisJICogQG1vZGVsIGluc3RhbmNlQ2xhc3M9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3QiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVEYXRhVHlwZSBnZXRJbnRlcm5hbEVPYmplY3QoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVzIHRoZSBpbnN0YW5jZXMgb2YgdGhlIG1vZGVsLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCisJICogQGdlbmVyYXRlZAorCSAqLworCUF1dGhvcml6YXRpb25EU0xGYWN0b3J5IGdldEF1dGhvcml6YXRpb25EU0xGYWN0b3J5KCk7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIERlZmluZXMgbGl0ZXJhbHMgZm9yIHRoZSBtZXRhIG9iamVjdHMgdGhhdCByZXByZXNlbnQKKwkgKiA8dWw+CisJICogICA8bGk+ZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZmVhdHVyZSBvZiBlYWNoIGNsYXNzLDwvbGk+CisJICogICA8bGk+ZWFjaCBvcGVyYXRpb24gb2YgZWFjaCBjbGFzcyw8L2xpPgorCSAqICAgPGxpPmVhY2ggZW51bSw8L2xpPgorCSAqICAgPGxpPmFuZCBlYWNoIGRhdGEgdHlwZTwvbGk+CisJICogPC91bD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJaW50ZXJmYWNlIExpdGVyYWxzIHsKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uTW9kZWxJbXBsIDxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbk1vZGVsSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRBdXRob3JpemF0aW9uTW9kZWwoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgQVVUSE9SSVpBVElPTl9NT0RFTCA9IGVJTlNUQU5DRS5nZXRBdXRob3JpemF0aW9uTW9kZWwoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPlBja2c8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBBVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHID0gZUlOU1RBTkNFLmdldEF1dGhvcml6YXRpb25Nb2RlbF9QY2tnKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbCA8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0QXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcigpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVIgPSBlSU5TVEFOQ0UuZ2V0QXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RVJlc29sdmUgUHJveHk8L2I+PC9lbT4nIG9wZXJhdGlvbi4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVPcGVyYXRpb24gQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSX19fRVJFU09MVkVfUFJPWFlfX0lOVEVSTkFMRU9CSkVDVCA9IGVJTlNUQU5DRS5nZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25QYWNrYWdlSW1wbCA8ZW0+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvblBhY2thZ2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldEF1dGhvcml6YXRpb25QYWNrYWdlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFVVEhPUklaQVRJT05fUEFDS0FHRSA9IGVJTlNUQU5DRS5nZXRBdXRob3JpemF0aW9uUGFja2FnZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+Um9sZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIEFVVEhPUklaQVRJT05fUEFDS0FHRV9fUk9MRVMgPSBlSU5TVEFOQ0UuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VfUm9sZXMoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25CYXNlSW1wbCA8ZW0+QXV0aG9yaXphdGlvbiBCYXNlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkJhc2VJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldEF1dGhvcml6YXRpb25CYXNlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIEFVVEhPUklaQVRJT05fQkFTRSA9IGVJTlNUQU5DRS5nZXRBdXRob3JpemF0aW9uQmFzZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIEFVVEhPUklaQVRJT05fQkFTRV9fTkFNRSA9IGVJTlNUQU5DRS5nZXRBdXRob3JpemF0aW9uQmFzZV9OYW1lKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlSW1wbCA8ZW0+Um9sZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRSA9IGVJTlNUQU5DRS5nZXRSb2xlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Sb2xlIEVsZW1lbnRzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBST0xFX19ST0xFX0VMRU1FTlRTID0gZUlOU1RBTkNFLmdldFJvbGVfUm9sZUVsZW1lbnRzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRWxlbWVudEltcGwgPGVtPlJvbGUgRWxlbWVudDwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbGVtZW50SW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlRWxlbWVudCgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBST0xFX0VMRU1FTlQgPSBlSU5TVEFOQ0UuZ2V0Um9sZUVsZW1lbnQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlJbXBsIDxlbT5Sb2xlIEVudGl0eTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVFbnRpdHkoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9FTlRJVFkgPSBlSU5TVEFOQ0UuZ2V0Um9sZUVudGl0eSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfRU5USVRZX19FTlRJVFlfQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlRW50aXR5X0VudGl0eUF1dGhvcml6ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUk9MRV9FTlRJVFlfX0VOVElUWV9GRUFUVVJFUyA9IGVJTlNUQU5DRS5nZXRSb2xlRW50aXR5X0VudGl0eUZlYXR1cmVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUk9MRV9FTlRJVFlfX0VOVElUWV9SRUYgPSBlSU5TVEFOQ0UuZ2V0Um9sZUVudGl0eV9FbnRpdHlSZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuSW1wbCA8ZW0+Um9sZSBCZWFuPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCZWFuKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfQkVBTiA9IGVJTlNUQU5DRS5nZXRSb2xlQmVhbigpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBBdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlQmVhbl9CZWFuQXV0aG9yaXplZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUk9MRV9CRUFOX19CRUFOX0ZFQVRVUkVTID0gZUlOU1RBTkNFLmdldFJvbGVCZWFuX0JlYW5GZWF0dXJlcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBST0xFX0JFQU5fX0JFQU5fUkVGID0gZUlOU1RBTkNFLmdldFJvbGVCZWFuX0JlYW5SZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVEdG9JbXBsIDxlbT5Sb2xlIER0bzwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVEdG9JbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVEdG8oKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9EVE8gPSBlSU5TVEFOQ0UuZ2V0Um9sZUR0bygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RHRvIEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfRFRPX19EVE9fQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlRHRvX0R0b0F1dGhvcml6ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkR0byBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUk9MRV9EVE9fX0RUT19GRUFUVVJFUyA9IGVJTlNUQU5DRS5nZXRSb2xlRHRvX0R0b0ZlYXR1cmVzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5EdG8gUmVmPC9iPjwvZW0+JyByZWZlcmVuY2UgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVSZWZlcmVuY2UgUk9MRV9EVE9fX0RUT19SRUYgPSBlSU5TVEFOQ0UuZ2V0Um9sZUR0b19EdG9SZWYoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwQWxsVXNlclRhc2tzSW1wbCA8ZW0+Um9sZSBCbGlwIEFsbCBVc2VyIFRhc2tzPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCbGlwQWxsVXNlclRhc2tzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfQkxJUF9BTExfVVNFUl9UQVNLUyA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfQkxJUF9BTExfVVNFUl9UQVNLU19fQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc19BdXRob3JpemVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmxpcFVzZXJUYXNrSW1wbCA8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwVXNlclRhc2tJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCbGlwVXNlclRhc2soKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9CTElQX1VTRVJfVEFTSyA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcFVzZXJUYXNrKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIFRhc2s8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBST0xFX0JMSVBfVVNFUl9UQVNLX19VU0VSX1RBU0sgPSBlSU5TVEFOQ0UuZ2V0Um9sZUJsaXBVc2VyVGFza19Vc2VyVGFzaygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQgPSBlSU5TVEFOQ0UuZ2V0Um9sZUJsaXBVc2VyVGFza19BdXRob3JpemVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmxpcFByb2Nlc3NJbXBsIDxlbT5Sb2xlIEJsaXAgUHJvY2VzczwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwUHJvY2Vzc0ltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJsaXBQcm9jZXNzKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfQkxJUF9QUk9DRVNTID0gZUlOU1RBTkNFLmdldFJvbGVCbGlwUHJvY2VzcygpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+UHJvY2VzczwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJPTEVfQkxJUF9QUk9DRVNTX19QUk9DRVNTID0gZUlOU1RBTkNFLmdldFJvbGVCbGlwUHJvY2Vzc19Qcm9jZXNzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEID0gZUlOU1RBTkNFLmdldFJvbGVCbGlwUHJvY2Vzc19Qcm9jZXNzU3RhcnRBdXRob3JpemVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5BbGwgVXNlciBUYXNrczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUyA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcFByb2Nlc3NfQWxsVXNlclRhc2tzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5Vc2VyIFRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBST0xFX0JMSVBfUFJPQ0VTU19fVVNFUl9UQVNLUyA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcFByb2Nlc3NfVXNlclRhc2tzKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5RmVhdHVyZUltcGwgPGVtPlJvbGUgRW50aXR5IEZlYXR1cmU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5RmVhdHVyZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUVudGl0eUZlYXR1cmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9FTlRJVFlfRkVBVFVSRSA9IGVJTlNUQU5DRS5nZXRSb2xlRW50aXR5RmVhdHVyZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5IEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wgPSBlSU5TVEFOQ0UuZ2V0Um9sZUVudGl0eUZlYXR1cmVfRW50aXR5QXR0cmlDb2woKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlBdHRyaWJ1dGVJbXBsIDxlbT5Sb2xlIEVudGl0eSBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5QXR0cmlidXRlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlRW50aXR5QXR0cmlidXRlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfRU5USVRZX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRSb2xlRW50aXR5QXR0cmlidXRlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUk9MRV9FTlRJVFlfQVRUUklCVVRFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEID0gZUlOU1RBTkNFLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVfRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlSZWZlcmVuY2VJbXBsIDxlbT5Sb2xlIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5UmVmZXJlbmNlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlRW50aXR5UmVmZXJlbmNlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfRU5USVRZX1JFRkVSRU5DRSA9IGVJTlNUQU5DRS5nZXRSb2xlRW50aXR5UmVmZXJlbmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgZmVhdHVyZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVBdHRyaWJ1dGUgUk9MRV9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEID0gZUlOU1RBTkNFLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VfRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuRmVhdHVyZUltcGwgPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5GZWF0dXJlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlQmVhbkZlYXR1cmUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9CRUFOX0ZFQVRVUkUgPSBlSU5TVEFOQ0UuZ2V0Um9sZUJlYW5GZWF0dXJlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CZWFuIEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFUmVmZXJlbmNlIFJPTEVfQkVBTl9GRUFUVVJFX19CRUFOX0FUVFJJX0NPTCA9IGVJTlNUQU5DRS5nZXRSb2xlQmVhbkZlYXR1cmVfQmVhbkF0dHJpQ29sKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmVhbkF0dHJpYnV0ZUltcGwgPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPn0nIGNsYXNzLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmVhbkF0dHJpYnV0ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUJlYW5BdHRyaWJ1dGUoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQ2xhc3MgUk9MRV9CRUFOX0FUVFJJQlVURSA9IGVJTlNUQU5DRS5nZXRSb2xlQmVhbkF0dHJpYnV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUF0dHJpYnV0ZSBST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlQmVhbkF0dHJpYnV0ZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuUmVmZXJlbmNlSW1wbCA8ZW0+Um9sZSBCZWFuIFJlZmVyZW5jZTwvZW0+fScgY2xhc3MuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuUmVmZXJlbmNlSW1wbAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlQmVhblJlZmVyZW5jZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBST0xFX0JFQU5fUkVGRVJFTkNFID0gZUlOU1RBTkNFLmdldFJvbGVCZWFuUmVmZXJlbmNlKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT48Yj5CZWFuIEF0dHJpIFVuYXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEID0gZUlOU1RBTkNFLmdldFJvbGVCZWFuUmVmZXJlbmNlX0JlYW5BdHRyaVVuYXV0aG9yaXplZCgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0ZlYXR1cmVJbXBsIDxlbT5Sb2xlIER0byBGZWF0dXJlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0ZlYXR1cmVJbXBsCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVEdG9GZWF0dXJlKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUNsYXNzIFJPTEVfRFRPX0ZFQVRVUkUgPSBlSU5TVEFOQ0UuZ2V0Um9sZUR0b0ZlYXR1cmUoKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAnPGVtPjxiPkR0byBBdHRyaSBDb2w8L2I+PC9lbT4nIHJlZmVyZW5jZSBmZWF0dXJlLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRVJlZmVyZW5jZSBST0xFX0RUT19GRUFUVVJFX19EVE9fQVRUUklfQ09MID0gZUlOU1RBTkNFLmdldFJvbGVEdG9GZWF0dXJlX0R0b0F0dHJpQ29sKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvQXR0cmlidXRlSW1wbCA8ZW0+Um9sZSBEdG8gQXR0cmlidXRlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0F0dHJpYnV0ZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUR0b0F0dHJpYnV0ZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBST0xFX0RUT19BVFRSSUJVVEUgPSBlSU5TVEFOQ0UuZ2V0Um9sZUR0b0F0dHJpYnV0ZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfRFRPX0FUVFJJQlVURV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlRHRvQXR0cmlidXRlX0R0b0F0dHJpVW5hdXRob3JpemVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvUmVmZXJlbmNlSW1wbCA8ZW0+Um9sZSBEdG8gUmVmZXJlbmNlPC9lbT59JyBjbGFzcy4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b1JlZmVyZW5jZUltcGwKKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwjZ2V0Um9sZUR0b1JlZmVyZW5jZSgpCisJCSAqIEBnZW5lcmF0ZWQKKwkJICovCisJCUVDbGFzcyBST0xFX0RUT19SRUZFUkVOQ0UgPSBlSU5TVEFOQ0UuZ2V0Um9sZUR0b1JlZmVyZW5jZSgpOworCisJCS8qKgorCQkgKiBUaGUgbWV0YSBvYmplY3QgbGl0ZXJhbCBmb3IgdGhlICc8ZW0+PGI+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGZlYXR1cmUuCisJCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFQXR0cmlidXRlIFJPTEVfRFRPX1JFRkVSRU5DRV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRCA9IGVJTlNUQU5DRS5nZXRSb2xlRHRvUmVmZXJlbmNlX0R0b0F0dHJpVW5hdXRob3JpemVkKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW0gPGVtPlJvbGUgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUk9MRV9FTlVNID0gZUlOU1RBTkNFLmdldFJvbGVFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bSA8ZW0+Um9sZSBQcm9wZXJ0eSBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlUHJvcGVydHlFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUk9MRV9QUk9QRVJUWV9FTlVNID0gZUlOU1RBTkNFLmdldFJvbGVQcm9wZXJ0eUVudW0oKTsKKworCQkvKioKKwkJICogVGhlIG1ldGEgb2JqZWN0IGxpdGVyYWwgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3NFbnVtIDxlbT5Sb2xlIEJsaXAgUHJvY2VzcyBFbnVtPC9lbT59JyBlbnVtLgorCQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bQorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRSb2xlQmxpcFByb2Nlc3NFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUk9MRV9CTElQX1BST0NFU1NfRU5VTSA9IGVJTlNUQU5DRS5nZXRSb2xlQmxpcFByb2Nlc3NFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW0gPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2sgRW51bTwvZW0+fScgZW51bS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtCisJCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsI2dldFJvbGVCbGlwVXNlclRhc2tFbnVtKCkKKwkJICogQGdlbmVyYXRlZAorCQkgKi8KKwkJRUVudW0gUk9MRV9CTElQX1VTRVJfVEFTS19FTlVNID0gZUlOU1RBTkNFLmdldFJvbGVCbGlwVXNlclRhc2tFbnVtKCk7CisKKwkJLyoqCisJCSAqIFRoZSBtZXRhIG9iamVjdCBsaXRlcmFsIGZvciB0aGUgJzxlbT5JbnRlcm5hbCBFT2JqZWN0PC9lbT4nIGRhdGEgdHlwZS4KKwkJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAorCQkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCNnZXRJbnRlcm5hbEVPYmplY3QoKQorCQkgKiBAZ2VuZXJhdGVkCisJCSAqLworCQlFRGF0YVR5cGUgSU5URVJOQUxfRU9CSkVDVCA9IGVJTlNUQU5DRS5nZXRJbnRlcm5hbEVPYmplY3QoKTsKKworCX0KKworfSAvL0F1dGhvcml6YXRpb25EU0xQYWNrYWdlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc4ZjQxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgZXh0ZW5kcyBFT2JqZWN0IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIiBwcm94eURhdGFUeXBlPSJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuSW50ZXJuYWxFT2JqZWN0IiBwcm94eVVuaXF1ZT0iZmFsc2UiCisJICogICAgICAgIGFubm90YXRpb249Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvR2VuTW9kZWwgYm9keT0nPCVvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UlPiBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTtcbjwlb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0JT4gX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpO1xucmV0dXJuIDwlb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzJT4ucmVzb2x2ZShwcm94eSwgX3Jlc291cmNlU2V0KTsnIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFT2JqZWN0IGVSZXNvbHZlUHJveHkoSW50ZXJuYWxFT2JqZWN0IHByb3h5KTsKKworfSAvLyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbk1vZGVsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbk1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxMTdjYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uTW9kZWwuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dGhvcml6YXRpb24gTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbCNnZXRQY2tnIDxlbT5QY2tnPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0QXV0aG9yaXphdGlvbk1vZGVsKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIEF1dGhvcml6YXRpb25Nb2RlbCBleHRlbmRzIEVPYmplY3QgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBja2c8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBja2c8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGNrZzwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UGNrZyhBdXRob3JpemF0aW9uUGFja2FnZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRBdXRob3JpemF0aW9uTW9kZWxfUGNrZygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlBdXRob3JpemF0aW9uUGFja2FnZSBnZXRQY2tnKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsI2dldFBja2cgPGVtPlBja2c8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBja2c8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFBja2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFBja2coQXV0aG9yaXphdGlvblBhY2thZ2UgdmFsdWUpOworCit9IC8vIEF1dGhvcml6YXRpb25Nb2RlbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25QYWNrYWdlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvblBhY2thZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWJkMzFmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25QYWNrYWdlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QXV0aG9yaXphdGlvbiBQYWNrYWdlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZSNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRBdXRob3JpemF0aW9uUGFja2FnZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBBdXRob3JpemF0aW9uUGFja2FnZSBleHRlbmRzIExQYWNrYWdlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Sb2xlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlJvbGVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VfUm9sZXMoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8Um9sZT4gZ2V0Um9sZXMoKTsKKworfSAvLyBBdXRob3JpemF0aW9uUGFja2FnZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjZjJiOQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZSNnZXRSb2xlRWxlbWVudHMgPGVtPlJvbGUgRWxlbWVudHM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvbGUgZXh0ZW5kcyBBdXRob3JpemF0aW9uQmFzZSB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Um9sZSBFbGVtZW50czwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRWxlbWVudH0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Sb2xlIEVsZW1lbnRzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Um9sZSBFbGVtZW50czwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlX1JvbGVFbGVtZW50cygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlRWxlbWVudD4gZ2V0Um9sZUVsZW1lbnRzKCk7CisKK30gLy8gUm9sZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWRkNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEJlYW47CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgQmVhbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW4jZ2V0QmVhbkF1dGhvcml6ZWQgPGVtPkJlYW4gQXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuI2dldEJlYW5GZWF0dXJlcyA8ZW0+QmVhbiBGZWF0dXJlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuI2dldEJlYW5SZWYgPGVtPkJlYW4gUmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJlYW4oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJlYW4gZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBBdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtfS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmVhbiBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJlYW5fQmVhbkF1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlRW51bT4gZ2V0QmVhbkF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gRmVhdHVyZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gRmVhdHVyZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5CZWFuIEZlYXR1cmVzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCZWFuX0JlYW5GZWF0dXJlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlQmVhbkZlYXR1cmU+IGdldEJlYW5GZWF0dXJlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gUmVmPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCZWFuUmVmKExCZWFuKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCZWFuX0JlYW5SZWYoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMQmVhbiBnZXRCZWFuUmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW4jZ2V0QmVhblJlZiA8ZW0+QmVhbiBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCZWFuUmVmKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCZWFuUmVmKExCZWFuIHZhbHVlKTsKKworfSAvLyBSb2xlQmVhbgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJlYW5BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODNjNDM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIEJlYW4gQXR0cmlidXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZSNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJlYW5BdHRyaWJ1dGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJlYW5BdHRyaWJ1dGUgZXh0ZW5kcyBSb2xlQmVhbkZlYXR1cmUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmVhbkF0dHJpYnV0ZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlUHJvcGVydHlFbnVtIGdldEJlYW5BdHRyaVVuYXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuQXR0cmlidXRlI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtCisJICogQHNlZSAjZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSB2YWx1ZSk7CisKK30gLy8gUm9sZUJlYW5BdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmVhbkZlYXR1cmUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmVhbkZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGUwYmZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5lbnRpdHkuTEJlYW5GZWF0dXJlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIEJlYW4gRmVhdHVyZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlI2dldEJlYW5BdHRyaUNvbCA8ZW0+QmVhbiBBdHRyaSBDb2w8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmVhbkZlYXR1cmUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJlYW5GZWF0dXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QmVhbiBBdHRyaSBDb2w8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkJlYW4gQXR0cmkgQ29sPC9lbT4nIHJlZmVyZW5jZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gQXR0cmkgQ29sPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRCZWFuQXR0cmlDb2woTEJlYW5GZWF0dXJlKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCZWFuRmVhdHVyZV9CZWFuQXR0cmlDb2woKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMQmVhbkZlYXR1cmUgZ2V0QmVhbkF0dHJpQ29sKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlI2dldEJlYW5BdHRyaUNvbCA8ZW0+QmVhbiBBdHRyaSBDb2w8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gQXR0cmkgQ29sPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRCZWFuQXR0cmlDb2woKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEJlYW5BdHRyaUNvbChMQmVhbkZlYXR1cmUgdmFsdWUpOworCit9IC8vIFJvbGVCZWFuRmVhdHVyZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJlYW5SZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2MyMmZmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCZWFuUmVmZXJlbmNlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIEJlYW4gUmVmZXJlbmNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZSNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJlYW5SZWZlcmVuY2UoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJlYW5SZWZlcmVuY2UgZXh0ZW5kcyBSb2xlQmVhbkZlYXR1cmUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmVhblJlZmVyZW5jZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlUHJvcGVydHlFbnVtIGdldEJlYW5BdHRyaVVuYXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuUmVmZXJlbmNlI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtCisJICogQHNlZSAjZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSB2YWx1ZSk7CisKK30gLy8gUm9sZUJlYW5SZWZlcmVuY2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcEFsbFVzZXJUYXNrcy5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCbGlwQWxsVXNlclRhc2tzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YTk5MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcEFsbFVzZXJUYXNrcy5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBCbGlwIEFsbCBVc2VyIFRhc2tzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEFsbFVzZXJUYXNrcyNnZXRBdXRob3JpemVkIDxlbT5BdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3MoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJsaXBBbGxVc2VyVGFza3MgZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+QXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlLgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtCisJICogQHNlZSAjc2V0QXV0aG9yaXplZChSb2xlQmxpcFVzZXJUYXNrRW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmxpcEFsbFVzZXJUYXNrc19BdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBVc2VyVGFza0VudW0gZ2V0QXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwQWxsVXNlclRhc2tzI2dldEF1dGhvcml6ZWQgPGVtPkF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtCisJICogQHNlZSAjZ2V0QXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0QXV0aG9yaXplZChSb2xlQmxpcFVzZXJUYXNrRW51bSB2YWx1ZSk7CisKK30gLy8gUm9sZUJsaXBBbGxVc2VyVGFza3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcFByb2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcFByb2Nlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg0ZTNmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVCbGlwUHJvY2Vzcy5qYXZhCkBAIC0wLDAgKzEsMTM4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXA7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgQmxpcCBQcm9jZXNzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcyNnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkIDxlbT5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3MjZ2V0QWxsVXNlclRhc2tzIDxlbT5BbGwgVXNlciBUYXNrczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcyNnZXRVc2VyVGFza3MgPGVtPlVzZXIgVGFza3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmxpcFByb2Nlc3MoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUJsaXBQcm9jZXNzIGV4dGVuZHMgUm9sZUVsZW1lbnQgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlByb2Nlc3M8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzczwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0UHJvY2VzcyhCbGlwKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCbGlwUHJvY2Vzc19Qcm9jZXNzKCkKKwkgKiBAbW9kZWwKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQmxpcCBnZXRQcm9jZXNzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldFByb2Nlc3MgPGVtPlByb2Nlc3M8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlByb2Nlc3M8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldFByb2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldFByb2Nlc3MoQmxpcCB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBTdGFydCBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3NFbnVtCisJICogQHNlZSAjc2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZChSb2xlQmxpcFByb2Nlc3NFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCbGlwUHJvY2Vzc19Qcm9jZXNzU3RhcnRBdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBQcm9jZXNzRW51bSBnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldFByb2Nlc3NTdGFydEF1dGhvcml6ZWQgPGVtPlByb2Nlc3MgU3RhcnQgQXV0aG9yaXplZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHJvY2VzcyBTdGFydCBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3NFbnVtCisJICogQHNlZSAjZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZChSb2xlQmxpcFByb2Nlc3NFbnVtIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkFsbCBVc2VyIFRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BbGwgVXNlciBUYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BbGwgVXNlciBUYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0QWxsVXNlclRhc2tzKFJvbGVCbGlwQWxsVXNlclRhc2tzKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVCbGlwUHJvY2Vzc19BbGxVc2VyVGFza3MoKQorCSAqIEBtb2RlbCBjb250YWlubWVudD0idHJ1ZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBBbGxVc2VyVGFza3MgZ2V0QWxsVXNlclRhc2tzKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzI2dldEFsbFVzZXJUYXNrcyA8ZW0+QWxsIFVzZXIgVGFza3M8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkFsbCBVc2VyIFRhc2tzPC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRBbGxVc2VyVGFza3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEFsbFVzZXJUYXNrcyhSb2xlQmxpcEFsbFVzZXJUYXNrcyB2YWx1ZSk7CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Vc2VyIFRhc2tzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2t9LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VXNlciBUYXNrczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlVzZXIgVGFza3M8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBQcm9jZXNzX1VzZXJUYXNrcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlQmxpcFVzZXJUYXNrPiBnZXRVc2VyVGFza3MoKTsKKworfSAvLyBSb2xlQmxpcFByb2Nlc3MKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcFByb2Nlc3NFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBQcm9jZXNzRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOWRiMTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBQcm9jZXNzRW51bS5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Um9sZSBCbGlwIFByb2Nlc3MgRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBQcm9jZXNzRW51bSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGVudW0gUm9sZUJsaXBQcm9jZXNzRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlN0YXJ0YWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNTVEFSVEFCTEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlTVEFSVEFCTEUoMCwgInN0YXJ0YWJsZSIsICJzdGFydGFibGUiKTsKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlN0YXJ0YWJsZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+U3RhcnRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1NUQVJUQUJMRQorCSAqIEBtb2RlbCBuYW1lPSJzdGFydGFibGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBUlRBQkxFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Sb2xlIEJsaXAgUHJvY2VzcyBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBSb2xlQmxpcFByb2Nlc3NFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFJvbGVCbGlwUHJvY2Vzc0VudW1bXSB7CisJCQlTVEFSVEFCTEUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Um9sZSBCbGlwIFByb2Nlc3MgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFJvbGVCbGlwUHJvY2Vzc0VudW0+IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBCbGlwIFByb2Nlc3MgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJvbGVCbGlwUHJvY2Vzc0VudW0gZ2V0KFN0cmluZyBsaXRlcmFsKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSb2xlQmxpcFByb2Nlc3NFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBCbGlwIFByb2Nlc3MgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJvbGVCbGlwUHJvY2Vzc0VudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSb2xlQmxpcFByb2Nlc3NFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Sb2xlIEJsaXAgUHJvY2VzcyBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUm9sZUJsaXBQcm9jZXNzRW51bSBnZXQoaW50IHZhbHVlKSB7CisJCXN3aXRjaCAodmFsdWUpIHsKKwkJCWNhc2UgU1RBUlRBQkxFX1ZBTFVFOiByZXR1cm4gU1RBUlRBQkxFOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBSb2xlQmxpcFByb2Nlc3NFbnVtKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBsaXRlcmFsKSB7CisJCXRoaXMudmFsdWUgPSB2YWx1ZTsKKwkJdGhpcy5uYW1lID0gbmFtZTsKKwkJdGhpcy5saXRlcmFsID0gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgaW50IGdldFZhbHVlKCkgeworCSAgcmV0dXJuIHZhbHVlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkgIHJldHVybiBuYW1lOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TGl0ZXJhbCgpIHsKKwkgIHJldHVybiBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIGxpdGVyYWwgdmFsdWUgb2YgdGhlIGVudW1lcmF0b3IsIHdoaWNoIGlzIGl0cyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJcmV0dXJuIGxpdGVyYWw7CisJfQorCQorfSAvL1JvbGVCbGlwUHJvY2Vzc0VudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcFVzZXJUYXNrLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBVc2VyVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMzg0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBVc2VyVGFzay5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIEJsaXAgVXNlciBUYXNrPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrI2dldFVzZXJUYXNrIDxlbT5Vc2VyIFRhc2s8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrI2dldEF1dGhvcml6ZWQgPGVtPkF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlQmxpcFVzZXJUYXNrKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvbGVCbGlwVXNlclRhc2sgZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VXNlciBUYXNrPC9iPjwvZW0+JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Vc2VyIFRhc2s8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBUYXNrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXRVc2VyVGFzayhCbGlwVXNlclRhc2spCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBVc2VyVGFza19Vc2VyVGFzaygpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUJsaXBVc2VyVGFzayBnZXRVc2VyVGFzaygpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sjZ2V0VXNlclRhc2sgPGVtPlVzZXIgVGFzazwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VXNlciBUYXNrPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0VXNlclRhc2soQmxpcFVzZXJUYXNrIHZhbHVlKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+QXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrRW51bQorCSAqIEBzZWUgI3NldEF1dGhvcml6ZWQoUm9sZUJsaXBVc2VyVGFza0VudW0pCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBVc2VyVGFza19BdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZUJsaXBVc2VyVGFza0VudW0gZ2V0QXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sjZ2V0QXV0aG9yaXplZCA8ZW0+QXV0aG9yaXplZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+QXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW0KKwkgKiBAc2VlICNnZXRBdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXRBdXRob3JpemVkKFJvbGVCbGlwVXNlclRhc2tFbnVtIHZhbHVlKTsKKworfSAvLyBSb2xlQmxpcFVzZXJUYXNrCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBVc2VyVGFza0VudW0uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlQmxpcFVzZXJUYXNrRW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZGZkZDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUJsaXBVc2VyVGFza0VudW0uamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPlJvbGUgQmxpcCBVc2VyIFRhc2sgRW51bTwvYj48L2VtPicsCisgKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUJsaXBVc2VyVGFza0VudW0oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBlbnVtIFJvbGVCbGlwVXNlclRhc2tFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+RXhlY3V0YWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNFWEVDVVRBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJRVhFQ1VUQUJMRSgwLCAiZXhlY3V0YWJsZSIsICJleGVjdXRhYmxlIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5FeGVjdXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FeGVjdXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0VYRUNVVEFCTEUKKwkgKiBAbW9kZWwgbmFtZT0iZXhlY3V0YWJsZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWEVDVVRBQkxFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Sb2xlIEJsaXAgVXNlciBUYXNrIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJvbGVCbGlwVXNlclRhc2tFbnVtW10gVkFMVUVTX0FSUkFZID0KKwkJbmV3IFJvbGVCbGlwVXNlclRhc2tFbnVtW10geworCQkJRVhFQ1VUQUJMRSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Sb2xlIEJsaXAgVXNlciBUYXNrIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxSb2xlQmxpcFVzZXJUYXNrRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Sb2xlIEJsaXAgVXNlciBUYXNrIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSb2xlQmxpcFVzZXJUYXNrRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVJvbGVCbGlwVXNlclRhc2tFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBCbGlwIFVzZXIgVGFzayBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUm9sZUJsaXBVc2VyVGFza0VudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSb2xlQmxpcFVzZXJUYXNrRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBCbGlwIFVzZXIgVGFzayBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUm9sZUJsaXBVc2VyVGFza0VudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEVYRUNVVEFCTEVfVkFMVUU6IHJldHVybiBFWEVDVVRBQkxFOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIGxpdGVyYWw7CisKKwkvKioKKwkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBSb2xlQmxpcFVzZXJUYXNrRW51bShpbnQgdmFsdWUsIFN0cmluZyBuYW1lLCBTdHJpbmcgbGl0ZXJhbCkgeworCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCXRoaXMubmFtZSA9IG5hbWU7CisJCXRoaXMubGl0ZXJhbCA9IGxpdGVyYWw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIGludCBnZXRWYWx1ZSgpIHsKKwkgIHJldHVybiB2YWx1ZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisJICByZXR1cm4gbmFtZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGdldExpdGVyYWwoKSB7CisJICByZXR1cm4gbGl0ZXJhbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHZhbHVlIG9mIHRoZSBlbnVtZXJhdG9yLCB3aGljaCBpcyBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCXJldHVybiBsaXRlcmFsOworCX0KKwkKK30gLy9Sb2xlQmxpcFVzZXJUYXNrRW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVEdG8uamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRHRvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0YWIwMAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRHRvLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5kdG8uTER0bzsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEdG88L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG8jZ2V0RHRvQXV0aG9yaXplZCA8ZW0+RHRvIEF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b0ZlYXR1cmVzIDxlbT5EdG8gRmVhdHVyZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvI2dldER0b1JlZiA8ZW0+RHRvIFJlZjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVEdG8oKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUR0byBleHRlbmRzIFJvbGVFbGVtZW50IHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EdG8gQXV0aG9yaXplZDwvYj48L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bX0uCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkR0byBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RHRvIEF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW0KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRHRvX0R0b0F1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlRW51bT4gZ2V0RHRvQXV0aG9yaXplZCgpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHRvIEZlYXR1cmVzPC9iPjwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlfS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkR0byBGZWF0dXJlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR0byBGZWF0dXJlczwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRHRvX0R0b0ZlYXR1cmVzKCkKKwkgKiBAbW9kZWwgY29udGFpbm1lbnQ9InRydWUiCisJICogQGdlbmVyYXRlZAorCSAqLworCUVMaXN0PFJvbGVEdG9GZWF0dXJlPiBnZXREdG9GZWF0dXJlcygpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHRvIFJlZjwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RHRvIFJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdG8gUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREdG9SZWYoTER0bykKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRHRvX0R0b1JlZigpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUxEdG8gZ2V0RHRvUmVmKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0byNnZXREdG9SZWYgPGVtPkR0byBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR0byBSZWY8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldER0b1JlZigpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RHRvUmVmKExEdG8gdmFsdWUpOworCit9IC8vIFJvbGVEdG8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRHRvQXR0cmlidXRlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b0F0dHJpYnV0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYjg4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b0F0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEdG8gQXR0cmlidXRlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvQXR0cmlidXRlI2dldER0b0F0dHJpVW5hdXRob3JpemVkIDxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUR0b0F0dHJpYnV0ZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSb2xlRHRvQXR0cmlidXRlIGV4dGVuZHMgUm9sZUR0b0ZlYXR1cmUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVEdG9BdHRyaWJ1dGVfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlUHJvcGVydHlFbnVtIGdldER0b0F0dHJpVW5hdXRob3JpemVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0F0dHJpYnV0ZSNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCA8ZW0+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bQorCSAqIEBzZWUgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIHZhbHVlKTsKKworfSAvLyBSb2xlRHRvQXR0cmlidXRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b0ZlYXR1cmUuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRHRvRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMmFlMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG9GZWF0dXJlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIER0byBGZWF0dXJlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvRmVhdHVyZSNnZXREdG9BdHRyaUNvbCA8ZW0+RHRvIEF0dHJpIENvbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVEdG9GZWF0dXJlKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvbGVEdG9GZWF0dXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RHRvIEF0dHJpIENvbDwvYj48L2VtPicgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RHRvIEF0dHJpIENvbDwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EdG8gQXR0cmkgQ29sPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNzZXREdG9BdHRyaUNvbChMRHRvRmVhdHVyZSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRHRvRmVhdHVyZV9EdG9BdHRyaUNvbCgpCisJICogQG1vZGVsCisJICogQGdlbmVyYXRlZAorCSAqLworCUxEdG9GZWF0dXJlIGdldER0b0F0dHJpQ29sKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0ZlYXR1cmUjZ2V0RHRvQXR0cmlDb2wgPGVtPkR0byBBdHRyaSBDb2w8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkR0byBBdHRyaSBDb2w8L2VtPicgcmVmZXJlbmNlLgorCSAqIEBzZWUgI2dldER0b0F0dHJpQ29sKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREdG9BdHRyaUNvbChMRHRvRmVhdHVyZSB2YWx1ZSk7CisKK30gLy8gUm9sZUR0b0ZlYXR1cmUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRHRvUmVmZXJlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b1JlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MmI4OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUR0b1JlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBEdG8gUmVmZXJlbmNlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlI2dldER0b0F0dHJpVW5hdXRob3JpemVkIDxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUR0b1JlZmVyZW5jZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSb2xlRHRvUmVmZXJlbmNlIGV4dGVuZHMgUm9sZUR0b0ZlYXR1cmUgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtKQorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVEdG9SZWZlcmVuY2VfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBtb2RlbCB1bmlxdWU9ImZhbHNlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlSb2xlUHJvcGVydHlFbnVtIGdldER0b0F0dHJpVW5hdXRob3JpemVkKCk7CisKKwkvKioKKwkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b1JlZmVyZW5jZSNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCA8ZW0+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RHRvIEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bQorCSAqIEBzZWUgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJdm9pZCBzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIHZhbHVlKTsKKworfSAvLyBSb2xlRHRvUmVmZXJlbmNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVsZW1lbnQuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTEzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRWxlbWVudDwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUVsZW1lbnQoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUVsZW1lbnQgZXh0ZW5kcyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIHsKK30gLy8gUm9sZUVsZW1lbnQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlRW50aXR5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZGJjZTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHk7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICoKKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5I2dldEVudGl0eUF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdXRob3JpemVkPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlGZWF0dXJlcyA8ZW0+RW50aXR5IEZlYXR1cmVzPC9lbT59PC9saT4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eSNnZXRFbnRpdHlSZWYgPGVtPkVudGl0eSBSZWY8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRW50aXR5KCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgaW50ZXJmYWNlIFJvbGVFbnRpdHkgZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJLyoqCisJICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IEF1dGhvcml6ZWQ8L2I+PC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudW19LgorCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24ge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgQXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUgbGlzdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBBdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUVudGl0eV9FbnRpdHlBdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJRUxpc3Q8Um9sZUVudW0+IGdldEVudGl0eUF1dGhvcml6ZWQoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBGZWF0dXJlczwvYj48L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RmVhdHVyZX0uCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHkgRmVhdHVyZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgRmVhdHVyZXM8L2VtPicgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUVudGl0eV9FbnRpdHlGZWF0dXJlcygpCisJICogQG1vZGVsIGNvbnRhaW5tZW50PSJ0cnVlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlFTGlzdDxSb2xlRW50aXR5RmVhdHVyZT4gZ2V0RW50aXR5RmVhdHVyZXMoKTsKKworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBSZWY8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlZjwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RW50aXR5UmVmKExFbnRpdHkpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUVudGl0eV9FbnRpdHlSZWYoKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMRW50aXR5IGdldEVudGl0eVJlZigpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkjZ2V0RW50aXR5UmVmIDxlbT5FbnRpdHkgUmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFbnRpdHlSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwl2b2lkIHNldEVudGl0eVJlZihMRW50aXR5IHZhbHVlKTsKKworfSAvLyBSb2xlRW50aXR5CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudGl0eUF0dHJpYnV0ZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY4NmFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlBdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5IEF0dHJpYnV0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZSNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA8ZW0+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVFbnRpdHlBdHRyaWJ1dGUoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUVudGl0eUF0dHJpYnV0ZSBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtCisJICogQHNlZSAjc2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRW50aXR5QXR0cmlidXRlX0VudGl0eUF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZVByb3BlcnR5RW51bSBnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGUjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSB2YWx1ZSk7CisKK30gLy8gUm9sZUVudGl0eUF0dHJpYnV0ZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlGZWF0dXJlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudGl0eUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTY4ODNlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5RmVhdHVyZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBFbnRpdHkgRmVhdHVyZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUZlYXR1cmUjZ2V0RW50aXR5QXR0cmlDb2wgPGVtPkVudGl0eSBBdHRyaSBDb2w8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRW50aXR5RmVhdHVyZSgpCisgKiBAbW9kZWwKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGludGVyZmFjZSBSb2xlRW50aXR5RmVhdHVyZSBleHRlbmRzIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eSBBdHRyaSBDb2w8L2I+PC9lbT4nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBBdHRyaSBDb2w8L2VtPicgcmVmZXJlbmNlIGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IEF0dHJpIENvbDwvZW0+JyByZWZlcmVuY2UuCisJICogQHNlZSAjc2V0RW50aXR5QXR0cmlDb2woTEVudGl0eUZlYXR1cmUpCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZ2V0Um9sZUVudGl0eUZlYXR1cmVfRW50aXR5QXR0cmlDb2woKQorCSAqIEBtb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlMRW50aXR5RmVhdHVyZSBnZXRFbnRpdHlBdHRyaUNvbCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlGZWF0dXJlI2dldEVudGl0eUF0dHJpQ29sIDxlbT5FbnRpdHkgQXR0cmkgQ29sPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gdmFsdWUgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgQXR0cmkgQ29sPC9lbT4nIHJlZmVyZW5jZS4KKwkgKiBAc2VlICNnZXRFbnRpdHlBdHRyaUNvbCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW50aXR5QXR0cmlDb2woTEVudGl0eUZlYXR1cmUgdmFsdWUpOworCit9IC8vIFJvbGVFbnRpdHlGZWF0dXJlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudGl0eVJlZmVyZW5jZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlSZWZlcmVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2FlOWJmCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnRpdHlSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA8ZW0+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVFbnRpdHlSZWZlcmVuY2UoKQorICogQG1vZGVsCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm9sZUVudGl0eVJlZmVyZW5jZSBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJlIHsKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCisJICogVGhlIGxpdGVyYWxzIGFyZSBmcm9tIHRoZSBlbnVtZXJhdGlvbiB7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW19LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IEF0dHJpIFVuYXV0aG9yaXplZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT4nIGF0dHJpYnV0ZS4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtCisJICogQHNlZSAjc2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSkKKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlRW50aXR5UmVmZXJlbmNlX0VudGl0eUF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAbW9kZWwgdW5pcXVlPSJmYWxzZSIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJUm9sZVByb3BlcnR5RW51bSBnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpOworCisJLyoqCisJICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB2YWx1ZSB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPicgYXR0cmlidXRlLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KKwkgKiBAc2VlICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqLworCXZvaWQgc2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoUm9sZVByb3BlcnR5RW51bSB2YWx1ZSk7CisKK30gLy8gUm9sZUVudGl0eVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZUVudW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUyMDk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1JvbGVFbnVtLmphdmEKQEAgLTAsMCArMSwyOTcgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FbnVtZXJhdG9yOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5Sb2xlIEVudW08L2I+PC9lbT4nLAorICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlI2dldFJvbGVFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBSb2xlRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0b3IgeworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTllfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlBTlkoMCwgImFueSIsICJhbnkiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPkNyZWF0YWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDUkVBVEFCTEVfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlDUkVBVEFCTEUoMCwgImNyZWF0YWJsZSIsICJjcmVhdGFibGUiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPlJlYWRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI1JFQURBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJUkVBREFCTEUoMCwgInJlYWRhYmxlIiwgInJlYWRhYmxlIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVVBEQVRBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJVVBEQVRBQkxFKDAsICJ1cGRhdGFibGUiLCAidXBkYXRhYmxlIiksCisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EZWxldGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjREVMRVRBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJREVMRVRBQkxFKDAsICJkZWxldGFibGUiLCAiZGVsZXRhYmxlIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5Bbnk8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkFueTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNBTlkKKwkgKiBAbW9kZWwgbmFtZT0iYW55IgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFOWV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5DcmVhdGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNyZWF0YWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNDUkVBVEFCTEUKKwkgKiBAbW9kZWwgbmFtZT0iY3JlYXRhYmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENSRUFUQUJMRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5SZWFkYWJsZTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+UmVhZGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjUkVBREFCTEUKKwkgKiBAbW9kZWwgbmFtZT0icmVhZGFibGUiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVBREFCTEVfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+VXBkYXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VcGRhdGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjVVBEQVRBQkxFCisJICogQG1vZGVsIG5hbWU9InVwZGF0YWJsZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEFCTEVfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+RGVsZXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPHA+CisJICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5EZWxldGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjREVMRVRBQkxFCisJICogQG1vZGVsIG5hbWU9ImRlbGV0YWJsZSIKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUxFVEFCTEVfVkFMVUUgPSAwOworCisJLyoqCisJICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPlJvbGUgRW51bTwvYj48L2VtPicgZW51bWVyYXRvcnMuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUm9sZUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgUm9sZUVudW1bXSB7CisJCQlBTlksCisJCQlDUkVBVEFCTEUsCisJCQlSRUFEQUJMRSwKKwkJCVVQREFUQUJMRSwKKwkJCURFTEVUQUJMRSwKKwkJfTsKKworCS8qKgorCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5Sb2xlIEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxSb2xlRW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Sb2xlIEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSb2xlRW51bSBnZXQoU3RyaW5nIGxpdGVyYWwpIHsKKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKKwkJCVJvbGVFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobGl0ZXJhbCkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUm9sZUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSb2xlRW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+Um9sZSBFbnVtPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHZhbHVlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgUm9sZUVudW0gZ2V0KGludCB2YWx1ZSkgeworCQlzd2l0Y2ggKHZhbHVlKSB7CisJCQljYXNlIEFOWV9WQUxVRTogcmV0dXJuIEFOWTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIGludCB2YWx1ZTsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBsaXRlcmFsOworCisJLyoqCisJICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgUm9sZUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vUm9sZUVudW0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9Sb2xlUHJvcGVydHlFbnVtLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZVByb3BlcnR5RW51bS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjFkMmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvUm9sZVByb3BlcnR5RW51bS5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+Um9sZSBQcm9wZXJ0eSBFbnVtPC9iPjwvZW0+JywKKyAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSNnZXRSb2xlUHJvcGVydHlFbnVtKCkKKyAqIEBtb2RlbAorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgZW51bSBSb2xlUHJvcGVydHlFbnVtIGltcGxlbWVudHMgRW51bWVyYXRvciB7CisJLyoqCisJICogVGhlICc8ZW0+PGI+SW52aXNpYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI0lOVklTSUJMRV9WQUxVRQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCUlOVklTSUJMRSgwLCAiaW52aXNpYmxlIiwgImludmlzaWJsZSIpLAorCisJLyoqCisJICogVGhlICc8ZW0+PGI+RGlzYWJsZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRElTQUJMRURfVkFMVUUKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlESVNBQkxFRCgwLCAiZGlzYWJsZWQiLCAiZGlzYWJsZWQiKSwKKworCS8qKgorCSAqIFRoZSAnPGVtPjxiPk5vbmVkaXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVESVRBQkxFX1ZBTFVFCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJTk9ORURJVEFCTEUoMCwgIm5vbmVkaXRhYmxlIiwgIm5vbmVkaXRhYmxlIik7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5JbnZpc2libGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkludmlzaWJsZTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QgY2xlYXIsCisJICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgorCSAqIDwvcD4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNJTlZJU0lCTEUKKwkgKiBAbW9kZWwgbmFtZT0iaW52aXNpYmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVklTSUJMRV9WQUxVRSA9IDA7CisKKwkvKioKKwkgKiBUaGUgJzxlbT48Yj5EaXNhYmxlZDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDxwPgorCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RGlzYWJsZWQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0IGNsZWFyLAorCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KKwkgKiA8L3A+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjRElTQUJMRUQKKwkgKiBAbW9kZWwgbmFtZT0iZGlzYWJsZWQiCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRElTQUJMRURfVkFMVUUgPSAwOworCisJLyoqCisJICogVGhlICc8ZW0+PGI+Tm9uZWRpdGFibGU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8cD4KKwkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5vbmVkaXRhYmxlPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKKwkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCisJICogPC9wPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI05PTkVESVRBQkxFCisJICogQG1vZGVsIG5hbWU9Im5vbmVkaXRhYmxlIgorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkVESVRBQkxFX1ZBTFVFID0gMDsKKworCS8qKgorCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5Sb2xlIFByb3BlcnR5IEVudW08L2I+PC9lbT4nIGVudW1lcmF0b3JzLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgc3RhdGljIGZpbmFsIFJvbGVQcm9wZXJ0eUVudW1bXSBWQUxVRVNfQVJSQVkgPQorCQluZXcgUm9sZVByb3BlcnR5RW51bVtdIHsKKwkJCUlOVklTSUJMRSwKKwkJCURJU0FCTEVELAorCQkJTk9ORURJVEFCTEUsCisJCX07CisKKwkvKioKKwkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+Um9sZSBQcm9wZXJ0eSBFbnVtPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8Um9sZVByb3BlcnR5RW51bT4gVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOworCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Sb2xlIFByb3BlcnR5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGxpdGVyYWwgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSb2xlUHJvcGVydHlFbnVtIGdldChTdHJpbmcgbGl0ZXJhbCkgeworCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgeworCQkJUm9sZVByb3BlcnR5RW51bSByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07CisJCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKGxpdGVyYWwpKSB7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPlJvbGUgUHJvcGVydHkgRW51bTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisJCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7CisJCQlSb2xlUHJvcGVydHlFbnVtIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKKwkJCWlmIChyZXN1bHQuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgeworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgJzxlbT48Yj5Sb2xlIFByb3BlcnR5IEVudW08L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHN0YXRpYyBSb2xlUHJvcGVydHlFbnVtIGdldChpbnQgdmFsdWUpIHsKKwkJc3dpdGNoICh2YWx1ZSkgeworCQkJY2FzZSBJTlZJU0lCTEVfVkFMVUU6IHJldHVybiBJTlZJU0lCTEU7CisJCX0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBpbnQgdmFsdWU7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGl0ZXJhbDsKKworCS8qKgorCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIFJvbGVQcm9wZXJ0eUVudW0oaW50IHZhbHVlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGxpdGVyYWwpIHsKKwkJdGhpcy52YWx1ZSA9IHZhbHVlOworCQl0aGlzLm5hbWUgPSBuYW1lOworCQl0aGlzLmxpdGVyYWwgPSBsaXRlcmFsOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisJICByZXR1cm4gdmFsdWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworCSAgcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBnZXRMaXRlcmFsKCkgeworCSAgcmV0dXJuIGxpdGVyYWw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgbGl0ZXJhbCB2YWx1ZSBvZiB0aGUgZW51bWVyYXRvciwgd2hpY2ggaXMgaXRzIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlyZXR1cm4gbGl0ZXJhbDsKKwl9CisJCit9IC8vUm9sZVByb3BlcnR5RW51bQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbkJhc2VJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9BdXRob3JpemF0aW9uQmFzZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAyZTg5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbkJhc2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uQmFzZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdXRob3JpemF0aW9uIEJhc2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25CYXNlSW1wbCNnZXROYW1lIDxlbT5OYW1lPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkJhc2VJbXBsIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBBdXRob3JpemF0aW9uQmFzZSB7CisJLyoqCisJICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldE5hbWUoKSA8ZW0+TmFtZTwvZW0+fScgYXR0cmlidXRlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0TmFtZSgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRV9FREVGQVVMVCA9IG51bGw7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXROYW1lKCkgPGVtPk5hbWU8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldE5hbWUoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBTdHJpbmcgbmFtZSA9IE5BTUVfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXV0aG9yaXphdGlvbkJhc2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuQVVUSE9SSVpBVElPTl9CQVNFOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKwkJcmV0dXJuIG5hbWU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmV3TmFtZSkgeworCQlTdHJpbmcgb2xkTmFtZSA9IG5hbWU7CisJCW5hbWUgPSBuZXdOYW1lOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX0JBU0VfX05BTUUsIG9sZE5hbWUsIG5hbWUpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fQkFTRV9fTkFNRToKKwkJCQlyZXR1cm4gZ2V0TmFtZSgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fQkFTRV9fTkFNRToKKwkJCQlzZXROYW1lKChTdHJpbmcpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fQkFTRV9fTkFNRToKKwkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX0JBU0VfX05BTUU6CisJCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKG5hbWU6ICIpOworCQlyZXN1bHQuYXBwZW5kKG5hbWUpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9BdXRob3JpemF0aW9uQmFzZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL0F1dGhvcml6YXRpb25EU0xGYWN0b3J5SW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbkRTTEZhY3RvcnlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmMTg3OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL0F1dGhvcml6YXRpb25EU0xGYWN0b3J5SW1wbC5qYXZhCkBAIC0wLDAgKzEsNDczIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucGx1Z2luLkVjb3JlUGx1Z2luOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLio7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCA8Yj5GYWN0b3J5PC9iPi4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTEZhY3RvcnlJbXBsIGV4dGVuZHMgRUZhY3RvcnlJbXBsIGltcGxlbWVudHMgQXV0aG9yaXphdGlvbkRTTEZhY3RvcnkgeworCS8qKgorCSAqIENyZWF0ZXMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgc3RhdGljIEF1dGhvcml6YXRpb25EU0xGYWN0b3J5IGluaXQoKSB7CisJCXRyeSB7CisJCQlBdXRob3JpemF0aW9uRFNMRmFjdG9yeSB0aGVBdXRob3JpemF0aW9uRFNMRmFjdG9yeSA9IChBdXRob3JpemF0aW9uRFNMRmFjdG9yeSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFRmFjdG9yeShBdXRob3JpemF0aW9uRFNMUGFja2FnZS5lTlNfVVJJKTsKKwkJCWlmICh0aGVBdXRob3JpemF0aW9uRFNMRmFjdG9yeSAhPSBudWxsKSB7CisJCQkJcmV0dXJuIHRoZUF1dGhvcml6YXRpb25EU0xGYWN0b3J5OworCQkJfQorCQl9CisJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisJCQlFY29yZVBsdWdpbi5JTlNUQU5DRS5sb2coZXhjZXB0aW9uKTsKKwkJfQorCQlyZXR1cm4gbmV3IEF1dGhvcml6YXRpb25EU0xGYWN0b3J5SW1wbCgpOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGZhY3RvcnkuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dGhvcml6YXRpb25EU0xGYWN0b3J5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgeworCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX01PREVMOiByZXR1cm4gY3JlYXRlQXV0aG9yaXphdGlvbk1vZGVsKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUjogcmV0dXJuIGNyZWF0ZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9QQUNLQUdFOiByZXR1cm4gY3JlYXRlQXV0aG9yaXphdGlvblBhY2thZ2UoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9CQVNFOiByZXR1cm4gY3JlYXRlQXV0aG9yaXphdGlvbkJhc2UoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRTogcmV0dXJuIGNyZWF0ZVJvbGUoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTEVNRU5UOiByZXR1cm4gY3JlYXRlUm9sZUVsZW1lbnQoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFk6IHJldHVybiBjcmVhdGVSb2xlRW50aXR5KCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTjogcmV0dXJuIGNyZWF0ZVJvbGVCZWFuKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPOiByZXR1cm4gY3JlYXRlUm9sZUR0bygpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1M6IHJldHVybiBjcmVhdGVSb2xlQmxpcEFsbFVzZXJUYXNrcygpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLOiByZXR1cm4gY3JlYXRlUm9sZUJsaXBVc2VyVGFzaygpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTUzogcmV0dXJuIGNyZWF0ZVJvbGVCbGlwUHJvY2VzcygpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9GRUFUVVJFOiByZXR1cm4gY3JlYXRlUm9sZUVudGl0eUZlYXR1cmUoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfQVRUUklCVVRFOiByZXR1cm4gY3JlYXRlUm9sZUVudGl0eUF0dHJpYnV0ZSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9SRUZFUkVOQ0U6IHJldHVybiBjcmVhdGVSb2xlRW50aXR5UmVmZXJlbmNlKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9GRUFUVVJFOiByZXR1cm4gY3JlYXRlUm9sZUJlYW5GZWF0dXJlKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9BVFRSSUJVVEU6IHJldHVybiBjcmVhdGVSb2xlQmVhbkF0dHJpYnV0ZSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fUkVGRVJFTkNFOiByZXR1cm4gY3JlYXRlUm9sZUJlYW5SZWZlcmVuY2UoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fRkVBVFVSRTogcmV0dXJuIGNyZWF0ZVJvbGVEdG9GZWF0dXJlKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0FUVFJJQlVURTogcmV0dXJuIGNyZWF0ZVJvbGVEdG9BdHRyaWJ1dGUoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fUkVGRVJFTkNFOiByZXR1cm4gY3JlYXRlUm9sZUR0b1JlZmVyZW5jZSgpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY2xhc3MgJyIgKyBlQ2xhc3MuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBjcmVhdGVGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlVNOgorCQkJCXJldHVybiBjcmVhdGVSb2xlRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX1BST1BFUlRZX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVQcm9wZXJ0eUVudW1Gcm9tU3RyaW5nKGVEYXRhVHlwZSwgaW5pdGlhbFZhbHVlKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfRU5VTToKKwkJCQlyZXR1cm4gY3JlYXRlUm9sZUJsaXBQcm9jZXNzRW51bUZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLX0VOVU06CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVCbGlwVXNlclRhc2tFbnVtRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNyZWF0ZUludGVybmFsRU9iamVjdEZyb21TdHJpbmcoZURhdGFUeXBlLCBpbml0aWFsVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlVNOgorCQkJCXJldHVybiBjb252ZXJ0Um9sZUVudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX1BST1BFUlRZX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRSb2xlUHJvcGVydHlFbnVtVG9TdHJpbmcoZURhdGFUeXBlLCBpbnN0YW5jZVZhbHVlKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfRU5VTToKKwkJCQlyZXR1cm4gY29udmVydFJvbGVCbGlwUHJvY2Vzc0VudW1Ub1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLX0VOVU06CisJCQkJcmV0dXJuIGNvbnZlcnRSb2xlQmxpcFVzZXJUYXNrRW51bVRvU3RyaW5nKGVEYXRhVHlwZSwgaW5zdGFuY2VWYWx1ZSk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLklOVEVSTkFMX0VPQkpFQ1Q6CisJCQkJcmV0dXJuIGNvbnZlcnRJbnRlcm5hbEVPYmplY3RUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCQkJZGVmYXVsdDoKKwkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgZGF0YXR5cGUgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIicgaXMgbm90IGEgdmFsaWQgY2xhc3NpZmllciIpOworCQl9CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dGhvcml6YXRpb25Nb2RlbCBjcmVhdGVBdXRob3JpemF0aW9uTW9kZWwoKSB7CisJCUF1dGhvcml6YXRpb25Nb2RlbEltcGwgYXV0aG9yaXphdGlvbk1vZGVsID0gbmV3IEF1dGhvcml6YXRpb25Nb2RlbEltcGwoKTsKKwkJcmV0dXJuIGF1dGhvcml6YXRpb25Nb2RlbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciBjcmVhdGVBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKCkgeworCQlBdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbCBhdXRob3JpemF0aW9uTGF6eVJlc29sdmVyID0gbmV3IEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJJbXBsKCk7CisJCXJldHVybiBhdXRob3JpemF0aW9uTGF6eVJlc29sdmVyOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBdXRob3JpemF0aW9uUGFja2FnZSBjcmVhdGVBdXRob3JpemF0aW9uUGFja2FnZSgpIHsKKwkJQXV0aG9yaXphdGlvblBhY2thZ2VJbXBsIGF1dGhvcml6YXRpb25QYWNrYWdlID0gbmV3IEF1dGhvcml6YXRpb25QYWNrYWdlSW1wbCgpOworCQlyZXR1cm4gYXV0aG9yaXphdGlvblBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dGhvcml6YXRpb25CYXNlIGNyZWF0ZUF1dGhvcml6YXRpb25CYXNlKCkgeworCQlBdXRob3JpemF0aW9uQmFzZUltcGwgYXV0aG9yaXphdGlvbkJhc2UgPSBuZXcgQXV0aG9yaXphdGlvbkJhc2VJbXBsKCk7CisJCXJldHVybiBhdXRob3JpemF0aW9uQmFzZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZSBjcmVhdGVSb2xlKCkgeworCQlSb2xlSW1wbCByb2xlID0gbmV3IFJvbGVJbXBsKCk7CisJCXJldHVybiByb2xlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlRWxlbWVudCBjcmVhdGVSb2xlRWxlbWVudCgpIHsKKwkJUm9sZUVsZW1lbnRJbXBsIHJvbGVFbGVtZW50ID0gbmV3IFJvbGVFbGVtZW50SW1wbCgpOworCQlyZXR1cm4gcm9sZUVsZW1lbnQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVFbnRpdHkgY3JlYXRlUm9sZUVudGl0eSgpIHsKKwkJUm9sZUVudGl0eUltcGwgcm9sZUVudGl0eSA9IG5ldyBSb2xlRW50aXR5SW1wbCgpOworCQlyZXR1cm4gcm9sZUVudGl0eTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJlYW4gY3JlYXRlUm9sZUJlYW4oKSB7CisJCVJvbGVCZWFuSW1wbCByb2xlQmVhbiA9IG5ldyBSb2xlQmVhbkltcGwoKTsKKwkJcmV0dXJuIHJvbGVCZWFuOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlRHRvIGNyZWF0ZVJvbGVEdG8oKSB7CisJCVJvbGVEdG9JbXBsIHJvbGVEdG8gPSBuZXcgUm9sZUR0b0ltcGwoKTsKKwkJcmV0dXJuIHJvbGVEdG87CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVCbGlwQWxsVXNlclRhc2tzIGNyZWF0ZVJvbGVCbGlwQWxsVXNlclRhc2tzKCkgeworCQlSb2xlQmxpcEFsbFVzZXJUYXNrc0ltcGwgcm9sZUJsaXBBbGxVc2VyVGFza3MgPSBuZXcgUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsKCk7CisJCXJldHVybiByb2xlQmxpcEFsbFVzZXJUYXNrczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJsaXBVc2VyVGFzayBjcmVhdGVSb2xlQmxpcFVzZXJUYXNrKCkgeworCQlSb2xlQmxpcFVzZXJUYXNrSW1wbCByb2xlQmxpcFVzZXJUYXNrID0gbmV3IFJvbGVCbGlwVXNlclRhc2tJbXBsKCk7CisJCXJldHVybiByb2xlQmxpcFVzZXJUYXNrOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlQmxpcFByb2Nlc3MgY3JlYXRlUm9sZUJsaXBQcm9jZXNzKCkgeworCQlSb2xlQmxpcFByb2Nlc3NJbXBsIHJvbGVCbGlwUHJvY2VzcyA9IG5ldyBSb2xlQmxpcFByb2Nlc3NJbXBsKCk7CisJCXJldHVybiByb2xlQmxpcFByb2Nlc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVFbnRpdHlGZWF0dXJlIGNyZWF0ZVJvbGVFbnRpdHlGZWF0dXJlKCkgeworCQlSb2xlRW50aXR5RmVhdHVyZUltcGwgcm9sZUVudGl0eUZlYXR1cmUgPSBuZXcgUm9sZUVudGl0eUZlYXR1cmVJbXBsKCk7CisJCXJldHVybiByb2xlRW50aXR5RmVhdHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUVudGl0eUF0dHJpYnV0ZSBjcmVhdGVSb2xlRW50aXR5QXR0cmlidXRlKCkgeworCQlSb2xlRW50aXR5QXR0cmlidXRlSW1wbCByb2xlRW50aXR5QXR0cmlidXRlID0gbmV3IFJvbGVFbnRpdHlBdHRyaWJ1dGVJbXBsKCk7CisJCXJldHVybiByb2xlRW50aXR5QXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlRW50aXR5UmVmZXJlbmNlIGNyZWF0ZVJvbGVFbnRpdHlSZWZlcmVuY2UoKSB7CisJCVJvbGVFbnRpdHlSZWZlcmVuY2VJbXBsIHJvbGVFbnRpdHlSZWZlcmVuY2UgPSBuZXcgUm9sZUVudGl0eVJlZmVyZW5jZUltcGwoKTsKKwkJcmV0dXJuIHJvbGVFbnRpdHlSZWZlcmVuY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVCZWFuRmVhdHVyZSBjcmVhdGVSb2xlQmVhbkZlYXR1cmUoKSB7CisJCVJvbGVCZWFuRmVhdHVyZUltcGwgcm9sZUJlYW5GZWF0dXJlID0gbmV3IFJvbGVCZWFuRmVhdHVyZUltcGwoKTsKKwkJcmV0dXJuIHJvbGVCZWFuRmVhdHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJlYW5BdHRyaWJ1dGUgY3JlYXRlUm9sZUJlYW5BdHRyaWJ1dGUoKSB7CisJCVJvbGVCZWFuQXR0cmlidXRlSW1wbCByb2xlQmVhbkF0dHJpYnV0ZSA9IG5ldyBSb2xlQmVhbkF0dHJpYnV0ZUltcGwoKTsKKwkJcmV0dXJuIHJvbGVCZWFuQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlQmVhblJlZmVyZW5jZSBjcmVhdGVSb2xlQmVhblJlZmVyZW5jZSgpIHsKKwkJUm9sZUJlYW5SZWZlcmVuY2VJbXBsIHJvbGVCZWFuUmVmZXJlbmNlID0gbmV3IFJvbGVCZWFuUmVmZXJlbmNlSW1wbCgpOworCQlyZXR1cm4gcm9sZUJlYW5SZWZlcmVuY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVEdG9GZWF0dXJlIGNyZWF0ZVJvbGVEdG9GZWF0dXJlKCkgeworCQlSb2xlRHRvRmVhdHVyZUltcGwgcm9sZUR0b0ZlYXR1cmUgPSBuZXcgUm9sZUR0b0ZlYXR1cmVJbXBsKCk7CisJCXJldHVybiByb2xlRHRvRmVhdHVyZTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUR0b0F0dHJpYnV0ZSBjcmVhdGVSb2xlRHRvQXR0cmlidXRlKCkgeworCQlSb2xlRHRvQXR0cmlidXRlSW1wbCByb2xlRHRvQXR0cmlidXRlID0gbmV3IFJvbGVEdG9BdHRyaWJ1dGVJbXBsKCk7CisJCXJldHVybiByb2xlRHRvQXR0cmlidXRlOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlRHRvUmVmZXJlbmNlIGNyZWF0ZVJvbGVEdG9SZWZlcmVuY2UoKSB7CisJCVJvbGVEdG9SZWZlcmVuY2VJbXBsIHJvbGVEdG9SZWZlcmVuY2UgPSBuZXcgUm9sZUR0b1JlZmVyZW5jZUltcGwoKTsKKwkJcmV0dXJuIHJvbGVEdG9SZWZlcmVuY2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVFbnVtIGNyZWF0ZVJvbGVFbnVtRnJvbVN0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBTdHJpbmcgaW5pdGlhbFZhbHVlKSB7CisJCVJvbGVFbnVtIHJlc3VsdCA9IFJvbGVFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSb2xlRW51bVRvU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIE9iamVjdCBpbnN0YW5jZVZhbHVlKSB7CisJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlUHJvcGVydHlFbnVtIGNyZWF0ZVJvbGVQcm9wZXJ0eUVudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJUm9sZVByb3BlcnR5RW51bSByZXN1bHQgPSBSb2xlUHJvcGVydHlFbnVtLmdldChpbml0aWFsVmFsdWUpOworCQlpZiAocmVzdWx0ID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSB2YWx1ZSAnIiArIGluaXRpYWxWYWx1ZSArICInIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3Igb2YgJyIgKyBlRGF0YVR5cGUuZ2V0TmFtZSgpICsgIiciKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgU3RyaW5nIGNvbnZlcnRSb2xlUHJvcGVydHlFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVCbGlwUHJvY2Vzc0VudW0gY3JlYXRlUm9sZUJsaXBQcm9jZXNzRW51bUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgeworCQlSb2xlQmxpcFByb2Nlc3NFbnVtIHJlc3VsdCA9IFJvbGVCbGlwUHJvY2Vzc0VudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVCbGlwUHJvY2Vzc0VudW1Ub1N0cmluZyhFRGF0YVR5cGUgZURhdGFUeXBlLCBPYmplY3QgaW5zdGFuY2VWYWx1ZSkgeworCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJsaXBVc2VyVGFza0VudW0gY3JlYXRlUm9sZUJsaXBVc2VyVGFza0VudW1Gcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJUm9sZUJsaXBVc2VyVGFza0VudW0gcmVzdWx0ID0gUm9sZUJsaXBVc2VyVGFza0VudW0uZ2V0KGluaXRpYWxWYWx1ZSk7CisJCWlmIChyZXN1bHQgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHZhbHVlICciICsgaW5pdGlhbFZhbHVlICsgIicgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBvZiAnIiArIGVEYXRhVHlwZS5nZXROYW1lKCkgKyAiJyIpOworCQlyZXR1cm4gcmVzdWx0OworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBTdHJpbmcgY29udmVydFJvbGVCbGlwVXNlclRhc2tFbnVtVG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEludGVybmFsRU9iamVjdCBjcmVhdGVJbnRlcm5hbEVPYmplY3RGcm9tU3RyaW5nKEVEYXRhVHlwZSBlRGF0YVR5cGUsIFN0cmluZyBpbml0aWFsVmFsdWUpIHsKKwkJcmV0dXJuIChJbnRlcm5hbEVPYmplY3Qpc3VwZXIuY3JlYXRlRnJvbVN0cmluZyhlRGF0YVR5cGUsIGluaXRpYWxWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFN0cmluZyBjb252ZXJ0SW50ZXJuYWxFT2JqZWN0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKKwkJcmV0dXJuIHN1cGVyLmNvbnZlcnRUb1N0cmluZyhlRGF0YVR5cGUsIGluc3RhbmNlVmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBdXRob3JpemF0aW9uRFNMUGFja2FnZSBnZXRBdXRob3JpemF0aW9uRFNMUGFja2FnZSgpIHsKKwkJcmV0dXJuIChBdXRob3JpemF0aW9uRFNMUGFja2FnZSlnZXRFUGFja2FnZSgpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGRlcHJlY2F0ZWQKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQERlcHJlY2F0ZWQKKwlwdWJsaWMgc3RhdGljIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlIGdldFBhY2thZ2UoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5lSU5TVEFOQ0U7CisJfQorCit9IC8vQXV0aG9yaXphdGlvbkRTTEZhY3RvcnlJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL0F1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMjQxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9BdXRob3JpemF0aW9uRFNMUGFja2FnZUltcGwuamF2YQpAQCAtMCwwICsxLDExMDkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5PU0JQVHlwZXNQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLk9TQlBEdG9QYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5Lk9TQlBFbnRpdHlQYWNrYWdlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25CYXNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG87CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRWxlbWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXBEU0xQYWNrYWdlOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4uCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlIHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhdXRob3JpemF0aW9uTW9kZWxFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3MgYXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhdXRob3JpemF0aW9uUGFja2FnZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyBhdXRob3JpemF0aW9uQmFzZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2xlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVFbGVtZW50RUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVFbnRpdHlFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgcm9sZUJlYW5FQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgcm9sZUR0b0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2xlQmxpcEFsbFVzZXJUYXNrc0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2xlQmxpcFVzZXJUYXNrRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVCbGlwUHJvY2Vzc0VDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2xlRW50aXR5RmVhdHVyZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVDbGFzcyByb2xlRW50aXR5QXR0cmlidXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgcm9sZUJlYW5GZWF0dXJlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVCZWFuQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVCZWFuUmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVEdG9GZWF0dXJlRUNsYXNzID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRUNsYXNzIHJvbGVEdG9BdHRyaWJ1dGVFQ2xhc3MgPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFQ2xhc3Mgcm9sZUR0b1JlZmVyZW5jZUVDbGFzcyA9IG51bGw7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEVFbnVtIHJvbGVFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSByb2xlUHJvcGVydHlFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSByb2xlQmxpcFByb2Nlc3NFbnVtRUVudW0gPSBudWxsOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJpdmF0ZSBFRW51bSByb2xlQmxpcFVzZXJUYXNrRW51bUVFbnVtID0gbnVsbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgRURhdGFUeXBlIGludGVybmFsRU9iamVjdEVEYXRhVHlwZSA9IG51bGw7CisKKwkvKioKKwkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBtb2RlbCA8Yj5QYWNrYWdlPC9iPiwgcmVnaXN0ZXJlZCB3aXRoCisJICoge0BsaW5rIG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZS5SZWdpc3RyeSBFUGFja2FnZS5SZWdpc3RyeX0gYnkgdGhlIHBhY2thZ2UKKwkgKiBwYWNrYWdlIFVSSSB2YWx1ZS4KKwkgKiA8cD5Ob3RlOiB0aGUgY29ycmVjdCB3YXkgdG8gY3JlYXRlIHRoZSBwYWNrYWdlIGlzIHZpYSB0aGUgc3RhdGljCisJICogZmFjdG9yeSBtZXRob2Qge0BsaW5rICNpbml0IGluaXQoKX0sIHdoaWNoIGFsc28gcGVyZm9ybXMKKwkgKiBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFja2FnZSwgb3IgcmV0dXJucyB0aGUgcmVnaXN0ZXJlZCBwYWNrYWdlLAorCSAqIGlmIG9uZSBhbHJlYWR5IGV4aXN0cy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5CisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UjZU5TX1VSSQorCSAqIEBzZWUgI2luaXQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCgpIHsKKwkJc3VwZXIoZU5TX1VSSSwgQXV0aG9yaXphdGlvbkRTTEZhY3RvcnkuZUlOU1RBTkNFKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSW5pdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsIGFuZCBmb3IgYW55IG90aGVycyB1cG9uIHdoaWNoIGl0IGRlcGVuZHMuCisJICogCisJICogPHA+VGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbml0aWFsaXplIHtAbGluayBBdXRob3JpemF0aW9uRFNMUGFja2FnZSNlSU5TVEFOQ0V9IHdoZW4gdGhhdCBmaWVsZCBpcyBhY2Nlc3NlZC4KKwkgKiBDbGllbnRzIHNob3VsZCBub3QgaW52b2tlIGl0IGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGV5IHNob3VsZCBzaW1wbHkgYWNjZXNzIHRoYXQgZmllbGQgdG8gb2J0YWluIHRoZSBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZU5TX1VSSQorCSAqIEBzZWUgI2NyZWF0ZVBhY2thZ2VDb250ZW50cygpCisJICogQHNlZSAjaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBzdGF0aWMgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UgaW5pdCgpIHsKKwkJaWYgKGlzSW5pdGVkKSByZXR1cm4gKEF1dGhvcml6YXRpb25EU0xQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVOU19VUkkpOworCisJCS8vIE9idGFpbiBvciBjcmVhdGUgYW5kIHJlZ2lzdGVyIHBhY2thZ2UKKwkJQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsIHRoZUF1dGhvcml6YXRpb25EU0xQYWNrYWdlID0gKEF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCkoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIGluc3RhbmNlb2YgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IEF1dGhvcml6YXRpb25EU0xQYWNrYWdlSW1wbCgpKTsKKworCQlpc0luaXRlZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBzaW1wbGUgZGVwZW5kZW5jaWVzCisJCU9TQlBFbnRpdHlQYWNrYWdlLmVJTlNUQU5DRS5lQ2xhc3MoKTsKKwkJQmxpcERTTFBhY2thZ2UuZUlOU1RBTkNFLmVDbGFzcygpOworCisJCS8vIENyZWF0ZSBwYWNrYWdlIG1ldGEtZGF0YSBvYmplY3RzCisJCXRoZUF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIEluaXRpYWxpemUgY3JlYXRlZCBtZXRhLWRhdGEKKwkJdGhlQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpOworCisJCS8vIE1hcmsgbWV0YS1kYXRhIHRvIGluZGljYXRlIGl0IGNhbid0IGJlIGNoYW5nZWQKKwkJdGhlQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuZnJlZXplKCk7CisKKyAgCisJCS8vIFVwZGF0ZSB0aGUgcmVnaXN0cnkgYW5kIHJldHVybiB0aGUgcGFja2FnZQorCQlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5wdXQoQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuZU5TX1VSSSwgdGhlQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UpOworCQlyZXR1cm4gdGhlQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBdXRob3JpemF0aW9uTW9kZWwoKSB7CisJCXJldHVybiBhdXRob3JpemF0aW9uTW9kZWxFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0QXV0aG9yaXphdGlvbk1vZGVsX1Bja2coKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlhdXRob3JpemF0aW9uTW9kZWxFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoKSB7CisJCXJldHVybiBhdXRob3JpemF0aW9uTGF6eVJlc29sdmVyRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFT3BlcmF0aW9uIGdldEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJfX0VSZXNvbHZlUHJveHlfX0ludGVybmFsRU9iamVjdCgpIHsKKwkJcmV0dXJuIGF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJFQ2xhc3MuZ2V0RU9wZXJhdGlvbnMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRBdXRob3JpemF0aW9uUGFja2FnZSgpIHsKKwkJcmV0dXJuIGF1dGhvcml6YXRpb25QYWNrYWdlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldEF1dGhvcml6YXRpb25QYWNrYWdlX1JvbGVzKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2UpYXV0aG9yaXphdGlvblBhY2thZ2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldEF1dGhvcml6YXRpb25CYXNlKCkgeworCQlyZXR1cm4gYXV0aG9yaXphdGlvbkJhc2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0QXV0aG9yaXphdGlvbkJhc2VfTmFtZSgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKWF1dGhvcml6YXRpb25CYXNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlKCkgeworCQlyZXR1cm4gcm9sZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlX1JvbGVFbGVtZW50cygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVFbGVtZW50KCkgeworCQlyZXR1cm4gcm9sZUVsZW1lbnRFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlRW50aXR5KCkgeworCQlyZXR1cm4gcm9sZUVudGl0eUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRW50aXR5X0VudGl0eUF1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRW50aXR5RUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUVudGl0eV9FbnRpdHlGZWF0dXJlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRW50aXR5X0VudGl0eVJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVFbnRpdHlFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVCZWFuKCkgeworCQlyZXR1cm4gcm9sZUJlYW5FQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZUJlYW5fQmVhbkF1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlQmVhbkVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVCZWFuX0JlYW5GZWF0dXJlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUJlYW5fQmVhblJlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVCZWFuRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMik7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlRHRvKCkgeworCQlyZXR1cm4gcm9sZUR0b0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRHRvX0R0b0F1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRHRvRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUR0b19EdG9GZWF0dXJlcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVEdG9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRHRvX0R0b1JlZigpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVEdG9FQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgyKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVCbGlwQWxsVXNlclRhc2tzKCkgeworCQlyZXR1cm4gcm9sZUJsaXBBbGxVc2VyVGFza3NFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NfQXV0aG9yaXplZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVCbGlwQWxsVXNlclRhc2tzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlQmxpcFVzZXJUYXNrKCkgeworCQlyZXR1cm4gcm9sZUJsaXBVc2VyVGFza0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlQmxpcFVzZXJUYXNrX1VzZXJUYXNrKCkgeworCQlyZXR1cm4gKEVSZWZlcmVuY2Upcm9sZUJsaXBVc2VyVGFza0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVCbGlwVXNlclRhc2tfQXV0aG9yaXplZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVCbGlwVXNlclRhc2tFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgxKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVCbGlwUHJvY2VzcygpIHsKKwkJcmV0dXJuIHJvbGVCbGlwUHJvY2Vzc0VDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlQmxpcFByb2Nlc3NfUHJvY2VzcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVCbGlwUHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVCbGlwUHJvY2Vzc19Qcm9jZXNzU3RhcnRBdXRob3JpemVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUJsaXBQcm9jZXNzRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUJsaXBQcm9jZXNzX0FsbFVzZXJUYXNrcygpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVCbGlwUHJvY2Vzc0VDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDIpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFUmVmZXJlbmNlIGdldFJvbGVCbGlwUHJvY2Vzc19Vc2VyVGFza3MoKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyb2xlQmxpcFByb2Nlc3NFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVFbnRpdHlGZWF0dXJlKCkgeworCQlyZXR1cm4gcm9sZUVudGl0eUZlYXR1cmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUVudGl0eUZlYXR1cmVfRW50aXR5QXR0cmlDb2woKSB7CisJCXJldHVybiAoRVJlZmVyZW5jZSlyb2xlRW50aXR5RmVhdHVyZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZSgpIHsKKwkJcmV0dXJuIHJvbGVFbnRpdHlBdHRyaWJ1dGVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZV9FbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVFbnRpdHlBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUNsYXNzIGdldFJvbGVFbnRpdHlSZWZlcmVuY2UoKSB7CisJCXJldHVybiByb2xlRW50aXR5UmVmZXJlbmNlRUNsYXNzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQXR0cmlidXRlIGdldFJvbGVFbnRpdHlSZWZlcmVuY2VfRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlRW50aXR5UmVmZXJlbmNlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlQmVhbkZlYXR1cmUoKSB7CisJCXJldHVybiByb2xlQmVhbkZlYXR1cmVFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVSZWZlcmVuY2UgZ2V0Um9sZUJlYW5GZWF0dXJlX0JlYW5BdHRyaUNvbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVCZWFuRmVhdHVyZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZUJlYW5BdHRyaWJ1dGUoKSB7CisJCXJldHVybiByb2xlQmVhbkF0dHJpYnV0ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlQmVhbkF0dHJpYnV0ZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlQmVhbkF0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZUJlYW5SZWZlcmVuY2UoKSB7CisJCXJldHVybiByb2xlQmVhblJlZmVyZW5jZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlQmVhblJlZmVyZW5jZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiAoRUF0dHJpYnV0ZSlyb2xlQmVhblJlZmVyZW5jZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZUR0b0ZlYXR1cmUoKSB7CisJCXJldHVybiByb2xlRHRvRmVhdHVyZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRVJlZmVyZW5jZSBnZXRSb2xlRHRvRmVhdHVyZV9EdG9BdHRyaUNvbCgpIHsKKwkJcmV0dXJuIChFUmVmZXJlbmNlKXJvbGVEdG9GZWF0dXJlRUNsYXNzLmdldEVTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5nZXQoMCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVDbGFzcyBnZXRSb2xlRHRvQXR0cmlidXRlKCkgeworCQlyZXR1cm4gcm9sZUR0b0F0dHJpYnV0ZUVDbGFzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUF0dHJpYnV0ZSBnZXRSb2xlRHRvQXR0cmlidXRlX0R0b0F0dHJpVW5hdXRob3JpemVkKCkgeworCQlyZXR1cm4gKEVBdHRyaWJ1dGUpcm9sZUR0b0F0dHJpYnV0ZUVDbGFzcy5nZXRFU3RydWN0dXJhbEZlYXR1cmVzKCkuZ2V0KDApOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFQ2xhc3MgZ2V0Um9sZUR0b1JlZmVyZW5jZSgpIHsKKwkJcmV0dXJuIHJvbGVEdG9SZWZlcmVuY2VFQ2xhc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVBdHRyaWJ1dGUgZ2V0Um9sZUR0b1JlZmVyZW5jZV9EdG9BdHRyaVVuYXV0aG9yaXplZCgpIHsKKwkJcmV0dXJuIChFQXR0cmlidXRlKXJvbGVEdG9SZWZlcmVuY2VFQ2xhc3MuZ2V0RVN0cnVjdHVyYWxGZWF0dXJlcygpLmdldCgwKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUVudW0gZ2V0Um9sZUVudW0oKSB7CisJCXJldHVybiByb2xlRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSb2xlUHJvcGVydHlFbnVtKCkgeworCQlyZXR1cm4gcm9sZVByb3BlcnR5RW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSb2xlQmxpcFByb2Nlc3NFbnVtKCkgeworCQlyZXR1cm4gcm9sZUJsaXBQcm9jZXNzRW51bUVFbnVtOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFRW51bSBnZXRSb2xlQmxpcFVzZXJUYXNrRW51bSgpIHsKKwkJcmV0dXJuIHJvbGVCbGlwVXNlclRhc2tFbnVtRUVudW07CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVEYXRhVHlwZSBnZXRJbnRlcm5hbEVPYmplY3QoKSB7CisJCXJldHVybiBpbnRlcm5hbEVPYmplY3RFRGF0YVR5cGU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEF1dGhvcml6YXRpb25EU0xGYWN0b3J5IGdldEF1dGhvcml6YXRpb25EU0xGYWN0b3J5KCkgeworCQlyZXR1cm4gKEF1dGhvcml6YXRpb25EU0xGYWN0b3J5KWdldEVGYWN0b3J5SW5zdGFuY2UoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gaXNDcmVhdGVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDcmVhdGVzIHRoZSBtZXRhLW1vZGVsIG9iamVjdHMgZm9yIHRoZSBwYWNrYWdlLiAgVGhpcyBtZXRob2QgaXMKKwkgKiBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgY3JlYXRlUGFja2FnZUNvbnRlbnRzKCkgeworCQlpZiAoaXNDcmVhdGVkKSByZXR1cm47CisJCWlzQ3JlYXRlZCA9IHRydWU7CisKKwkJLy8gQ3JlYXRlIGNsYXNzZXMgYW5kIHRoZWlyIGZlYXR1cmVzCisJCWF1dGhvcml6YXRpb25Nb2RlbEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIT1JJWkFUSU9OX01PREVMKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShhdXRob3JpemF0aW9uTW9kZWxFQ2xhc3MsIEFVVEhPUklaQVRJT05fTU9ERUxfX1BDS0cpOworCisJCWF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoQVVUSE9SSVpBVElPTl9MQVpZX1JFU09MVkVSKTsKKwkJY3JlYXRlRU9wZXJhdGlvbihhdXRob3JpemF0aW9uTGF6eVJlc29sdmVyRUNsYXNzLCBBVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVJfX19FUkVTT0xWRV9QUk9YWV9fSU5URVJOQUxFT0JKRUNUKTsKKworCQlhdXRob3JpemF0aW9uUGFja2FnZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIT1JJWkFUSU9OX1BBQ0tBR0UpOworCQljcmVhdGVFUmVmZXJlbmNlKGF1dGhvcml6YXRpb25QYWNrYWdlRUNsYXNzLCBBVVRIT1JJWkFUSU9OX1BBQ0tBR0VfX1JPTEVTKTsKKworCQlhdXRob3JpemF0aW9uQmFzZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhBVVRIT1JJWkFUSU9OX0JBU0UpOworCQljcmVhdGVFQXR0cmlidXRlKGF1dGhvcml6YXRpb25CYXNlRUNsYXNzLCBBVVRIT1JJWkFUSU9OX0JBU0VfX05BTUUpOworCisJCXJvbGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVDbGFzcywgUk9MRV9fUk9MRV9FTEVNRU5UUyk7CisKKwkJcm9sZUVsZW1lbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9FTEVNRU5UKTsKKworCQlyb2xlRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfRU5USVRZKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRW50aXR5RUNsYXNzLCBST0xFX0VOVElUWV9fRU5USVRZX0FVVEhPUklaRUQpOworCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVFbnRpdHlFQ2xhc3MsIFJPTEVfRU5USVRZX19FTlRJVFlfRkVBVFVSRVMpOworCQljcmVhdGVFUmVmZXJlbmNlKHJvbGVFbnRpdHlFQ2xhc3MsIFJPTEVfRU5USVRZX19FTlRJVFlfUkVGKTsKKworCQlyb2xlQmVhbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0JFQU4pOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVCZWFuRUNsYXNzLCBST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUJlYW5FQ2xhc3MsIFJPTEVfQkVBTl9fQkVBTl9GRUFUVVJFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUJlYW5FQ2xhc3MsIFJPTEVfQkVBTl9fQkVBTl9SRUYpOworCisJCXJvbGVEdG9FQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9EVE8pOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEdG9FQ2xhc3MsIFJPTEVfRFRPX19EVE9fQVVUSE9SSVpFRCk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUR0b0VDbGFzcywgUk9MRV9EVE9fX0RUT19GRUFUVVJFUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUR0b0VDbGFzcywgUk9MRV9EVE9fX0RUT19SRUYpOworCisJCXJvbGVCbGlwQWxsVXNlclRhc2tzRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfQkxJUF9BTExfVVNFUl9UQVNLUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUJsaXBBbGxVc2VyVGFza3NFQ2xhc3MsIFJPTEVfQkxJUF9BTExfVVNFUl9UQVNLU19fQVVUSE9SSVpFRCk7CisKKwkJcm9sZUJsaXBVc2VyVGFza0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0JMSVBfVVNFUl9UQVNLKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyb2xlQmxpcFVzZXJUYXNrRUNsYXNzLCBST0xFX0JMSVBfVVNFUl9UQVNLX19VU0VSX1RBU0spOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVCbGlwVXNlclRhc2tFQ2xhc3MsIFJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQpOworCisJCXJvbGVCbGlwUHJvY2Vzc0VDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0JMSVBfUFJPQ0VTUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUJsaXBQcm9jZXNzRUNsYXNzLCBST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTUyk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUJsaXBQcm9jZXNzRUNsYXNzLCBST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyb2xlQmxpcFByb2Nlc3NFQ2xhc3MsIFJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUyk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUJsaXBQcm9jZXNzRUNsYXNzLCBST0xFX0JMSVBfUFJPQ0VTU19fVVNFUl9UQVNLUyk7CisKKwkJcm9sZUVudGl0eUZlYXR1cmVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9FTlRJVFlfRkVBVFVSRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUVudGl0eUZlYXR1cmVFQ2xhc3MsIFJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wpOworCisJCXJvbGVFbnRpdHlBdHRyaWJ1dGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9FTlRJVFlfQVRUUklCVVRFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRW50aXR5QXR0cmlidXRlRUNsYXNzLCBST0xFX0VOVElUWV9BVFRSSUJVVEVfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQpOworCisJCXJvbGVFbnRpdHlSZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9FTlRJVFlfUkVGRVJFTkNFKTsKKwkJY3JlYXRlRUF0dHJpYnV0ZShyb2xlRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBST0xFX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQpOworCisJCXJvbGVCZWFuRmVhdHVyZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0JFQU5fRkVBVFVSRSk7CisJCWNyZWF0ZUVSZWZlcmVuY2Uocm9sZUJlYW5GZWF0dXJlRUNsYXNzLCBST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0wpOworCisJCXJvbGVCZWFuQXR0cmlidXRlRUNsYXNzID0gY3JlYXRlRUNsYXNzKFJPTEVfQkVBTl9BVFRSSUJVVEUpOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVCZWFuQXR0cmlidXRlRUNsYXNzLCBST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCk7CisKKwkJcm9sZUJlYW5SZWZlcmVuY2VFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoUk9MRV9CRUFOX1JFRkVSRU5DRSk7CisJCWNyZWF0ZUVBdHRyaWJ1dGUocm9sZUJlYW5SZWZlcmVuY2VFQ2xhc3MsIFJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEKTsKKworCQlyb2xlRHRvRmVhdHVyZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RUT19GRUFUVVJFKTsKKwkJY3JlYXRlRVJlZmVyZW5jZShyb2xlRHRvRmVhdHVyZUVDbGFzcywgUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTCk7CisKKwkJcm9sZUR0b0F0dHJpYnV0ZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RUT19BVFRSSUJVVEUpOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEdG9BdHRyaWJ1dGVFQ2xhc3MsIFJPTEVfRFRPX0FUVFJJQlVURV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRCk7CisKKwkJcm9sZUR0b1JlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhST0xFX0RUT19SRUZFUkVOQ0UpOworCQljcmVhdGVFQXR0cmlidXRlKHJvbGVEdG9SZWZlcmVuY2VFQ2xhc3MsIFJPTEVfRFRPX1JFRkVSRU5DRV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRCk7CisKKwkJLy8gQ3JlYXRlIGVudW1zCisJCXJvbGVFbnVtRUVudW0gPSBjcmVhdGVFRW51bShST0xFX0VOVU0pOworCQlyb2xlUHJvcGVydHlFbnVtRUVudW0gPSBjcmVhdGVFRW51bShST0xFX1BST1BFUlRZX0VOVU0pOworCQlyb2xlQmxpcFByb2Nlc3NFbnVtRUVudW0gPSBjcmVhdGVFRW51bShST0xFX0JMSVBfUFJPQ0VTU19FTlVNKTsKKwkJcm9sZUJsaXBVc2VyVGFza0VudW1FRW51bSA9IGNyZWF0ZUVFbnVtKFJPTEVfQkxJUF9VU0VSX1RBU0tfRU5VTSk7CisKKwkJLy8gQ3JlYXRlIGRhdGEgdHlwZXMKKwkJaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlID0gY3JlYXRlRURhdGFUeXBlKElOVEVSTkFMX0VPQkpFQ1QpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7CisKKwkvKioKKwkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiAgVGhpcworCSAqIG1ldGhvZCBpcyBndWFyZGVkIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKKwkJaWYgKGlzSW5pdGlhbGl6ZWQpIHJldHVybjsKKwkJaXNJbml0aWFsaXplZCA9IHRydWU7CisKKwkJLy8gSW5pdGlhbGl6ZSBwYWNrYWdlCisJCXNldE5hbWUoZU5BTUUpOworCQlzZXROc1ByZWZpeChlTlNfUFJFRklYKTsKKwkJc2V0TnNVUkkoZU5TX1VSSSk7CisKKwkJLy8gT2J0YWluIG90aGVyIGRlcGVuZGVudCBwYWNrYWdlcworCQlFY29yZVBhY2thZ2UgdGhlRWNvcmVQYWNrYWdlID0gKEVjb3JlUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7CisJCU9TQlBUeXBlc1BhY2thZ2UgdGhlT1NCUFR5cGVzUGFja2FnZSA9IChPU0JQVHlwZXNQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9TQlBUeXBlc1BhY2thZ2UuZU5TX1VSSSk7CisJCU9TQlBFbnRpdHlQYWNrYWdlIHRoZU9TQlBFbnRpdHlQYWNrYWdlID0gKE9TQlBFbnRpdHlQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKE9TQlBFbnRpdHlQYWNrYWdlLmVOU19VUkkpOworCQlPU0JQRHRvUGFja2FnZSB0aGVPU0JQRHRvUGFja2FnZSA9IChPU0JQRHRvUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShPU0JQRHRvUGFja2FnZS5lTlNfVVJJKTsKKwkJQmxpcERTTFBhY2thZ2UgdGhlQmxpcERTTFBhY2thZ2UgPSAoQmxpcERTTFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoQmxpcERTTFBhY2thZ2UuZU5TX1VSSSk7CisKKwkJLy8gQ3JlYXRlIHR5cGUgcGFyYW1ldGVycworCisJCS8vIFNldCBib3VuZHMgZm9yIHR5cGUgcGFyYW1ldGVycworCisJCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKKwkJYXV0aG9yaXphdGlvblBhY2thZ2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlT1NCUFR5cGVzUGFja2FnZS5nZXRMUGFja2FnZSgpKTsKKwkJYXV0aG9yaXphdGlvbkJhc2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKCkpOworCQlyb2xlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXV0aG9yaXphdGlvbkJhc2UoKSk7CisJCXJvbGVFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcigpKTsKKwkJcm9sZUVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVFbGVtZW50KCkpOworCQlyb2xlQmVhbkVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVFbGVtZW50KCkpOworCQlyb2xlRHRvRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUVsZW1lbnQoKSk7CisJCXJvbGVCbGlwQWxsVXNlclRhc2tzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUVsZW1lbnQoKSk7CisJCXJvbGVCbGlwVXNlclRhc2tFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRWxlbWVudCgpKTsKKwkJcm9sZUJsaXBQcm9jZXNzRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUVsZW1lbnQoKSk7CisJCXJvbGVFbnRpdHlGZWF0dXJlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0QXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcigpKTsKKwkJcm9sZUVudGl0eUF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVFbnRpdHlGZWF0dXJlKCkpOworCQlyb2xlRW50aXR5UmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUVudGl0eUZlYXR1cmUoKSk7CisJCXJvbGVCZWFuRmVhdHVyZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoKSk7CisJCXJvbGVCZWFuQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUJlYW5GZWF0dXJlKCkpOworCQlyb2xlQmVhblJlZmVyZW5jZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldFJvbGVCZWFuRmVhdHVyZSgpKTsKKwkJcm9sZUR0b0ZlYXR1cmVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKCkpOworCQlyb2xlRHRvQXR0cmlidXRlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0Um9sZUR0b0ZlYXR1cmUoKSk7CisJCXJvbGVEdG9SZWZlcmVuY2VFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXRSb2xlRHRvRmVhdHVyZSgpKTsKKworCQkvLyBJbml0aWFsaXplIGNsYXNzZXMsIGZlYXR1cmVzLCBhbmQgb3BlcmF0aW9uczsgYWRkIHBhcmFtZXRlcnMKKwkJaW5pdEVDbGFzcyhhdXRob3JpemF0aW9uTW9kZWxFQ2xhc3MsIEF1dGhvcml6YXRpb25Nb2RlbC5jbGFzcywgIkF1dGhvcml6YXRpb25Nb2RlbCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aG9yaXphdGlvbk1vZGVsX1Bja2coKSwgdGhpcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZSgpLCBudWxsLCAicGNrZyIsIG51bGwsIDAsIDEsIEF1dGhvcml6YXRpb25Nb2RlbC5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJFQ2xhc3MsIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIuY2xhc3MsICJBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCUVPcGVyYXRpb24gb3AgPSBpbml0RU9wZXJhdGlvbihnZXRBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyX19FUmVzb2x2ZVByb3h5X19JbnRlcm5hbEVPYmplY3QoKSwgdGhlRWNvcmVQYWNrYWdlLmdldEVPYmplY3QoKSwgImVSZXNvbHZlUHJveHkiLCAwLCAxLCAhSVNfVU5JUVVFLCBJU19PUkRFUkVEKTsKKwkJYWRkRVBhcmFtZXRlcihvcCwgdGhpcy5nZXRJbnRlcm5hbEVPYmplY3QoKSwgInByb3h5IiwgMCwgMSwgIUlTX1VOSVFVRSwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhhdXRob3JpemF0aW9uUGFja2FnZUVDbGFzcywgQXV0aG9yaXphdGlvblBhY2thZ2UuY2xhc3MsICJBdXRob3JpemF0aW9uUGFja2FnZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VfUm9sZXMoKSwgdGhpcy5nZXRSb2xlKCksIG51bGwsICJyb2xlcyIsIG51bGwsIDAsIC0xLCBBdXRob3JpemF0aW9uUGFja2FnZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKGF1dGhvcml6YXRpb25CYXNlRUNsYXNzLCBBdXRob3JpemF0aW9uQmFzZS5jbGFzcywgIkF1dGhvcml6YXRpb25CYXNlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRBdXRob3JpemF0aW9uQmFzZV9OYW1lKCksIHRoZUVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJuYW1lIiwgbnVsbCwgMCwgMSwgQXV0aG9yaXphdGlvbkJhc2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Mocm9sZUVDbGFzcywgUm9sZS5jbGFzcywgIlJvbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVfUm9sZUVsZW1lbnRzKCksIHRoaXMuZ2V0Um9sZUVsZW1lbnQoKSwgbnVsbCwgInJvbGVFbGVtZW50cyIsIG51bGwsIDAsIC0xLCBSb2xlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Mocm9sZUVsZW1lbnRFQ2xhc3MsIFJvbGVFbGVtZW50LmNsYXNzLCAiUm9sZUVsZW1lbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisKKwkJaW5pdEVDbGFzcyhyb2xlRW50aXR5RUNsYXNzLCBSb2xlRW50aXR5LmNsYXNzLCAiUm9sZUVudGl0eSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUVudGl0eV9FbnRpdHlBdXRob3JpemVkKCksIHRoaXMuZ2V0Um9sZUVudW0oKSwgImVudGl0eUF1dGhvcml6ZWQiLCBudWxsLCAwLCAtMSwgUm9sZUVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVFbnRpdHlfRW50aXR5RmVhdHVyZXMoKSwgdGhpcy5nZXRSb2xlRW50aXR5RmVhdHVyZSgpLCBudWxsLCAiZW50aXR5RmVhdHVyZXMiLCBudWxsLCAwLCAtMSwgUm9sZUVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUVudGl0eV9FbnRpdHlSZWYoKSwgdGhlT1NCUEVudGl0eVBhY2thZ2UuZ2V0TEVudGl0eSgpLCBudWxsLCAiZW50aXR5UmVmIiwgbnVsbCwgMCwgMSwgUm9sZUVudGl0eS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJvbGVCZWFuRUNsYXNzLCBSb2xlQmVhbi5jbGFzcywgIlJvbGVCZWFuIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlQmVhbl9CZWFuQXV0aG9yaXplZCgpLCB0aGlzLmdldFJvbGVFbnVtKCksICJiZWFuQXV0aG9yaXplZCIsIG51bGwsIDAsIC0xLCBSb2xlQmVhbi5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVCZWFuX0JlYW5GZWF0dXJlcygpLCB0aGlzLmdldFJvbGVCZWFuRmVhdHVyZSgpLCBudWxsLCAiYmVhbkZlYXR1cmVzIiwgbnVsbCwgMCwgLTEsIFJvbGVCZWFuLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlQmVhbl9CZWFuUmVmKCksIHRoZU9TQlBFbnRpdHlQYWNrYWdlLmdldExCZWFuKCksIG51bGwsICJiZWFuUmVmIiwgbnVsbCwgMCwgMSwgUm9sZUJlYW4uY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlRHRvRUNsYXNzLCBSb2xlRHRvLmNsYXNzLCAiUm9sZUR0byIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUR0b19EdG9BdXRob3JpemVkKCksIHRoaXMuZ2V0Um9sZUVudW0oKSwgImR0b0F1dGhvcml6ZWQiLCBudWxsLCAwLCAtMSwgUm9sZUR0by5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVEdG9fRHRvRmVhdHVyZXMoKSwgdGhpcy5nZXRSb2xlRHRvRmVhdHVyZSgpLCBudWxsLCAiZHRvRmVhdHVyZXMiLCBudWxsLCAwLCAtMSwgUm9sZUR0by5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUR0b19EdG9SZWYoKSwgdGhlT1NCUER0b1BhY2thZ2UuZ2V0TER0bygpLCBudWxsLCAiZHRvUmVmIiwgbnVsbCwgMCwgMSwgUm9sZUR0by5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJvbGVCbGlwQWxsVXNlclRhc2tzRUNsYXNzLCBSb2xlQmxpcEFsbFVzZXJUYXNrcy5jbGFzcywgIlJvbGVCbGlwQWxsVXNlclRhc2tzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlQmxpcEFsbFVzZXJUYXNrc19BdXRob3JpemVkKCksIHRoaXMuZ2V0Um9sZUJsaXBVc2VyVGFza0VudW0oKSwgImF1dGhvcml6ZWQiLCBudWxsLCAwLCAxLCBSb2xlQmxpcEFsbFVzZXJUYXNrcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlQmxpcFVzZXJUYXNrRUNsYXNzLCBSb2xlQmxpcFVzZXJUYXNrLmNsYXNzLCAiUm9sZUJsaXBVc2VyVGFzayIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUJsaXBVc2VyVGFza19Vc2VyVGFzaygpLCB0aGVCbGlwRFNMUGFja2FnZS5nZXRCbGlwVXNlclRhc2soKSwgbnVsbCwgInVzZXJUYXNrIiwgbnVsbCwgMCwgMSwgUm9sZUJsaXBVc2VyVGFzay5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUJsaXBVc2VyVGFza19BdXRob3JpemVkKCksIHRoaXMuZ2V0Um9sZUJsaXBVc2VyVGFza0VudW0oKSwgImF1dGhvcml6ZWQiLCBudWxsLCAwLCAxLCBSb2xlQmxpcFVzZXJUYXNrLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQsICFJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJvbGVCbGlwUHJvY2Vzc0VDbGFzcywgUm9sZUJsaXBQcm9jZXNzLmNsYXNzLCAiUm9sZUJsaXBQcm9jZXNzIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlQmxpcFByb2Nlc3NfUHJvY2VzcygpLCB0aGVCbGlwRFNMUGFja2FnZS5nZXRCbGlwKCksIG51bGwsICJwcm9jZXNzIiwgbnVsbCwgMCwgMSwgUm9sZUJsaXBQcm9jZXNzLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlQmxpcFByb2Nlc3NfUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCgpLCB0aGlzLmdldFJvbGVCbGlwUHJvY2Vzc0VudW0oKSwgInByb2Nlc3NTdGFydEF1dGhvcml6ZWQiLCBudWxsLCAwLCAxLCBSb2xlQmxpcFByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCQlpbml0RVJlZmVyZW5jZShnZXRSb2xlQmxpcFByb2Nlc3NfQWxsVXNlclRhc2tzKCksIHRoaXMuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3MoKSwgbnVsbCwgImFsbFVzZXJUYXNrcyIsIG51bGwsIDAsIDEsIFJvbGVCbGlwUHJvY2Vzcy5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUJsaXBQcm9jZXNzX1VzZXJUYXNrcygpLCB0aGlzLmdldFJvbGVCbGlwVXNlclRhc2soKSwgbnVsbCwgInVzZXJUYXNrcyIsIG51bGwsIDAsIC0xLCBSb2xlQmxpcFByb2Nlc3MuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlRW50aXR5RmVhdHVyZUVDbGFzcywgUm9sZUVudGl0eUZlYXR1cmUuY2xhc3MsICJSb2xlRW50aXR5RmVhdHVyZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUVudGl0eUZlYXR1cmVfRW50aXR5QXR0cmlDb2woKSwgdGhlT1NCUEVudGl0eVBhY2thZ2UuZ2V0TEVudGl0eUZlYXR1cmUoKSwgbnVsbCwgImVudGl0eUF0dHJpQ29sIiwgbnVsbCwgMCwgMSwgUm9sZUVudGl0eUZlYXR1cmUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTLCAhSVNfVU5TRVRUQUJMRSwgSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlRW50aXR5QXR0cmlidXRlRUNsYXNzLCBSb2xlRW50aXR5QXR0cmlidXRlLmNsYXNzLCAiUm9sZUVudGl0eUF0dHJpYnV0ZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZV9FbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpLCB0aGlzLmdldFJvbGVQcm9wZXJ0eUVudW0oKSwgImVudGl0eUF0dHJpVW5hdXRob3JpemVkIiwgbnVsbCwgMCwgMSwgUm9sZUVudGl0eUF0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlRW50aXR5UmVmZXJlbmNlRUNsYXNzLCBSb2xlRW50aXR5UmVmZXJlbmNlLmNsYXNzLCAiUm9sZUVudGl0eVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUVudGl0eVJlZmVyZW5jZV9FbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpLCB0aGlzLmdldFJvbGVQcm9wZXJ0eUVudW0oKSwgImVudGl0eUF0dHJpVW5hdXRob3JpemVkIiwgbnVsbCwgMCwgMSwgUm9sZUVudGl0eVJlZmVyZW5jZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlQmVhbkZlYXR1cmVFQ2xhc3MsIFJvbGVCZWFuRmVhdHVyZS5jbGFzcywgIlJvbGVCZWFuRmVhdHVyZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVSZWZlcmVuY2UoZ2V0Um9sZUJlYW5GZWF0dXJlX0JlYW5BdHRyaUNvbCgpLCB0aGVPU0JQRW50aXR5UGFja2FnZS5nZXRMQmVhbkZlYXR1cmUoKSwgbnVsbCwgImJlYW5BdHRyaUNvbCIsIG51bGwsIDAsIDEsIFJvbGVCZWFuRmVhdHVyZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMsICFJU19VTlNFVFRBQkxFLCBJU19VTklRVUUsICFJU19ERVJJVkVELCBJU19PUkRFUkVEKTsKKworCQlpbml0RUNsYXNzKHJvbGVCZWFuQXR0cmlidXRlRUNsYXNzLCBSb2xlQmVhbkF0dHJpYnV0ZS5jbGFzcywgIlJvbGVCZWFuQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFLCBJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCQlpbml0RUF0dHJpYnV0ZShnZXRSb2xlQmVhbkF0dHJpYnV0ZV9CZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSwgdGhpcy5nZXRSb2xlUHJvcGVydHlFbnVtKCksICJiZWFuQXR0cmlVbmF1dGhvcml6ZWQiLCBudWxsLCAwLCAxLCBSb2xlQmVhbkF0dHJpYnV0ZS5jbGFzcywgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lELCAhSVNfVU5JUVVFLCAhSVNfREVSSVZFRCwgSVNfT1JERVJFRCk7CisKKwkJaW5pdEVDbGFzcyhyb2xlQmVhblJlZmVyZW5jZUVDbGFzcywgUm9sZUJlYW5SZWZlcmVuY2UuY2xhc3MsICJSb2xlQmVhblJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSwgSVNfR0VORVJBVEVEX0lOU1RBTkNFX0NMQVNTKTsKKwkJaW5pdEVBdHRyaWJ1dGUoZ2V0Um9sZUJlYW5SZWZlcmVuY2VfQmVhbkF0dHJpVW5hdXRob3JpemVkKCksIHRoaXMuZ2V0Um9sZVByb3BlcnR5RW51bSgpLCAiYmVhbkF0dHJpVW5hdXRob3JpemVkIiwgbnVsbCwgMCwgMSwgUm9sZUJlYW5SZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Mocm9sZUR0b0ZlYXR1cmVFQ2xhc3MsIFJvbGVEdG9GZWF0dXJlLmNsYXNzLCAiUm9sZUR0b0ZlYXR1cmUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFUmVmZXJlbmNlKGdldFJvbGVEdG9GZWF0dXJlX0R0b0F0dHJpQ29sKCksIHRoZU9TQlBEdG9QYWNrYWdlLmdldExEdG9GZWF0dXJlKCksIG51bGwsICJkdG9BdHRyaUNvbCIsIG51bGwsIDAsIDEsIFJvbGVEdG9GZWF0dXJlLmNsYXNzLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUywgIUlTX1VOU0VUVEFCTEUsIElTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Mocm9sZUR0b0F0dHJpYnV0ZUVDbGFzcywgUm9sZUR0b0F0dHJpYnV0ZS5jbGFzcywgIlJvbGVEdG9BdHRyaWJ1dGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFJvbGVEdG9BdHRyaWJ1dGVfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKSwgdGhpcy5nZXRSb2xlUHJvcGVydHlFbnVtKCksICJkdG9BdHRyaVVuYXV0aG9yaXplZCIsIG51bGwsIDAsIDEsIFJvbGVEdG9BdHRyaWJ1dGUuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCWluaXRFQ2xhc3Mocm9sZUR0b1JlZmVyZW5jZUVDbGFzcywgUm9sZUR0b1JlZmVyZW5jZS5jbGFzcywgIlJvbGVEdG9SZWZlcmVuY2UiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UsIElTX0dFTkVSQVRFRF9JTlNUQU5DRV9DTEFTUyk7CisJCWluaXRFQXR0cmlidXRlKGdldFJvbGVEdG9SZWZlcmVuY2VfRHRvQXR0cmlVbmF1dGhvcml6ZWQoKSwgdGhpcy5nZXRSb2xlUHJvcGVydHlFbnVtKCksICJkdG9BdHRyaVVuYXV0aG9yaXplZCIsIG51bGwsIDAsIDEsIFJvbGVEdG9SZWZlcmVuY2UuY2xhc3MsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCwgIUlTX1VOSVFVRSwgIUlTX0RFUklWRUQsIElTX09SREVSRUQpOworCisJCS8vIEluaXRpYWxpemUgZW51bXMgYW5kIGFkZCBlbnVtIGxpdGVyYWxzCisJCWluaXRFRW51bShyb2xlRW51bUVFbnVtLCBSb2xlRW51bS5jbGFzcywgIlJvbGVFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChyb2xlRW51bUVFbnVtLCBSb2xlRW51bS5BTlkpOworCQlhZGRFRW51bUxpdGVyYWwocm9sZUVudW1FRW51bSwgUm9sZUVudW0uQ1JFQVRBQkxFKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJvbGVFbnVtRUVudW0sIFJvbGVFbnVtLlJFQURBQkxFKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJvbGVFbnVtRUVudW0sIFJvbGVFbnVtLlVQREFUQUJMRSk7CisJCWFkZEVFbnVtTGl0ZXJhbChyb2xlRW51bUVFbnVtLCBSb2xlRW51bS5ERUxFVEFCTEUpOworCisJCWluaXRFRW51bShyb2xlUHJvcGVydHlFbnVtRUVudW0sIFJvbGVQcm9wZXJ0eUVudW0uY2xhc3MsICJSb2xlUHJvcGVydHlFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChyb2xlUHJvcGVydHlFbnVtRUVudW0sIFJvbGVQcm9wZXJ0eUVudW0uSU5WSVNJQkxFKTsKKwkJYWRkRUVudW1MaXRlcmFsKHJvbGVQcm9wZXJ0eUVudW1FRW51bSwgUm9sZVByb3BlcnR5RW51bS5ESVNBQkxFRCk7CisJCWFkZEVFbnVtTGl0ZXJhbChyb2xlUHJvcGVydHlFbnVtRUVudW0sIFJvbGVQcm9wZXJ0eUVudW0uTk9ORURJVEFCTEUpOworCisJCWluaXRFRW51bShyb2xlQmxpcFByb2Nlc3NFbnVtRUVudW0sIFJvbGVCbGlwUHJvY2Vzc0VudW0uY2xhc3MsICJSb2xlQmxpcFByb2Nlc3NFbnVtIik7CisJCWFkZEVFbnVtTGl0ZXJhbChyb2xlQmxpcFByb2Nlc3NFbnVtRUVudW0sIFJvbGVCbGlwUHJvY2Vzc0VudW0uU1RBUlRBQkxFKTsKKworCQlpbml0RUVudW0ocm9sZUJsaXBVc2VyVGFza0VudW1FRW51bSwgUm9sZUJsaXBVc2VyVGFza0VudW0uY2xhc3MsICJSb2xlQmxpcFVzZXJUYXNrRW51bSIpOworCQlhZGRFRW51bUxpdGVyYWwocm9sZUJsaXBVc2VyVGFza0VudW1FRW51bSwgUm9sZUJsaXBVc2VyVGFza0VudW0uRVhFQ1VUQUJMRSk7CisKKwkJLy8gSW5pdGlhbGl6ZSBkYXRhIHR5cGVzCisJCWluaXRFRGF0YVR5cGUoaW50ZXJuYWxFT2JqZWN0RURhdGFUeXBlLCBJbnRlcm5hbEVPYmplY3QuY2xhc3MsICJJbnRlcm5hbEVPYmplY3QiLCBJU19TRVJJQUxJWkFCTEUsICFJU19HRU5FUkFURURfSU5TVEFOQ0VfQ0xBU1MpOworCisJCS8vIENyZWF0ZSByZXNvdXJjZQorCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKKworCQkvLyBDcmVhdGUgYW5ub3RhdGlvbnMKKwkJLy8gaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZQorCQljcmVhdGVFY29yZUFubm90YXRpb25zKCk7CisJfQorCisJLyoqCisJICogSW5pdGlhbGl6ZXMgdGhlIGFubm90YXRpb25zIGZvciA8Yj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2VtZi8yMDAyL0Vjb3JlPC9iPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVFY29yZUFubm90YXRpb25zKCkgeworCQlTdHJpbmcgc291cmNlID0gImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZW1mLzIwMDIvRWNvcmUiOwkKKwkJYWRkQW5ub3RhdGlvbgorCQkgICh0aGlzLCAKKwkJICAgc291cmNlLCAKKwkJICAgbmV3IFN0cmluZ1tdIHsKKwkJCSAicm9vdFBhY2thZ2UiLCAiYXV0aG9yaXphdGlvbkRTTCIKKwkJICAgfSk7CisJfQorCit9IC8vQXV0aG9yaXphdGlvbkRTTFBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9BdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWJkZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuTWluaW1hbEVPYmplY3RJbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5hcGkuRWNvcmVVdGlsMzsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dGhvcml6YXRpb24gTGF6eSBSZXNvbHZlcjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJJbXBsIGV4dGVuZHMgTWluaW1hbEVPYmplY3RJbXBsLkNvbnRhaW5lciBpbXBsZW1lbnRzIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgeworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLkFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRU9iamVjdCBlUmVzb2x2ZVByb3h5KGZpbmFsIEludGVybmFsRU9iamVjdCBwcm94eSkgeworCQlSZXNvdXJjZSBfZVJlc291cmNlID0gdGhpcy5lUmVzb3VyY2UoKTsKKwkJUmVzb3VyY2VTZXQgX3Jlc291cmNlU2V0ID0gX2VSZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOworCQlyZXR1cm4gRWNvcmVVdGlsMy5yZXNvbHZlKHByb3h5LCBfcmVzb3VyY2VTZXQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUludm9rZShpbnQgb3BlcmF0aW9uSUQsIEVMaXN0PD8+IGFyZ3VtZW50cykgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworCQlzd2l0Y2ggKG9wZXJhdGlvbklEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fTEFaWV9SRVNPTFZFUl9fX0VSRVNPTFZFX1BST1hZX19JTlRFUk5BTEVPQkpFQ1Q6CisJCQkJcmV0dXJuIGVSZXNvbHZlUHJveHkoKEludGVybmFsRU9iamVjdClhcmd1bWVudHMuZ2V0KDApKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludm9rZShvcGVyYXRpb25JRCwgYXJndW1lbnRzKTsKKwl9CisKK30gLy9BdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbk1vZGVsSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvbk1vZGVsSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNGFlOTAKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9BdXRob3JpemF0aW9uTW9kZWxJbXBsLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLk1pbmltYWxFT2JqZWN0SW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uUGFja2FnZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF1dGhvcml6YXRpb24gTW9kZWw8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25Nb2RlbEltcGwjZ2V0UGNrZyA8ZW0+UGNrZzwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25Nb2RlbEltcGwgZXh0ZW5kcyBNaW5pbWFsRU9iamVjdEltcGwuQ29udGFpbmVyIGltcGxlbWVudHMgQXV0aG9yaXphdGlvbk1vZGVsIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQY2tnKCkgPGVtPlBja2c8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFBja2coKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBBdXRob3JpemF0aW9uUGFja2FnZSBwY2tnOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIEF1dGhvcml6YXRpb25Nb2RlbEltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5BVVRIT1JJWkFUSU9OX01PREVMOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBdXRob3JpemF0aW9uUGFja2FnZSBnZXRQY2tnKCkgeworCQlyZXR1cm4gcGNrZzsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRQY2tnKEF1dGhvcml6YXRpb25QYWNrYWdlIG5ld1Bja2csIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJQXV0aG9yaXphdGlvblBhY2thZ2Ugb2xkUGNrZyA9IHBja2c7CisJCXBja2cgPSBuZXdQY2tnOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKKwkJCUVOb3RpZmljYXRpb25JbXBsIG5vdGlmaWNhdGlvbiA9IG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHLCBvbGRQY2tnLCBuZXdQY2tnKTsKKwkJCWlmIChtc2dzID09IG51bGwpIG1zZ3MgPSBub3RpZmljYXRpb247IGVsc2UgbXNncy5hZGQobm90aWZpY2F0aW9uKTsKKwkJfQorCQlyZXR1cm4gbXNnczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQY2tnKEF1dGhvcml6YXRpb25QYWNrYWdlIG5ld1Bja2cpIHsKKwkJaWYgKG5ld1Bja2cgIT0gcGNrZykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAocGNrZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdClwY2tnKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9NT0RFTF9fUENLRywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3UGNrZyAhPSBudWxsKQorCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCluZXdQY2tnKS5lSW52ZXJzZUFkZCh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9NT0RFTF9fUENLRywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRQY2tnKG5ld1Bja2csIG1zZ3MpOworCQkJaWYgKG1zZ3MgIT0gbnVsbCkgbXNncy5kaXNwYXRjaCgpOworCQl9CisJCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9NT0RFTF9fUENLRywgbmV3UGNrZywgbmV3UGNrZykpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9NT0RFTF9fUENLRzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRQY2tnKG51bGwsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fTU9ERUxfX1BDS0c6CisJCQkJcmV0dXJuIGdldFBja2coKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHOgorCQkJCXNldFBja2coKEF1dGhvcml6YXRpb25QYWNrYWdlKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHOgorCQkJCXNldFBja2coKEF1dGhvcml6YXRpb25QYWNrYWdlKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHOgorCQkJCXJldHVybiBwY2tnICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL0F1dGhvcml6YXRpb25Nb2RlbEltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL0F1dGhvcml6YXRpb25QYWNrYWdlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvQXV0aG9yaXphdGlvblBhY2thZ2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDExOWVlMwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL0F1dGhvcml6YXRpb25QYWNrYWdlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5pbXBsLkxQYWNrYWdlSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGU7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdXRob3JpemF0aW9uIFBhY2thZ2U8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLkF1dGhvcml6YXRpb25QYWNrYWdlSW1wbCNnZXRSb2xlcyA8ZW0+Um9sZXM8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uUGFja2FnZUltcGwgZXh0ZW5kcyBMUGFja2FnZUltcGwgaW1wbGVtZW50cyBBdXRob3JpemF0aW9uUGFja2FnZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZXMoKSA8ZW0+Um9sZXM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Um9sZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlPiByb2xlczsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBBdXRob3JpemF0aW9uUGFja2FnZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5BVVRIT1JJWkFUSU9OX1BBQ0tBR0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFJvbGU+IGdldFJvbGVzKCkgeworCQlpZiAocm9sZXMgPT0gbnVsbCkgeworCQkJcm9sZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Um9sZT4oUm9sZS5jbGFzcywgdGhpcywgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9QQUNLQUdFX19ST0xFUyk7CisJCX0KKwkJcmV0dXJuIHJvbGVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9QQUNLQUdFX19ST0xFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldFJvbGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX1BBQ0tBR0VfX1JPTEVTOgorCQkJCXJldHVybiBnZXRSb2xlcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fUEFDS0FHRV9fUk9MRVM6CisJCQkJZ2V0Um9sZXMoKS5jbGVhcigpOworCQkJCWdldFJvbGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9QQUNLQUdFX19ST0xFUzoKKwkJCQlnZXRSb2xlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fUEFDS0FHRV9fUk9MRVM6CisJCQkJcmV0dXJuIHJvbGVzICE9IG51bGwgJiYgIXJvbGVzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vQXV0aG9yaXphdGlvblBhY2thZ2VJbXBsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmVhbkF0dHJpYnV0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCZWFuQXR0cmlidXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmM2U3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmVhbkF0dHJpYnV0ZUltcGwuamF2YQpAQCAtMCwwICsxLDE3NSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuQXR0cmlidXRlSW1wbCNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUm9sZUJlYW5BdHRyaWJ1dGVJbXBsIGV4dGVuZHMgUm9sZUJlYW5GZWF0dXJlSW1wbCBpbXBsZW1lbnRzIFJvbGVCZWFuQXR0cmlidXRlIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUm9sZVByb3BlcnR5RW51bSBCRUFOX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA9IFJvbGVQcm9wZXJ0eUVudW0uSU5WSVNJQkxFOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkgPGVtPkJlYW4gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSb2xlUHJvcGVydHlFbnVtIGJlYW5BdHRyaVVuYXV0aG9yaXplZCA9IEJFQU5fQVRUUklfVU5BVVRIT1JJWkVEX0VERUZBVUxUOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJvbGVCZWFuQXR0cmlidXRlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTl9BVFRSSUJVVEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkgeworCQlyZXR1cm4gYmVhbkF0dHJpVW5hdXRob3JpemVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEJlYW5BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIG5ld0JlYW5BdHRyaVVuYXV0aG9yaXplZCkgeworCQlSb2xlUHJvcGVydHlFbnVtIG9sZEJlYW5BdHRyaVVuYXV0aG9yaXplZCA9IGJlYW5BdHRyaVVuYXV0aG9yaXplZDsKKwkJYmVhbkF0dHJpVW5hdXRob3JpemVkID0gbmV3QmVhbkF0dHJpVW5hdXRob3JpemVkID09IG51bGwgPyBCRUFOX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0JlYW5BdHRyaVVuYXV0aG9yaXplZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX0FUVFJJQlVURV9fQkVBTl9BVFRSSV9VTkFVVEhPUklaRUQsIG9sZEJlYW5BdHRyaVVuYXV0aG9yaXplZCwgYmVhbkF0dHJpVW5hdXRob3JpemVkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlyZXR1cm4gZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCk7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZUlELCByZXNvbHZlLCBjb3JlVHlwZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVNldChpbnQgZmVhdHVyZUlELCBPYmplY3QgbmV3VmFsdWUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX0FUVFJJQlVURV9fQkVBTl9BVFRSSV9VTkFVVEhPUklaRUQ6CisJCQkJc2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKChSb2xlUHJvcGVydHlFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoQkVBTl9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fQVRUUklCVVRFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlyZXR1cm4gYmVhbkF0dHJpVW5hdXRob3JpemVkICE9IEJFQU5fQVRUUklfVU5BVVRIT1JJWkVEX0VERUZBVUxUOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAoYmVhbkF0dHJpVW5hdXRob3JpemVkOiAiKTsKKwkJcmVzdWx0LmFwcGVuZChiZWFuQXR0cmlVbmF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlQmVhbkF0dHJpYnV0ZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCZWFuRmVhdHVyZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCZWFuRmVhdHVyZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWZkMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJlYW5GZWF0dXJlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MQmVhbkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuRmVhdHVyZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgQmVhbiBGZWF0dXJlPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmVhbkZlYXR1cmVJbXBsI2dldEJlYW5BdHRyaUNvbCA8ZW0+QmVhbiBBdHRyaSBDb2w8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlQmVhbkZlYXR1cmVJbXBsIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckltcGwgaW1wbGVtZW50cyBSb2xlQmVhbkZlYXR1cmUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlYW5BdHRyaUNvbCgpIDxlbT5CZWFuIEF0dHJpIENvbDwvZW0+fScgcmVmZXJlbmNlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmVhbkF0dHJpQ29sKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTEJlYW5GZWF0dXJlIGJlYW5BdHRyaUNvbDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSb2xlQmVhbkZlYXR1cmVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CRUFOX0ZFQVRVUkU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExCZWFuRmVhdHVyZSBnZXRCZWFuQXR0cmlDb2woKSB7CisJCWlmIChiZWFuQXR0cmlDb2wgIT0gbnVsbCAmJiBiZWFuQXR0cmlDb2wuZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZEJlYW5BdHRyaUNvbCA9IChJbnRlcm5hbEVPYmplY3QpYmVhbkF0dHJpQ29sOworCQkJYmVhbkF0dHJpQ29sID0gKExCZWFuRmVhdHVyZSllUmVzb2x2ZVByb3h5KG9sZEJlYW5BdHRyaUNvbCk7CisJCQlpZiAoYmVhbkF0dHJpQ29sICE9IG9sZEJlYW5BdHRyaUNvbCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9GRUFUVVJFX19CRUFOX0FUVFJJX0NPTCwgb2xkQmVhbkF0dHJpQ29sLCBiZWFuQXR0cmlDb2wpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmVhbkF0dHJpQ29sOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMQmVhbkZlYXR1cmUgYmFzaWNHZXRCZWFuQXR0cmlDb2woKSB7CisJCXJldHVybiBiZWFuQXR0cmlDb2w7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmVhbkF0dHJpQ29sKExCZWFuRmVhdHVyZSBuZXdCZWFuQXR0cmlDb2wpIHsKKwkJTEJlYW5GZWF0dXJlIG9sZEJlYW5BdHRyaUNvbCA9IGJlYW5BdHRyaUNvbDsKKwkJYmVhbkF0dHJpQ29sID0gbmV3QmVhbkF0dHJpQ29sOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0wsIG9sZEJlYW5BdHRyaUNvbCwgYmVhbkF0dHJpQ29sKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0w6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRCZWFuQXR0cmlDb2woKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRCZWFuQXR0cmlDb2woKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0w6CisJCQkJc2V0QmVhbkF0dHJpQ29sKChMQmVhbkZlYXR1cmUpbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9GRUFUVVJFX19CRUFOX0FUVFJJX0NPTDoKKwkJCQlzZXRCZWFuQXR0cmlDb2woKExCZWFuRmVhdHVyZSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX0ZFQVRVUkVfX0JFQU5fQVRUUklfQ09MOgorCQkJCXJldHVybiBiZWFuQXR0cmlDb2wgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUm9sZUJlYW5GZWF0dXJlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJlYW5JbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmVhbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTRmM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJlYW5JbXBsLmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxCZWFuOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgQmVhbjwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5JbXBsI2dldEJlYW5BdXRob3JpemVkIDxlbT5CZWFuIEF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuSW1wbCNnZXRCZWFuRmVhdHVyZXMgPGVtPkJlYW4gRmVhdHVyZXM8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCZWFuSW1wbCNnZXRCZWFuUmVmIDxlbT5CZWFuIFJlZjwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVCZWFuSW1wbCBleHRlbmRzIFJvbGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGVCZWFuIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuQXV0aG9yaXplZCgpIDxlbT5CZWFuIEF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0QmVhbkF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlRW51bT4gYmVhbkF1dGhvcml6ZWQ7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuRmVhdHVyZXMoKSA8ZW0+QmVhbiBGZWF0dXJlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRCZWFuRmVhdHVyZXMoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlQmVhbkZlYXR1cmU+IGJlYW5GZWF0dXJlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEJlYW5SZWYoKSA8ZW0+QmVhbiBSZWY8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJlYW5SZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMQmVhbiBiZWFuUmVmOworCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHJvdGVjdGVkIFJvbGVCZWFuSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8Um9sZUVudW0+IGdldEJlYW5BdXRob3JpemVkKCkgeworCQlpZiAoYmVhbkF1dGhvcml6ZWQgPT0gbnVsbCkgeworCQkJYmVhbkF1dGhvcml6ZWQgPSBuZXcgRURhdGFUeXBlRUxpc3Q8Um9sZUVudW0+KFJvbGVFbnVtLmNsYXNzLCB0aGlzLCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRCk7CisJCX0KKwkJcmV0dXJuIGJlYW5BdXRob3JpemVkOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxSb2xlQmVhbkZlYXR1cmU+IGdldEJlYW5GZWF0dXJlcygpIHsKKwkJaWYgKGJlYW5GZWF0dXJlcyA9PSBudWxsKSB7CisJCQliZWFuRmVhdHVyZXMgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50RUxpc3Q8Um9sZUJlYW5GZWF0dXJlPihSb2xlQmVhbkZlYXR1cmUuY2xhc3MsIHRoaXMsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9fQkVBTl9GRUFUVVJFUyk7CisJCX0KKwkJcmV0dXJuIGJlYW5GZWF0dXJlczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEJlYW4gZ2V0QmVhblJlZigpIHsKKwkJaWYgKGJlYW5SZWYgIT0gbnVsbCAmJiBiZWFuUmVmLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRCZWFuUmVmID0gKEludGVybmFsRU9iamVjdCliZWFuUmVmOworCQkJYmVhblJlZiA9IChMQmVhbillUmVzb2x2ZVByb3h5KG9sZEJlYW5SZWYpOworCQkJaWYgKGJlYW5SZWYgIT0gb2xkQmVhblJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9fQkVBTl9SRUYsIG9sZEJlYW5SZWYsIGJlYW5SZWYpKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gYmVhblJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEJlYW4gYmFzaWNHZXRCZWFuUmVmKCkgeworCQlyZXR1cm4gYmVhblJlZjsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRCZWFuUmVmKExCZWFuIG5ld0JlYW5SZWYpIHsKKwkJTEJlYW4gb2xkQmVhblJlZiA9IGJlYW5SZWY7CisJCWJlYW5SZWYgPSBuZXdCZWFuUmVmOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fUkVGLCBvbGRCZWFuUmVmLCBiZWFuUmVmKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fRkVBVFVSRVM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRCZWFuRmVhdHVyZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9fQkVBTl9BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXRCZWFuQXV0aG9yaXplZCgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fRkVBVFVSRVM6CisJCQkJcmV0dXJuIGdldEJlYW5GZWF0dXJlcygpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fUkVGOgorCQkJCWlmIChyZXNvbHZlKSByZXR1cm4gZ2V0QmVhblJlZigpOworCQkJCXJldHVybiBiYXNpY0dldEJlYW5SZWYoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRDoKKwkJCQlnZXRCZWFuQXV0aG9yaXplZCgpLmNsZWFyKCk7CisJCQkJZ2V0QmVhbkF1dGhvcml6ZWQoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVFbnVtPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fRkVBVFVSRVM6CisJCQkJZ2V0QmVhbkZlYXR1cmVzKCkuY2xlYXIoKTsKKwkJCQlnZXRCZWFuRmVhdHVyZXMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVCZWFuRmVhdHVyZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX19CRUFOX1JFRjoKKwkJCQlzZXRCZWFuUmVmKChMQmVhbiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX19CRUFOX0FVVEhPUklaRUQ6CisJCQkJZ2V0QmVhbkF1dGhvcml6ZWQoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX19CRUFOX0ZFQVRVUkVTOgorCQkJCWdldEJlYW5GZWF0dXJlcygpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fUkVGOgorCQkJCXNldEJlYW5SZWYoKExCZWFuKW51bGwpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fQVVUSE9SSVpFRDoKKwkJCQlyZXR1cm4gYmVhbkF1dGhvcml6ZWQgIT0gbnVsbCAmJiAhYmVhbkF1dGhvcml6ZWQuaXNFbXB0eSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fRkVBVFVSRVM6CisJCQkJcmV0dXJuIGJlYW5GZWF0dXJlcyAhPSBudWxsICYmICFiZWFuRmVhdHVyZXMuaXNFbXB0eSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fX0JFQU5fUkVGOgorCQkJCXJldHVybiBiZWFuUmVmICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChiZWFuQXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQoYmVhbkF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlQmVhbkltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCZWFuUmVmZXJlbmNlSW1wbC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJlYW5SZWZlcmVuY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5YjJkZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCZWFuUmVmZXJlbmNlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuUmVmZXJlbmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBCZWFuIFJlZmVyZW5jZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJlYW5SZWZlcmVuY2VJbXBsI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlQmVhblJlZmVyZW5jZUltcGwgZXh0ZW5kcyBSb2xlQmVhbkZlYXR1cmVJbXBsIGltcGxlbWVudHMgUm9sZUJlYW5SZWZlcmVuY2UgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSb2xlUHJvcGVydHlFbnVtIEJFQU5fQVRUUklfVU5BVVRIT1JJWkVEX0VERUZBVUxUID0gUm9sZVByb3BlcnR5RW51bS5JTlZJU0lCTEU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSA8ZW0+QmVhbiBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEJlYW5BdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIFJvbGVQcm9wZXJ0eUVudW0gYmVhbkF0dHJpVW5hdXRob3JpemVkID0gQkVBTl9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUJlYW5SZWZlcmVuY2VJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CRUFOX1JFRkVSRU5DRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZVByb3BlcnR5RW51bSBnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKFJvbGVQcm9wZXJ0eUVudW0gbmV3QmVhbkF0dHJpVW5hdXRob3JpemVkKSB7CisJCVJvbGVQcm9wZXJ0eUVudW0gb2xkQmVhbkF0dHJpVW5hdXRob3JpemVkID0gYmVhbkF0dHJpVW5hdXRob3JpemVkOworCQliZWFuQXR0cmlVbmF1dGhvcml6ZWQgPSBuZXdCZWFuQXR0cmlVbmF1dGhvcml6ZWQgPT0gbnVsbCA/IEJFQU5fQVRUUklfVU5BVVRIT1JJWkVEX0VERUZBVUxUIDogbmV3QmVhbkF0dHJpVW5hdXRob3JpemVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fUkVGRVJFTkNFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCwgb2xkQmVhbkF0dHJpVW5hdXRob3JpemVkLCBiZWFuQXR0cmlVbmF1dGhvcml6ZWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JFQU5fUkVGRVJFTkNFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWQoKFJvbGVQcm9wZXJ0eUVudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXNldEJlYW5BdHRyaVVuYXV0aG9yaXplZChCRUFOX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9SRUZFUkVOQ0VfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBiZWFuQXR0cmlVbmF1dGhvcml6ZWQgIT0gQkVBTl9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChiZWFuQXR0cmlVbmF1dGhvcml6ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGJlYW5BdHRyaVVuYXV0aG9yaXplZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JvbGVCZWFuUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmxpcEFsbFVzZXJUYXNrc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjAxNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBCbGlwIEFsbCBVc2VyIFRhc2tzPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlQmxpcEFsbFVzZXJUYXNrc0ltcGwjZ2V0QXV0aG9yaXplZCA8ZW0+QXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVCbGlwQWxsVXNlclRhc2tzSW1wbCBleHRlbmRzIFJvbGVFbGVtZW50SW1wbCBpbXBsZW1lbnRzIFJvbGVCbGlwQWxsVXNlclRhc2tzIHsKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yaXplZCgpIDxlbT5BdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJvbGVCbGlwVXNlclRhc2tFbnVtIEFVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlQmxpcFVzZXJUYXNrRW51bS5FWEVDVVRBQkxFOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXV0aG9yaXplZCgpIDxlbT5BdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUJsaXBVc2VyVGFza0VudW0gYXV0aG9yaXplZCA9IEFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUJsaXBBbGxVc2VyVGFza3NJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CTElQX0FMTF9VU0VSX1RBU0tTOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlQmxpcFVzZXJUYXNrRW51bSBnZXRBdXRob3JpemVkKCkgeworCQlyZXR1cm4gYXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRBdXRob3JpemVkKFJvbGVCbGlwVXNlclRhc2tFbnVtIG5ld0F1dGhvcml6ZWQpIHsKKwkJUm9sZUJsaXBVc2VyVGFza0VudW0gb2xkQXV0aG9yaXplZCA9IGF1dGhvcml6ZWQ7CisJCWF1dGhvcml6ZWQgPSBuZXdBdXRob3JpemVkID09IG51bGwgPyBBVVRIT1JJWkVEX0VERUZBVUxUIDogbmV3QXV0aG9yaXplZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX0FMTF9VU0VSX1RBU0tTX19BVVRIT1JJWkVELCBvbGRBdXRob3JpemVkLCBhdXRob3JpemVkKSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGdldEF1dGhvcml6ZWQoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfX0FVVEhPUklaRUQ6CisJCQkJc2V0QXV0aG9yaXplZCgoUm9sZUJsaXBVc2VyVGFza0VudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9BTExfVVNFUl9UQVNLU19fQVVUSE9SSVpFRDoKKwkJCQlzZXRBdXRob3JpemVkKEFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGF1dGhvcml6ZWQgIT0gQVVUSE9SSVpFRF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcml6ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlQmxpcEFsbFVzZXJUYXNrc0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCbGlwUHJvY2Vzc0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCbGlwUHJvY2Vzc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDBkOTFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUJsaXBQcm9jZXNzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMzYzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50RUxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBBbGxVc2VyVGFza3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzazsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBCbGlwIFByb2Nlc3M8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwUHJvY2Vzc0ltcGwjZ2V0UHJvY2VzcyA8ZW0+UHJvY2VzczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBQcm9jZXNzSW1wbCNnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkIDxlbT5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVCbGlwUHJvY2Vzc0ltcGwjZ2V0QWxsVXNlclRhc2tzIDxlbT5BbGwgVXNlciBUYXNrczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBQcm9jZXNzSW1wbCNnZXRVc2VyVGFza3MgPGVtPlVzZXIgVGFza3M8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlQmxpcFByb2Nlc3NJbXBsIGV4dGVuZHMgUm9sZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUm9sZUJsaXBQcm9jZXNzIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQcm9jZXNzKCkgPGVtPlByb2Nlc3M8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2Nlc3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBCbGlwIHByb2Nlc3M7CisKKwkvKioKKwkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCgpIDxlbT5Qcm9jZXNzIFN0YXJ0IEF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldFByb2Nlc3NTdGFydEF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUm9sZUJsaXBQcm9jZXNzRW51bSBQUk9DRVNTX1NUQVJUX0FVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlQmxpcFByb2Nlc3NFbnVtLlNUQVJUQUJMRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFByb2Nlc3NTdGFydEF1dGhvcml6ZWQoKSA8ZW0+UHJvY2VzcyBTdGFydCBBdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUJsaXBQcm9jZXNzRW51bSBwcm9jZXNzU3RhcnRBdXRob3JpemVkID0gUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEX0VERUZBVUxUOworCisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QWxsVXNlclRhc2tzKCkgPGVtPkFsbCBVc2VyIFRhc2tzPC9lbT59JyBjb250YWlubWVudCByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRBbGxVc2VyVGFza3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSb2xlQmxpcEFsbFVzZXJUYXNrcyBhbGxVc2VyVGFza3M7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRVc2VyVGFza3MoKSA8ZW0+VXNlciBUYXNrczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVc2VyVGFza3MoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlQmxpcFVzZXJUYXNrPiB1c2VyVGFza3M7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUJsaXBQcm9jZXNzSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkxJUF9QUk9DRVNTOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCbGlwIGdldFByb2Nlc3MoKSB7CisJCWlmIChwcm9jZXNzICE9IG51bGwgJiYgcHJvY2Vzcy5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkUHJvY2VzcyA9IChJbnRlcm5hbEVPYmplY3QpcHJvY2VzczsKKwkJCXByb2Nlc3MgPSAoQmxpcCllUmVzb2x2ZVByb3h5KG9sZFByb2Nlc3MpOworCQkJaWYgKHByb2Nlc3MgIT0gb2xkUHJvY2VzcykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19QUk9DRVNTLCBvbGRQcm9jZXNzLCBwcm9jZXNzKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHByb2Nlc3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJsaXAgYmFzaWNHZXRQcm9jZXNzKCkgeworCQlyZXR1cm4gcHJvY2VzczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzKEJsaXAgbmV3UHJvY2VzcykgeworCQlCbGlwIG9sZFByb2Nlc3MgPSBwcm9jZXNzOworCQlwcm9jZXNzID0gbmV3UHJvY2VzczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1BST0NFU1MsIG9sZFByb2Nlc3MsIHByb2Nlc3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJsaXBQcm9jZXNzRW51bSBnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkKCkgeworCQlyZXR1cm4gcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkKFJvbGVCbGlwUHJvY2Vzc0VudW0gbmV3UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCkgeworCQlSb2xlQmxpcFByb2Nlc3NFbnVtIG9sZFByb2Nlc3NTdGFydEF1dGhvcml6ZWQgPSBwcm9jZXNzU3RhcnRBdXRob3JpemVkOworCQlwcm9jZXNzU3RhcnRBdXRob3JpemVkID0gbmV3UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCA9PSBudWxsID8gUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEX0VERUZBVUxUIDogbmV3UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZDsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1BST0NFU1NfU1RBUlRfQVVUSE9SSVpFRCwgb2xkUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCwgcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBSb2xlQmxpcEFsbFVzZXJUYXNrcyBnZXRBbGxVc2VyVGFza3MoKSB7CisJCXJldHVybiBhbGxVc2VyVGFza3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QWxsVXNlclRhc2tzKFJvbGVCbGlwQWxsVXNlclRhc2tzIG5ld0FsbFVzZXJUYXNrcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgeworCQlSb2xlQmxpcEFsbFVzZXJUYXNrcyBvbGRBbGxVc2VyVGFza3MgPSBhbGxVc2VyVGFza3M7CisJCWFsbFVzZXJUYXNrcyA9IG5ld0FsbFVzZXJUYXNrczsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7CisJCQlFTm90aWZpY2F0aW9uSW1wbCBub3RpZmljYXRpb24gPSBuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX0FMTF9VU0VSX1RBU0tTLCBvbGRBbGxVc2VyVGFza3MsIG5ld0FsbFVzZXJUYXNrcyk7CisJCQlpZiAobXNncyA9PSBudWxsKSBtc2dzID0gbm90aWZpY2F0aW9uOyBlbHNlIG1zZ3MuYWRkKG5vdGlmaWNhdGlvbik7CisJCX0KKwkJcmV0dXJuIG1zZ3M7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QWxsVXNlclRhc2tzKFJvbGVCbGlwQWxsVXNlclRhc2tzIG5ld0FsbFVzZXJUYXNrcykgeworCQlpZiAobmV3QWxsVXNlclRhc2tzICE9IGFsbFVzZXJUYXNrcykgeworCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7CisJCQlpZiAoYWxsVXNlclRhc2tzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KWFsbFVzZXJUYXNrcykuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUywgbnVsbCwgbXNncyk7CisJCQlpZiAobmV3QWxsVXNlclRhc2tzICE9IG51bGwpCisJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KW5ld0FsbFVzZXJUYXNrcykuZUludmVyc2VBZGQodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUywgbnVsbCwgbXNncyk7CisJCQltc2dzID0gYmFzaWNTZXRBbGxVc2VyVGFza3MobmV3QWxsVXNlclRhc2tzLCBtc2dzKTsKKwkJCWlmIChtc2dzICE9IG51bGwpIG1zZ3MuZGlzcGF0Y2goKTsKKwkJfQorCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUywgbmV3QWxsVXNlclRhc2tzLCBuZXdBbGxVc2VyVGFza3MpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgRUxpc3Q8Um9sZUJsaXBVc2VyVGFzaz4gZ2V0VXNlclRhc2tzKCkgeworCQlpZiAodXNlclRhc2tzID09IG51bGwpIHsKKwkJCXVzZXJUYXNrcyA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRFTGlzdDxSb2xlQmxpcFVzZXJUYXNrPihSb2xlQmxpcFVzZXJUYXNrLmNsYXNzLCB0aGlzLCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTU19fVVNFUl9UQVNLUyk7CisJCX0KKwkJcmV0dXJuIHVzZXJUYXNrczsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUzoKKwkJCQlyZXR1cm4gYmFzaWNTZXRBbGxVc2VyVGFza3MobnVsbCwgbXNncyk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19VU0VSX1RBU0tTOgorCQkJCXJldHVybiAoKEludGVybmFsRUxpc3Q8Pz4pZ2V0VXNlclRhc2tzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTUzoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFByb2Nlc3MoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRQcm9jZXNzKCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19QUk9DRVNTX1NUQVJUX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGdldFByb2Nlc3NTdGFydEF1dGhvcml6ZWQoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX0FMTF9VU0VSX1RBU0tTOgorCQkJCXJldHVybiBnZXRBbGxVc2VyVGFza3MoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1VTRVJfVEFTS1M6CisJCQkJcmV0dXJuIGdldFVzZXJUYXNrcygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19QUk9DRVNTOgorCQkJCXNldFByb2Nlc3MoKEJsaXApbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1BST0NFU1NfU1RBUlRfQVVUSE9SSVpFRDoKKwkJCQlzZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkKChSb2xlQmxpcFByb2Nlc3NFbnVtKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19BTExfVVNFUl9UQVNLUzoKKwkJCQlzZXRBbGxVc2VyVGFza3MoKFJvbGVCbGlwQWxsVXNlclRhc2tzKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19VU0VSX1RBU0tTOgorCQkJCWdldFVzZXJUYXNrcygpLmNsZWFyKCk7CisJCQkJZ2V0VXNlclRhc2tzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlQmxpcFVzZXJUYXNrPiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1BST0NFU1M6CisJCQkJc2V0UHJvY2VzcygoQmxpcCludWxsKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9QUk9DRVNTX19QUk9DRVNTX1NUQVJUX0FVVEhPUklaRUQ6CisJCQkJc2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZChQUk9DRVNTX1NUQVJUX0FVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX0FMTF9VU0VSX1RBU0tTOgorCQkJCXNldEFsbFVzZXJUYXNrcygoUm9sZUJsaXBBbGxVc2VyVGFza3MpbnVsbCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTU19fVVNFUl9UQVNLUzoKKwkJCQlnZXRVc2VyVGFza3MoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTUzoKKwkJCQlyZXR1cm4gcHJvY2VzcyAhPSBudWxsOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTU19fUFJPQ0VTU19TVEFSVF9BVVRIT1JJWkVEOgorCQkJCXJldHVybiBwcm9jZXNzU3RhcnRBdXRob3JpemVkICE9IFBST0NFU1NfU1RBUlRfQVVUSE9SSVpFRF9FREVGQVVMVDsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX0FMTF9VU0VSX1RBU0tTOgorCQkJCXJldHVybiBhbGxVc2VyVGFza3MgIT0gbnVsbDsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1BST0NFU1NfX1VTRVJfVEFTS1M6CisJCQkJcmV0dXJuIHVzZXJUYXNrcyAhPSBudWxsICYmICF1c2VyVGFza3MuaXNFbXB0eSgpOworCQl9CisJCXJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworCQlpZiAoZUlzUHJveHkoKSkgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisKKwkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7CisJCXJlc3VsdC5hcHBlbmQoIiAocHJvY2Vzc1N0YXJ0QXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQocHJvY2Vzc1N0YXJ0QXV0aG9yaXplZCk7CisJCXJlc3VsdC5hcHBlbmQoJyknKTsKKwkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworCX0KKworfSAvL1JvbGVCbGlwUHJvY2Vzc0ltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVCbGlwVXNlclRhc2tJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmxpcFVzZXJUYXNrSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDk3NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlQmxpcFVzZXJUYXNrSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFzazsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBVc2VyVGFza0VudW07CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+Um9sZSBCbGlwIFVzZXIgVGFzazwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBVc2VyVGFza0ltcGwjZ2V0VXNlclRhc2sgPGVtPlVzZXIgVGFzazwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUJsaXBVc2VyVGFza0ltcGwjZ2V0QXV0aG9yaXplZCA8ZW0+QXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVCbGlwVXNlclRhc2tJbXBsIGV4dGVuZHMgUm9sZUVsZW1lbnRJbXBsIGltcGxlbWVudHMgUm9sZUJsaXBVc2VyVGFzayB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0VXNlclRhc2soKSA8ZW0+VXNlciBUYXNrPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRVc2VyVGFzaygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEJsaXBVc2VyVGFzayB1c2VyVGFzazsKKworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemVkKCkgPGVtPkF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgUm9sZUJsaXBVc2VyVGFza0VudW0gQVVUSE9SSVpFRF9FREVGQVVMVCA9IFJvbGVCbGlwVXNlclRhc2tFbnVtLkVYRUNVVEFCTEU7CisKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdXRob3JpemVkKCkgPGVtPkF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBSb2xlQmxpcFVzZXJUYXNrRW51bSBhdXRob3JpemVkID0gQVVUSE9SSVpFRF9FREVGQVVMVDsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSb2xlQmxpcFVzZXJUYXNrSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkxJUF9VU0VSX1RBU0s7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEJsaXBVc2VyVGFzayBnZXRVc2VyVGFzaygpIHsKKwkJaWYgKHVzZXJUYXNrICE9IG51bGwgJiYgdXNlclRhc2suZUlzUHJveHkoKSkgeworCQkJSW50ZXJuYWxFT2JqZWN0IG9sZFVzZXJUYXNrID0gKEludGVybmFsRU9iamVjdCl1c2VyVGFzazsKKwkJCXVzZXJUYXNrID0gKEJsaXBVc2VyVGFzayllUmVzb2x2ZVByb3h5KG9sZFVzZXJUYXNrKTsKKwkJCWlmICh1c2VyVGFzayAhPSBvbGRVc2VyVGFzaykgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX1VTRVJfVEFTSywgb2xkVXNlclRhc2ssIHVzZXJUYXNrKSk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHVzZXJUYXNrOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBCbGlwVXNlclRhc2sgYmFzaWNHZXRVc2VyVGFzaygpIHsKKwkJcmV0dXJuIHVzZXJUYXNrOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldFVzZXJUYXNrKEJsaXBVc2VyVGFzayBuZXdVc2VyVGFzaykgeworCQlCbGlwVXNlclRhc2sgb2xkVXNlclRhc2sgPSB1c2VyVGFzazsKKwkJdXNlclRhc2sgPSBuZXdVc2VyVGFzazsKKwkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQorCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1VTRVJfVEFTS19fVVNFUl9UQVNLLCBvbGRVc2VyVGFzaywgdXNlclRhc2spKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgUm9sZUJsaXBVc2VyVGFza0VudW0gZ2V0QXV0aG9yaXplZCgpIHsKKwkJcmV0dXJuIGF1dGhvcml6ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0QXV0aG9yaXplZChSb2xlQmxpcFVzZXJUYXNrRW51bSBuZXdBdXRob3JpemVkKSB7CisJCVJvbGVCbGlwVXNlclRhc2tFbnVtIG9sZEF1dGhvcml6ZWQgPSBhdXRob3JpemVkOworCQlhdXRob3JpemVkID0gbmV3QXV0aG9yaXplZCA9PSBudWxsID8gQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0F1dGhvcml6ZWQ7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQsIG9sZEF1dGhvcml6ZWQsIGF1dGhvcml6ZWQpKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX1VTRVJfVEFTSzoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldFVzZXJUYXNrKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0VXNlclRhc2soKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1VTRVJfVEFTS19fQVVUSE9SSVpFRDoKKwkJCQlyZXR1cm4gZ2V0QXV0aG9yaXplZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX1VTRVJfVEFTSzoKKwkJCQlzZXRVc2VyVGFzaygoQmxpcFVzZXJUYXNrKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQ6CisJCQkJc2V0QXV0aG9yaXplZCgoUm9sZUJsaXBVc2VyVGFza0VudW0pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lU2V0KGZlYXR1cmVJRCwgbmV3VmFsdWUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVVbnNldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX1VTRVJfVEFTSzoKKwkJCQlzZXRVc2VyVGFzaygoQmxpcFVzZXJUYXNrKW51bGwpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CTElQX1VTRVJfVEFTS19fQVVUSE9SSVpFRDoKKwkJCQlzZXRBdXRob3JpemVkKEFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLX19VU0VSX1RBU0s6CisJCQkJcmV0dXJuIHVzZXJUYXNrICE9IG51bGw7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGF1dGhvcml6ZWQgIT0gQVVUSE9SSVpFRF9FREVGQVVMVDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGF1dGhvcml6ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlQmxpcFVzZXJUYXNrSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUR0b0F0dHJpYnV0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9BdHRyaWJ1dGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcxMzMzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9BdHRyaWJ1dGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0F0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRHRvIEF0dHJpYnV0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0F0dHJpYnV0ZUltcGwjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlRHRvQXR0cmlidXRlSW1wbCBleHRlbmRzIFJvbGVEdG9GZWF0dXJlSW1wbCBpbXBsZW1lbnRzIFJvbGVEdG9BdHRyaWJ1dGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpIDxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSb2xlUHJvcGVydHlFbnVtIERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlUHJvcGVydHlFbnVtLklOVklTSUJMRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZVByb3BlcnR5RW51bSBkdG9BdHRyaVVuYXV0aG9yaXplZCA9IERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUR0b0F0dHJpYnV0ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0RUT19BVFRSSUJVVEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiBkdG9BdHRyaVVuYXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIG5ld0R0b0F0dHJpVW5hdXRob3JpemVkKSB7CisJCVJvbGVQcm9wZXJ0eUVudW0gb2xkRHRvQXR0cmlVbmF1dGhvcml6ZWQgPSBkdG9BdHRyaVVuYXV0aG9yaXplZDsKKwkJZHRvQXR0cmlVbmF1dGhvcml6ZWQgPSBuZXdEdG9BdHRyaVVuYXV0aG9yaXplZCA9PSBudWxsID8gRFRPX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0R0b0F0dHJpVW5hdXRob3JpemVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19BVFRSSUJVVEVfX0RUT19BVFRSSV9VTkFVVEhPUklaRUQsIG9sZER0b0F0dHJpVW5hdXRob3JpemVkLCBkdG9BdHRyaVVuYXV0aG9yaXplZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fQVRUUklCVVRFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0FUVFJJQlVURV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXREdG9BdHRyaVVuYXV0aG9yaXplZCgoUm9sZVByb3BlcnR5RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fQVRUUklCVVRFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXNldER0b0F0dHJpVW5hdXRob3JpemVkKERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19BVFRSSUJVVEVfX0RUT19BVFRSSV9VTkFVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGR0b0F0dHJpVW5hdXRob3JpemVkICE9IERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkdG9BdHRyaVVuYXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQoZHRvQXR0cmlVbmF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRHRvQXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUR0b0ZlYXR1cmVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlRHRvRmVhdHVyZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGJmZDIwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUR0b0ZlYXR1cmVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG9GZWF0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvRmVhdHVyZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRHRvIEZlYXR1cmU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVEdG9GZWF0dXJlSW1wbCNnZXREdG9BdHRyaUNvbCA8ZW0+RHRvIEF0dHJpIENvbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVEdG9GZWF0dXJlSW1wbCBleHRlbmRzIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUm9sZUR0b0ZlYXR1cmUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER0b0F0dHJpQ29sKCkgPGVtPkR0byBBdHRyaSBDb2w8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER0b0F0dHJpQ29sKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTER0b0ZlYXR1cmUgZHRvQXR0cmlDb2w7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUR0b0ZlYXR1cmVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9EVE9fRkVBVFVSRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTER0b0ZlYXR1cmUgZ2V0RHRvQXR0cmlDb2woKSB7CisJCWlmIChkdG9BdHRyaUNvbCAhPSBudWxsICYmIGR0b0F0dHJpQ29sLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGREdG9BdHRyaUNvbCA9IChJbnRlcm5hbEVPYmplY3QpZHRvQXR0cmlDb2w7CisJCQlkdG9BdHRyaUNvbCA9IChMRHRvRmVhdHVyZSllUmVzb2x2ZVByb3h5KG9sZER0b0F0dHJpQ29sKTsKKwkJCWlmIChkdG9BdHRyaUNvbCAhPSBvbGREdG9BdHRyaUNvbCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0ZFQVRVUkVfX0RUT19BVFRSSV9DT0wsIG9sZER0b0F0dHJpQ29sLCBkdG9BdHRyaUNvbCkpOworCQkJfQorCQl9CisJCXJldHVybiBkdG9BdHRyaUNvbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTER0b0ZlYXR1cmUgYmFzaWNHZXREdG9BdHRyaUNvbCgpIHsKKwkJcmV0dXJuIGR0b0F0dHJpQ29sOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldER0b0F0dHJpQ29sKExEdG9GZWF0dXJlIG5ld0R0b0F0dHJpQ29sKSB7CisJCUxEdG9GZWF0dXJlIG9sZER0b0F0dHJpQ29sID0gZHRvQXR0cmlDb2w7CisJCWR0b0F0dHJpQ29sID0gbmV3RHRvQXR0cmlDb2w7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0ZFQVRVUkVfX0RUT19BVFRSSV9DT0wsIG9sZER0b0F0dHJpQ29sLCBkdG9BdHRyaUNvbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldER0b0F0dHJpQ29sKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RHRvQXR0cmlDb2woKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19GRUFUVVJFX19EVE9fQVRUUklfQ09MOgorCQkJCXNldER0b0F0dHJpQ29sKChMRHRvRmVhdHVyZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTDoKKwkJCQlzZXREdG9BdHRyaUNvbCgoTER0b0ZlYXR1cmUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0ZFQVRVUkVfX0RUT19BVFRSSV9DT0w6CisJCQkJcmV0dXJuIGR0b0F0dHJpQ29sICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1JvbGVEdG9GZWF0dXJlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUR0b0ltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3NWQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9JbXBsLmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG87CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG87CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRHRvPC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRHRvSW1wbCNnZXREdG9BdXRob3JpemVkIDxlbT5EdG8gQXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0ltcGwjZ2V0RHRvRmVhdHVyZXMgPGVtPkR0byBGZWF0dXJlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b0ltcGwjZ2V0RHRvUmVmIDxlbT5EdG8gUmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUm9sZUR0b0ltcGwgZXh0ZW5kcyBSb2xlRWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlRHRvIHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdG9BdXRob3JpemVkKCkgPGVtPkR0byBBdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER0b0F1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlRW51bT4gZHRvQXV0aG9yaXplZDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER0b0ZlYXR1cmVzKCkgPGVtPkR0byBGZWF0dXJlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREdG9GZWF0dXJlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFJvbGVEdG9GZWF0dXJlPiBkdG9GZWF0dXJlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER0b1JlZigpIDxlbT5EdG8gUmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREdG9SZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMRHRvIGR0b1JlZjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSb2xlRHRvSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRFRPOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxSb2xlRW51bT4gZ2V0RHRvQXV0aG9yaXplZCgpIHsKKwkJaWYgKGR0b0F1dGhvcml6ZWQgPT0gbnVsbCkgeworCQkJZHRvQXV0aG9yaXplZCA9IG5ldyBFRGF0YVR5cGVFTGlzdDxSb2xlRW51bT4oUm9sZUVudW0uY2xhc3MsIHRoaXMsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fQVVUSE9SSVpFRCk7CisJCX0KKwkJcmV0dXJuIGR0b0F1dGhvcml6ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFJvbGVEdG9GZWF0dXJlPiBnZXREdG9GZWF0dXJlcygpIHsKKwkJaWYgKGR0b0ZlYXR1cmVzID09IG51bGwpIHsKKwkJCWR0b0ZlYXR1cmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJvbGVEdG9GZWF0dXJlPihSb2xlRHRvRmVhdHVyZS5jbGFzcywgdGhpcywgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19GRUFUVVJFUyk7CisJCX0KKwkJcmV0dXJuIGR0b0ZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMRHRvIGdldER0b1JlZigpIHsKKwkJaWYgKGR0b1JlZiAhPSBudWxsICYmIGR0b1JlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRHRvUmVmID0gKEludGVybmFsRU9iamVjdClkdG9SZWY7CisJCQlkdG9SZWYgPSAoTER0byllUmVzb2x2ZVByb3h5KG9sZER0b1JlZik7CisJCQlpZiAoZHRvUmVmICE9IG9sZER0b1JlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fUkVGLCBvbGREdG9SZWYsIGR0b1JlZikpOworCQkJfQorCQl9CisJCXJldHVybiBkdG9SZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExEdG8gYmFzaWNHZXREdG9SZWYoKSB7CisJCXJldHVybiBkdG9SZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RHRvUmVmKExEdG8gbmV3RHRvUmVmKSB7CisJCUxEdG8gb2xkRHRvUmVmID0gZHRvUmVmOworCQlkdG9SZWYgPSBuZXdEdG9SZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fUkVGLCBvbGREdG9SZWYsIGR0b1JlZikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19GRUFUVVJFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldER0b0ZlYXR1cmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19fRFRPX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGdldER0b0F1dGhvcml6ZWQoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19GRUFUVVJFUzoKKwkJCQlyZXR1cm4gZ2V0RHRvRmVhdHVyZXMoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19SRUY6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXREdG9SZWYoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXREdG9SZWYoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19fRFRPX0FVVEhPUklaRUQ6CisJCQkJZ2V0RHRvQXV0aG9yaXplZCgpLmNsZWFyKCk7CisJCQkJZ2V0RHRvQXV0aG9yaXplZCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZUVudW0+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fRkVBVFVSRVM6CisJCQkJZ2V0RHRvRmVhdHVyZXMoKS5jbGVhcigpOworCQkJCWdldER0b0ZlYXR1cmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRHRvRmVhdHVyZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19SRUY6CisJCQkJc2V0RHRvUmVmKChMRHRvKW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19fRFRPX0FVVEhPUklaRUQ6CisJCQkJZ2V0RHRvQXV0aG9yaXplZCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19fRFRPX0ZFQVRVUkVTOgorCQkJCWdldER0b0ZlYXR1cmVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fUkVGOgorCQkJCXNldER0b1JlZigoTER0byludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fX0RUT19BVVRIT1JJWkVEOgorCQkJCXJldHVybiBkdG9BdXRob3JpemVkICE9IG51bGwgJiYgIWR0b0F1dGhvcml6ZWQuaXNFbXB0eSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19fRFRPX0ZFQVRVUkVTOgorCQkJCXJldHVybiBkdG9GZWF0dXJlcyAhPSBudWxsICYmICFkdG9GZWF0dXJlcy5pc0VtcHR5KCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX19EVE9fUkVGOgorCQkJCXJldHVybiBkdG9SZWYgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGR0b0F1dGhvcml6ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGR0b0F1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRHRvSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUR0b1JlZmVyZW5jZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9SZWZlcmVuY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4NDg1YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVEdG9SZWZlcmVuY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b1JlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRHRvIFJlZmVyZW5jZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUR0b1JlZmVyZW5jZUltcGwjZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlRHRvUmVmZXJlbmNlSW1wbCBleHRlbmRzIFJvbGVEdG9GZWF0dXJlSW1wbCBpbXBsZW1lbnRzIFJvbGVEdG9SZWZlcmVuY2UgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpIDxlbT5EdG8gQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSb2xlUHJvcGVydHlFbnVtIERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlUHJvcGVydHlFbnVtLklOVklTSUJMRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkgPGVtPkR0byBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldER0b0F0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZVByb3BlcnR5RW51bSBkdG9BdHRyaVVuYXV0aG9yaXplZCA9IERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUR0b1JlZmVyZW5jZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0RUT19SRUZFUkVOQ0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiBkdG9BdHRyaVVuYXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXREdG9BdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIG5ld0R0b0F0dHJpVW5hdXRob3JpemVkKSB7CisJCVJvbGVQcm9wZXJ0eUVudW0gb2xkRHRvQXR0cmlVbmF1dGhvcml6ZWQgPSBkdG9BdHRyaVVuYXV0aG9yaXplZDsKKwkJZHRvQXR0cmlVbmF1dGhvcml6ZWQgPSBuZXdEdG9BdHRyaVVuYXV0aG9yaXplZCA9PSBudWxsID8gRFRPX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0R0b0F0dHJpVW5hdXRob3JpemVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19SRUZFUkVOQ0VfX0RUT19BVFRSSV9VTkFVVEhPUklaRUQsIG9sZER0b0F0dHJpVW5hdXRob3JpemVkLCBkdG9BdHRyaVVuYXV0aG9yaXplZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fUkVGRVJFTkNFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXREdG9BdHRyaVVuYXV0aG9yaXplZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX1JFRkVSRU5DRV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXREdG9BdHRyaVVuYXV0aG9yaXplZCgoUm9sZVByb3BlcnR5RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9EVE9fUkVGRVJFTkNFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXNldER0b0F0dHJpVW5hdXRob3JpemVkKERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19SRUZFUkVOQ0VfX0RUT19BVFRSSV9VTkFVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGR0b0F0dHJpVW5hdXRob3JpemVkICE9IERUT19BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChkdG9BdHRyaVVuYXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQoZHRvQXR0cmlVbmF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRHRvUmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVsZW1lbnRJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlRWxlbWVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmI1ZTUzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVsZW1lbnRJbXBsLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogIAorICogIGdlbmVyYXRlZCBmcm9tIEF1dGhvcml0YXJpb25EU0wueGNvcmUKKyAqIAorICogIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVsZW1lbnQ7CisKKy8qKgorICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Sb2xlIEVsZW1lbnQ8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlRWxlbWVudEltcGwgZXh0ZW5kcyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVySW1wbCBpbXBsZW1lbnRzIFJvbGVFbGVtZW50IHsKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUVsZW1lbnRJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9FTEVNRU5UOworCX0KKworfSAvL1JvbGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVudGl0eUF0dHJpYnV0ZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlBdHRyaWJ1dGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZhYThmZAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlBdHRyaWJ1dGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5IEF0dHJpYnV0ZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUF0dHJpYnV0ZUltcGwjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlRW50aXR5QXR0cmlidXRlSW1wbCBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJlSW1wbCBpbXBsZW1lbnRzIFJvbGVFbnRpdHlBdHRyaWJ1dGUgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpIDxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSb2xlUHJvcGVydHlFbnVtIEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlUHJvcGVydHlFbnVtLklOVklTSUJMRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKCkgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZVByb3BlcnR5RW51bSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA9IEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUVudGl0eUF0dHJpYnV0ZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0VOVElUWV9BVFRSSUJVVEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIG5ld0VudGl0eUF0dHJpVW5hdXRob3JpemVkKSB7CisJCVJvbGVQcm9wZXJ0eUVudW0gb2xkRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDsKKwkJZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPSBuZXdFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA9PSBudWxsID8gRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0VudGl0eUF0dHJpVW5hdXRob3JpemVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9BVFRSSUJVVEVfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQsIG9sZEVudGl0eUF0dHJpVW5hdXRob3JpemVkLCBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfQVRUUklCVVRFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX0FUVFJJQlVURV9fRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgoUm9sZVByb3BlcnR5RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfQVRUUklCVVRFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXNldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9BVFRSSUJVVEVfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGVudGl0eUF0dHJpVW5hdXRob3JpemVkICE9IEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQoZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRW50aXR5QXR0cmlidXRlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVudGl0eUZlYXR1cmVJbXBsLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZW1mLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvaW1wbC9Sb2xlRW50aXR5RmVhdHVyZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjhkOGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVudGl0eUZlYXR1cmVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlGZWF0dXJlOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RmVhdHVyZTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5IEZlYXR1cmU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVFbnRpdHlGZWF0dXJlSW1wbCNnZXRFbnRpdHlBdHRyaUNvbCA8ZW0+RW50aXR5IEF0dHJpIENvbDwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVFbnRpdHlGZWF0dXJlSW1wbCBleHRlbmRzIEF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgUm9sZUVudGl0eUZlYXR1cmUgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUF0dHJpQ29sKCkgPGVtPkVudGl0eSBBdHRyaSBDb2w8L2VtPn0nIHJlZmVyZW5jZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudGl0eUF0dHJpQ29sKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgTEVudGl0eUZlYXR1cmUgZW50aXR5QXR0cmlDb2w7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUVudGl0eUZlYXR1cmVJbXBsKCkgeworCQlzdXBlcigpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9FTlRJVFlfRkVBVFVSRTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEVudGl0eUZlYXR1cmUgZ2V0RW50aXR5QXR0cmlDb2woKSB7CisJCWlmIChlbnRpdHlBdHRyaUNvbCAhPSBudWxsICYmIGVudGl0eUF0dHJpQ29sLmVJc1Byb3h5KCkpIHsKKwkJCUludGVybmFsRU9iamVjdCBvbGRFbnRpdHlBdHRyaUNvbCA9IChJbnRlcm5hbEVPYmplY3QpZW50aXR5QXR0cmlDb2w7CisJCQllbnRpdHlBdHRyaUNvbCA9IChMRW50aXR5RmVhdHVyZSllUmVzb2x2ZVByb3h5KG9sZEVudGl0eUF0dHJpQ29sKTsKKwkJCWlmIChlbnRpdHlBdHRyaUNvbCAhPSBvbGRFbnRpdHlBdHRyaUNvbCkgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wsIG9sZEVudGl0eUF0dHJpQ29sLCBlbnRpdHlBdHRyaUNvbCkpOworCQkJfQorCQl9CisJCXJldHVybiBlbnRpdHlBdHRyaUNvbDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgTEVudGl0eUZlYXR1cmUgYmFzaWNHZXRFbnRpdHlBdHRyaUNvbCgpIHsKKwkJcmV0dXJuIGVudGl0eUF0dHJpQ29sOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyB2b2lkIHNldEVudGl0eUF0dHJpQ29sKExFbnRpdHlGZWF0dXJlIG5ld0VudGl0eUF0dHJpQ29sKSB7CisJCUxFbnRpdHlGZWF0dXJlIG9sZEVudGl0eUF0dHJpQ29sID0gZW50aXR5QXR0cmlDb2w7CisJCWVudGl0eUF0dHJpQ29sID0gbmV3RW50aXR5QXR0cmlDb2w7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wsIG9sZEVudGl0eUF0dHJpQ29sLCBlbnRpdHlBdHRyaUNvbCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfRkVBVFVSRV9fRU5USVRZX0FUVFJJX0NPTDoKKwkJCQlpZiAocmVzb2x2ZSkgcmV0dXJuIGdldEVudGl0eUF0dHJpQ29sKCk7CisJCQkJcmV0dXJuIGJhc2ljR2V0RW50aXR5QXR0cmlDb2woKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9GRUFUVVJFX19FTlRJVFlfQVRUUklfQ09MOgorCQkJCXNldEVudGl0eUF0dHJpQ29sKChMRW50aXR5RmVhdHVyZSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfRkVBVFVSRV9fRU5USVRZX0FUVFJJX0NPTDoKKwkJCQlzZXRFbnRpdHlBdHRyaUNvbCgoTEVudGl0eUZlYXR1cmUpbnVsbCk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVVbnNldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBib29sZWFuIGVJc1NldChpbnQgZmVhdHVyZUlEKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0w6CisJCQkJcmV0dXJuIGVudGl0eUF0dHJpQ29sICE9IG51bGw7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworfSAvL1JvbGVFbnRpdHlGZWF0dXJlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVudGl0eUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0ZjNjMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlJbXBsLmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FRGF0YVR5cGVFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHk7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlGZWF0dXJlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5PC9iPjwvZW0+Jy4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKKyAqIDx1bD4KKyAqICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbC5Sb2xlRW50aXR5SW1wbCNnZXRFbnRpdHlBdXRob3JpemVkIDxlbT5FbnRpdHkgQXV0aG9yaXplZDwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUltcGwjZ2V0RW50aXR5RmVhdHVyZXMgPGVtPkVudGl0eSBGZWF0dXJlczwvZW0+fTwvbGk+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eUltcGwjZ2V0RW50aXR5UmVmIDxlbT5FbnRpdHkgUmVmPC9lbT59PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGdlbmVyYXRlZAorICovCitwdWJsaWMgY2xhc3MgUm9sZUVudGl0eUltcGwgZXh0ZW5kcyBSb2xlRWxlbWVudEltcGwgaW1wbGVtZW50cyBSb2xlRW50aXR5IHsKKwkvKioKKwkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlBdXRob3JpemVkKCkgPGVtPkVudGl0eSBBdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUgbGlzdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudGl0eUF1dGhvcml6ZWQoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBFTGlzdDxSb2xlRW51bT4gZW50aXR5QXV0aG9yaXplZDsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUZlYXR1cmVzKCkgPGVtPkVudGl0eSBGZWF0dXJlczwvZW0+fScgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbnRpdHlGZWF0dXJlcygpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIEVMaXN0PFJvbGVFbnRpdHlGZWF0dXJlPiBlbnRpdHlGZWF0dXJlczsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eVJlZigpIDxlbT5FbnRpdHkgUmVmPC9lbT59JyByZWZlcmVuY2UuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbnRpdHlSZWYoKQorCSAqIEBnZW5lcmF0ZWQKKwkgKiBAb3JkZXJlZAorCSAqLworCXByb3RlY3RlZCBMRW50aXR5IGVudGl0eVJlZjsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSb2xlRW50aXR5SW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRU5USVRZOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBFTGlzdDxSb2xlRW51bT4gZ2V0RW50aXR5QXV0aG9yaXplZCgpIHsKKwkJaWYgKGVudGl0eUF1dGhvcml6ZWQgPT0gbnVsbCkgeworCQkJZW50aXR5QXV0aG9yaXplZCA9IG5ldyBFRGF0YVR5cGVFTGlzdDxSb2xlRW51bT4oUm9sZUVudW0uY2xhc3MsIHRoaXMsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfQVVUSE9SSVpFRCk7CisJCX0KKwkJcmV0dXJuIGVudGl0eUF1dGhvcml6ZWQ7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFJvbGVFbnRpdHlGZWF0dXJlPiBnZXRFbnRpdHlGZWF0dXJlcygpIHsKKwkJaWYgKGVudGl0eUZlYXR1cmVzID09IG51bGwpIHsKKwkJCWVudGl0eUZlYXR1cmVzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJvbGVFbnRpdHlGZWF0dXJlPihSb2xlRW50aXR5RmVhdHVyZS5jbGFzcywgdGhpcywgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9GRUFUVVJFUyk7CisJCX0KKwkJcmV0dXJuIGVudGl0eUZlYXR1cmVzOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBMRW50aXR5IGdldEVudGl0eVJlZigpIHsKKwkJaWYgKGVudGl0eVJlZiAhPSBudWxsICYmIGVudGl0eVJlZi5lSXNQcm94eSgpKSB7CisJCQlJbnRlcm5hbEVPYmplY3Qgb2xkRW50aXR5UmVmID0gKEludGVybmFsRU9iamVjdCllbnRpdHlSZWY7CisJCQllbnRpdHlSZWYgPSAoTEVudGl0eSllUmVzb2x2ZVByb3h5KG9sZEVudGl0eVJlZik7CisJCQlpZiAoZW50aXR5UmVmICE9IG9sZEVudGl0eVJlZikgeworCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfUkVGLCBvbGRFbnRpdHlSZWYsIGVudGl0eVJlZikpOworCQkJfQorCQl9CisJCXJldHVybiBlbnRpdHlSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIExFbnRpdHkgYmFzaWNHZXRFbnRpdHlSZWYoKSB7CisJCXJldHVybiBlbnRpdHlSZWY7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIHZvaWQgc2V0RW50aXR5UmVmKExFbnRpdHkgbmV3RW50aXR5UmVmKSB7CisJCUxFbnRpdHkgb2xkRW50aXR5UmVmID0gZW50aXR5UmVmOworCQllbnRpdHlSZWYgPSBuZXdFbnRpdHlSZWY7CisJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKKwkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfUkVGLCBvbGRFbnRpdHlSZWYsIGVudGl0eVJlZikpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9GRUFUVVJFUzoKKwkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0PD8+KWdldEVudGl0eUZlYXR1cmVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIE9iamVjdCBlR2V0KGludCBmZWF0dXJlSUQsIGJvb2xlYW4gcmVzb2x2ZSwgYm9vbGVhbiBjb3JlVHlwZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9fRU5USVRZX0FVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGdldEVudGl0eUF1dGhvcml6ZWQoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9GRUFUVVJFUzoKKwkJCQlyZXR1cm4gZ2V0RW50aXR5RmVhdHVyZXMoKTsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9SRUY6CisJCQkJaWYgKHJlc29sdmUpIHJldHVybiBnZXRFbnRpdHlSZWYoKTsKKwkJCQlyZXR1cm4gYmFzaWNHZXRFbnRpdHlSZWYoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlSUQsIHJlc29sdmUsIGNvcmVUeXBlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlU2V0KGludCBmZWF0dXJlSUQsIE9iamVjdCBuZXdWYWx1ZSkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9fRU5USVRZX0FVVEhPUklaRUQ6CisJCQkJZ2V0RW50aXR5QXV0aG9yaXplZCgpLmNsZWFyKCk7CisJCQkJZ2V0RW50aXR5QXV0aG9yaXplZCgpLmFkZEFsbCgoQ29sbGVjdGlvbjw/IGV4dGVuZHMgUm9sZUVudW0+KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfRkVBVFVSRVM6CisJCQkJZ2V0RW50aXR5RmVhdHVyZXMoKS5jbGVhcigpOworCQkJCWdldEVudGl0eUZlYXR1cmVzKCkuYWRkQWxsKChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBSb2xlRW50aXR5RmVhdHVyZT4pbmV3VmFsdWUpOworCQkJCXJldHVybjsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9SRUY6CisJCQkJc2V0RW50aXR5UmVmKChMRW50aXR5KW5ld1ZhbHVlKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVNldChmZWF0dXJlSUQsIG5ld1ZhbHVlKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgdm9pZCBlVW5zZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9fRU5USVRZX0FVVEhPUklaRUQ6CisJCQkJZ2V0RW50aXR5QXV0aG9yaXplZCgpLmNsZWFyKCk7CisJCQkJcmV0dXJuOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9fRU5USVRZX0ZFQVRVUkVTOgorCQkJCWdldEVudGl0eUZlYXR1cmVzKCkuY2xlYXIoKTsKKwkJCQlyZXR1cm47CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfUkVGOgorCQkJCXNldEVudGl0eVJlZigoTEVudGl0eSludWxsKTsKKwkJCQlyZXR1cm47CisJCX0KKwkJc3VwZXIuZVVuc2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIGJvb2xlYW4gZUlzU2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfX0VOVElUWV9BVVRIT1JJWkVEOgorCQkJCXJldHVybiBlbnRpdHlBdXRob3JpemVkICE9IG51bGwgJiYgIWVudGl0eUF1dGhvcml6ZWQuaXNFbXB0eSgpOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9fRU5USVRZX0ZFQVRVUkVTOgorCQkJCXJldHVybiBlbnRpdHlGZWF0dXJlcyAhPSBudWxsICYmICFlbnRpdHlGZWF0dXJlcy5pc0VtcHR5KCk7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX19FTlRJVFlfUkVGOgorCQkJCXJldHVybiBlbnRpdHlSZWYgIT0gbnVsbDsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKwkJaWYgKGVJc1Byb3h5KCkpIHJldHVybiBzdXBlci50b1N0cmluZygpOworCisJCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOworCQlyZXN1bHQuYXBwZW5kKCIgKGVudGl0eUF1dGhvcml6ZWQ6ICIpOworCQlyZXN1bHQuYXBwZW5kKGVudGl0eUF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRW50aXR5SW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUVudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxMzlkYQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZVByb3BlcnR5RW51bTsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGUgRW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6CisgKiA8dWw+CisgKiAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmltcGwuUm9sZUVudGl0eVJlZmVyZW5jZUltcGwjZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn08L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlRW50aXR5UmVmZXJlbmNlSW1wbCBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJlSW1wbCBpbXBsZW1lbnRzIFJvbGVFbnRpdHlSZWZlcmVuY2UgeworCS8qKgorCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpIDxlbT5FbnRpdHkgQXR0cmkgVW5hdXRob3JpemVkPC9lbT59JyBhdHRyaWJ1dGUuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAc2VlICNnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpCisJICogQGdlbmVyYXRlZAorCSAqIEBvcmRlcmVkCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBSb2xlUHJvcGVydHlFbnVtIEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQgPSBSb2xlUHJvcGVydHlFbnVtLklOVklTSUJMRTsKKworCS8qKgorCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKCkgPGVtPkVudGl0eSBBdHRyaSBVbmF1dGhvcml6ZWQ8L2VtPn0nIGF0dHJpYnV0ZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBzZWUgI2dldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZVByb3BlcnR5RW51bSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA9IEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgUm9sZUVudGl0eVJlZmVyZW5jZUltcGwoKSB7CisJCXN1cGVyKCk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7CisJCXJldHVybiBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0VOVElUWV9SRUZFUkVOQ0U7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFJvbGVQcm9wZXJ0eUVudW0gZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKSB7CisJCXJldHVybiBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgdm9pZCBzZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZChSb2xlUHJvcGVydHlFbnVtIG5ld0VudGl0eUF0dHJpVW5hdXRob3JpemVkKSB7CisJCVJvbGVQcm9wZXJ0eUVudW0gb2xkRW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDsKKwkJZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQgPSBuZXdFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCA9PSBudWxsID8gRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRF9FREVGQVVMVCA6IG5ld0VudGl0eUF0dHJpVW5hdXRob3JpemVkOworCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCisJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQsIG9sZEVudGl0eUF0dHJpVW5hdXRob3JpemVkLCBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCkpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBPYmplY3QgZUdldChpbnQgZmVhdHVyZUlELCBib29sZWFuIHJlc29sdmUsIGJvb2xlYW4gY29yZVR5cGUpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXJldHVybiBnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRDoKKwkJCQlzZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgoUm9sZVByb3BlcnR5RW51bSluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEOgorCQkJCXNldEVudGl0eUF0dHJpVW5hdXRob3JpemVkKEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQ6CisJCQkJcmV0dXJuIGVudGl0eUF0dHJpVW5hdXRob3JpemVkICE9IEVOVElUWV9BVFRSSV9VTkFVVEhPUklaRURfRURFRkFVTFQ7CisJCX0KKwkJcmV0dXJuIHN1cGVyLmVJc1NldChmZWF0dXJlSUQpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisJCWlmIChlSXNQcm94eSgpKSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKworCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKKwkJcmVzdWx0LmFwcGVuZCgiIChlbnRpdHlBdHRyaVVuYXV0aG9yaXplZDogIik7CisJCXJlc3VsdC5hcHBlbmQoZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQpOworCQlyZXN1bHQuYXBwZW5kKCcpJyk7CisJCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKwl9CisKK30gLy9Sb2xlRW50aXR5UmVmZXJlbmNlSW1wbApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2ltcGwvUm9sZUltcGwuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1NDVlMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9pbXBsL1JvbGVJbXBsLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqICAKKyAqICBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisgKiAKKyAqICAKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuaW1wbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRWxlbWVudDsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJvbGU8L2I+PC9lbT4nLgorICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgorICogPHVsPgorICogICA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5pbXBsLlJvbGVJbXBsI2dldFJvbGVFbGVtZW50cyA8ZW0+Um9sZSBFbGVtZW50czwvZW0+fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIFJvbGVJbXBsIGV4dGVuZHMgQXV0aG9yaXphdGlvbkJhc2VJbXBsIGltcGxlbWVudHMgUm9sZSB7CisJLyoqCisJICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Um9sZUVsZW1lbnRzKCkgPGVtPlJvbGUgRWxlbWVudHM8L2VtPn0nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHNlZSAjZ2V0Um9sZUVsZW1lbnRzKCkKKwkgKiBAZ2VuZXJhdGVkCisJICogQG9yZGVyZWQKKwkgKi8KKwlwcm90ZWN0ZWQgRUxpc3Q8Um9sZUVsZW1lbnQ+IHJvbGVFbGVtZW50czsKKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBSb2xlSW1wbCgpIHsKKwkJc3VwZXIoKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEU7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEVMaXN0PFJvbGVFbGVtZW50PiBnZXRSb2xlRWxlbWVudHMoKSB7CisJCWlmIChyb2xlRWxlbWVudHMgPT0gbnVsbCkgeworCQkJcm9sZUVsZW1lbnRzID0gbmV3IEVPYmplY3RDb250YWlubWVudEVMaXN0PFJvbGVFbGVtZW50PihSb2xlRWxlbWVudC5jbGFzcywgdGhpcywgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9fUk9MRV9FTEVNRU5UUyk7CisJCX0KKwkJcmV0dXJuIHJvbGVFbGVtZW50czsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfX1JPTEVfRUxFTUVOVFM6CisJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdDw/PilnZXRSb2xlRWxlbWVudHMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOworCQl9CisJCXJldHVybiBzdXBlci5lSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgT2JqZWN0IGVHZXQoaW50IGZlYXR1cmVJRCwgYm9vbGVhbiByZXNvbHZlLCBib29sZWFuIGNvcmVUeXBlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfX1JPTEVfRUxFTUVOVFM6CisJCQkJcmV0dXJuIGdldFJvbGVFbGVtZW50cygpOworCQl9CisJCXJldHVybiBzdXBlci5lR2V0KGZlYXR1cmVJRCwgcmVzb2x2ZSwgY29yZVR5cGUpOworCX0KKworCS8qKgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGVTZXQoaW50IGZlYXR1cmVJRCwgT2JqZWN0IG5ld1ZhbHVlKSB7CisJCXN3aXRjaCAoZmVhdHVyZUlEKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfX1JPTEVfRUxFTUVOVFM6CisJCQkJZ2V0Um9sZUVsZW1lbnRzKCkuY2xlYXIoKTsKKwkJCQlnZXRSb2xlRWxlbWVudHMoKS5hZGRBbGwoKENvbGxlY3Rpb248PyBleHRlbmRzIFJvbGVFbGVtZW50PiluZXdWYWx1ZSk7CisJCQkJcmV0dXJuOworCQl9CisJCXN1cGVyLmVTZXQoZmVhdHVyZUlELCBuZXdWYWx1ZSk7CisJfQorCisJLyoqCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgZVVuc2V0KGludCBmZWF0dXJlSUQpIHsKKwkJc3dpdGNoIChmZWF0dXJlSUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9fUk9MRV9FTEVNRU5UUzoKKwkJCQlnZXRSb2xlRWxlbWVudHMoKS5jbGVhcigpOworCQkJCXJldHVybjsKKwkJfQorCQlzdXBlci5lVW5zZXQoZmVhdHVyZUlEKTsKKwl9CisKKwkvKioKKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoaW50IGZlYXR1cmVJRCkgeworCQlzd2l0Y2ggKGZlYXR1cmVJRCkgeworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX19ST0xFX0VMRU1FTlRTOgorCQkJCXJldHVybiByb2xlRWxlbWVudHMgIT0gbnVsbCAmJiAhcm9sZUVsZW1lbnRzLmlzRW1wdHkoKTsKKwkJfQorCQlyZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmVJRCk7CisJfQorCit9IC8vUm9sZUltcGwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91dGlsL0F1dGhvcml6YXRpb25EU0xBZGFwdGVyRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3V0aWwvQXV0aG9yaXphdGlvbkRTTEFkYXB0ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVjM2U5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91dGlsL0F1dGhvcml6YXRpb25EU0xBZGFwdGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNTMxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC4qOworCisvKioKKyAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisgKiBUaGUgPGI+QWRhcHRlciBGYWN0b3J5PC9iPiBmb3IgdGhlIG1vZGVsLgorICogSXQgcHJvdmlkZXMgYW4gYWRhcHRlciA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZCBmb3IgZWFjaCBjbGFzcyBvZiB0aGUgbW9kZWwuCisgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKyAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xQYWNrYWdlCisgKiBAZ2VuZXJhdGVkCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBZGFwdGVyRmFjdG9yeUltcGwgeworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgc3RhdGljIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlIG1vZGVsUGFja2FnZTsKKworCS8qKgorCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgZmFjdG9yeS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEFkYXB0ZXJGYWN0b3J5KCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGZhY3RvcnkgaXMgYXBwbGljYWJsZSBmb3IgdGhlIHR5cGUgb2YgdGhlIG9iamVjdC4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgb2JqZWN0IGlzIGVpdGhlciB0aGUgbW9kZWwncyBwYWNrYWdlIG9yIGlzIGFuIGluc3RhbmNlIG9iamVjdCBvZiB0aGUgbW9kZWwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB3aGV0aGVyIHRoaXMgZmFjdG9yeSBpcyBhcHBsaWNhYmxlIGZvciB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0LgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCBvYmplY3QpIHsKKwkJaWYgKG9iamVjdCA9PSBtb2RlbFBhY2thZ2UpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBFT2JqZWN0KSB7CisJCQlyZXR1cm4gKChFT2JqZWN0KW9iamVjdCkuZUNsYXNzKCkuZ2V0RVBhY2thZ2UoKSA9PSBtb2RlbFBhY2thZ2U7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qKgorCSAqIFRoZSBzd2l0Y2ggdGhhdCBkZWxlZ2F0ZXMgdG8gdGhlIDxjb2RlPmNyZWF0ZVhYWDwvY29kZT4gbWV0aG9kcy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwcm90ZWN0ZWQgQXV0aG9yaXphdGlvbkRTTFN3aXRjaDxBZGFwdGVyPiBtb2RlbFN3aXRjaCA9CisJCW5ldyBBdXRob3JpemF0aW9uRFNMU3dpdGNoPEFkYXB0ZXI+KCkgeworCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXV0aG9yaXphdGlvbk1vZGVsKEF1dGhvcml6YXRpb25Nb2RlbCBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlQXV0aG9yaXphdGlvbk1vZGVsQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXV0aG9yaXphdGlvblBhY2thZ2UoQXV0aG9yaXphdGlvblBhY2thZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUF1dGhvcml6YXRpb25QYWNrYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlQXV0aG9yaXphdGlvbkJhc2UoQXV0aG9yaXphdGlvbkJhc2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUF1dGhvcml6YXRpb25CYXNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZShSb2xlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUVsZW1lbnQoUm9sZUVsZW1lbnQgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVFbGVtZW50QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUVudGl0eShSb2xlRW50aXR5IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRW50aXR5QWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJlYW4oUm9sZUJlYW4gb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVCZWFuQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUR0byhSb2xlRHRvIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRHRvQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJsaXBBbGxVc2VyVGFza3MoUm9sZUJsaXBBbGxVc2VyVGFza3Mgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVCbGlwQWxsVXNlclRhc2tzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJsaXBVc2VyVGFzayhSb2xlQmxpcFVzZXJUYXNrIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlQmxpcFVzZXJUYXNrQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJsaXBQcm9jZXNzKFJvbGVCbGlwUHJvY2VzcyBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUm9sZUJsaXBQcm9jZXNzQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUVudGl0eUZlYXR1cmUoUm9sZUVudGl0eUZlYXR1cmUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVFbnRpdHlGZWF0dXJlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUVudGl0eUF0dHJpYnV0ZShSb2xlRW50aXR5QXR0cmlidXRlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRW50aXR5QXR0cmlidXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUVudGl0eVJlZmVyZW5jZShSb2xlRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJlYW5GZWF0dXJlKFJvbGVCZWFuRmVhdHVyZSBvYmplY3QpIHsKKwkJCQlyZXR1cm4gY3JlYXRlUm9sZUJlYW5GZWF0dXJlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJlYW5BdHRyaWJ1dGUoUm9sZUJlYW5BdHRyaWJ1dGUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVCZWFuQXR0cmlidXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUJlYW5SZWZlcmVuY2UoUm9sZUJlYW5SZWZlcmVuY2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVCZWFuUmVmZXJlbmNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUR0b0ZlYXR1cmUoUm9sZUR0b0ZlYXR1cmUgb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZVJvbGVEdG9GZWF0dXJlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUR0b0F0dHJpYnV0ZShSb2xlRHRvQXR0cmlidXRlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRHRvQXR0cmlidXRlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlUm9sZUR0b1JlZmVyZW5jZShSb2xlRHRvUmVmZXJlbmNlIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVSb2xlRHRvUmVmZXJlbmNlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTExhenlSZXNvbHZlcihMTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVMTGF6eVJlc29sdmVyQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBjYXNlTFBhY2thZ2UoTFBhY2thZ2Ugb2JqZWN0KSB7CisJCQkJcmV0dXJuIGNyZWF0ZUxQYWNrYWdlQWRhcHRlcigpOworCQkJfQorCQkJQE92ZXJyaWRlCisJCQlwdWJsaWMgQWRhcHRlciBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQkJCXJldHVybiBjcmVhdGVFT2JqZWN0QWRhcHRlcigpOworCQkJfQorCQl9OworCisJLyoqCisJICogQ3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSB0YXJnZXQgdGhlIG9iamVjdCB0byBhZGFwdC4KKwkgKiBAcmV0dXJuIHRoZSBhZGFwdGVyIGZvciB0aGUgPGNvZGU+dGFyZ2V0PC9jb2RlPi4KKwkgKiBAZ2VuZXJhdGVkCisJICovCisJQE92ZXJyaWRlCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKKwkJcmV0dXJuIG1vZGVsU3dpdGNoLmRvU3dpdGNoKChFT2JqZWN0KXRhcmdldCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTW9kZWwgPGVtPkF1dGhvcml6YXRpb24gTW9kZWw8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVBdXRob3JpemF0aW9uTW9kZWxBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIDxlbT5BdXRob3JpemF0aW9uIExhenkgUmVzb2x2ZXI8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlckFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25QYWNrYWdlIDxlbT5BdXRob3JpemF0aW9uIFBhY2thZ2U8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25QYWNrYWdlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUF1dGhvcml6YXRpb25QYWNrYWdlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkJhc2UgPGVtPkF1dGhvcml6YXRpb24gQmFzZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkJhc2UKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlQXV0aG9yaXphdGlvbkJhc2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlIDxlbT5Sb2xlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRWxlbWVudCA8ZW0+Um9sZSBFbGVtZW50PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRWxlbWVudAorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRWxlbWVudEFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHkgPGVtPlJvbGUgRW50aXR5PC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVFbnRpdHlBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbiA8ZW0+Um9sZSBCZWFuPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQmVhbkFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG8gPGVtPlJvbGUgRHRvPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEdG9BZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEFsbFVzZXJUYXNrcyA8ZW0+Um9sZSBCbGlwIEFsbCBVc2VyIFRhc2tzPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcEFsbFVzZXJUYXNrcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQmxpcEFsbFVzZXJUYXNrc0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sgPGVtPlJvbGUgQmxpcCBVc2VyIFRhc2s8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUJsaXBVc2VyVGFza0FkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcyA8ZW0+Um9sZSBCbGlwIFByb2Nlc3M8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2VzcworCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQmxpcFByb2Nlc3NBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5RmVhdHVyZSA8ZW0+Um9sZSBFbnRpdHkgRmVhdHVyZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eUZlYXR1cmUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUVudGl0eUZlYXR1cmVBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRW50aXR5QXR0cmlidXRlIDxlbT5Sb2xlIEVudGl0eSBBdHRyaWJ1dGU8L2VtPn0nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlIGNhc2VzOworCSAqIGl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUgY2FzZXMgYW55d2F5LgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEByZXR1cm4gdGhlIG5ldyBhZGFwdGVyLgorCSAqIEBzZWUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGUKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIEFkYXB0ZXIgY3JlYXRlUm9sZUVudGl0eUF0dHJpYnV0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2UgPGVtPlJvbGUgRW50aXR5IFJlZmVyZW5jZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUVudGl0eVJlZmVyZW5jZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRW50aXR5UmVmZXJlbmNlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlIDxlbT5Sb2xlIEJlYW4gRmVhdHVyZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5GZWF0dXJlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVCZWFuRmVhdHVyZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuQXR0cmlidXRlIDxlbT5Sb2xlIEJlYW4gQXR0cmlidXRlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQmVhbkF0dHJpYnV0ZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuUmVmZXJlbmNlIDxlbT5Sb2xlIEJlYW4gUmVmZXJlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhblJlZmVyZW5jZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlQmVhblJlZmVyZW5jZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9GZWF0dXJlIDxlbT5Sb2xlIER0byBGZWF0dXJlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvRmVhdHVyZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRHRvRmVhdHVyZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgYW4gb2JqZWN0IG9mIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGUgPGVtPlJvbGUgRHRvIEF0dHJpYnV0ZTwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b0F0dHJpYnV0ZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVSb2xlRHRvQXR0cmlidXRlQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUR0b1JlZmVyZW5jZSA8ZW0+Um9sZSBEdG8gUmVmZXJlbmNlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlRHRvUmVmZXJlbmNlCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZVJvbGVEdG9SZWZlcmVuY2VBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGVzIGEgbmV3IGFkYXB0ZXIgZm9yIGFuIG9iamVjdCBvZiBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MTGF6eVJlc29sdmVyIDxlbT5MTGF6eSBSZXNvbHZlcjwvZW0+fScuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIHNvIHRoYXQgd2UgY2FuIGVhc2lseSBpZ25vcmUgY2FzZXM7CisJICogaXQncyB1c2VmdWwgdG8gaWdub3JlIGEgY2FzZSB3aGVuIGluaGVyaXRhbmNlIHdpbGwgY2F0Y2ggYWxsIHRoZSBjYXNlcyBhbnl3YXkuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTExhenlSZXNvbHZlcgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMTGF6eVJlc29sdmVyQWRhcHRlcigpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogQ3JlYXRlcyBhIG5ldyBhZGFwdGVyIGZvciBhbiBvYmplY3Qgb2YgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2UgPGVtPkxQYWNrYWdlPC9lbT59Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZSBjYXNlczsKKwkgKiBpdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlIGNhc2VzIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBuZXcgYWRhcHRlci4KKwkgKiBAc2VlIG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgQWRhcHRlciBjcmVhdGVMUGFja2FnZUFkYXB0ZXIoKSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIENyZWF0ZXMgYSBuZXcgYWRhcHRlciBmb3IgdGhlIGRlZmF1bHQgY2FzZS4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGwuCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHJldHVybiB0aGUgbmV3IGFkYXB0ZXIuCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9BdXRob3JpemF0aW9uRFNMQWRhcHRlckZhY3RvcnkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91dGlsL0F1dGhvcml6YXRpb25EU0xTd2l0Y2guamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9lbWYtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC91dGlsL0F1dGhvcml6YXRpb25EU0xTd2l0Y2guamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWM3NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VtZi1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3V0aWwvQXV0aG9yaXphdGlvbkRTTFN3aXRjaC5qYXZhCkBAIC0wLDAgKzEsNjA4IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAgCisgKiAgZ2VuZXJhdGVkIGZyb20gQXV0aG9yaXRhcmlvbkRTTC54Y29yZQorICogCisgKiAgCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnV0aWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5Td2l0Y2g7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTExhenlSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuKjsKKworLyoqCisgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorICogVGhlIDxiPlN3aXRjaDwvYj4gZm9yIHRoZSBtb2RlbCdzIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4KKyAqIEl0IHN1cHBvcnRzIHRoZSBjYWxsIHtAbGluayAjZG9Td2l0Y2goRU9iamVjdCkgZG9Td2l0Y2gob2JqZWN0KX0KKyAqIHRvIGludm9rZSB0aGUgPGNvZGU+Y2FzZVhYWDwvY29kZT4gbWV0aG9kIGZvciBlYWNoIGNsYXNzIG9mIHRoZSBtb2RlbCwKKyAqIHN0YXJ0aW5nIHdpdGggdGhlIGFjdHVhbCBjbGFzcyBvZiB0aGUgb2JqZWN0CisgKiBhbmQgcHJvY2VlZGluZyB1cCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5CisgKiB1bnRpbCBhIG5vbi1udWxsIHJlc3VsdCBpcyByZXR1cm5lZCwKKyAqIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIHN3aXRjaC4KKyAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorICogQHNlZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UKKyAqIEBnZW5lcmF0ZWQKKyAqLworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xTd2l0Y2g8VD4gZXh0ZW5kcyBTd2l0Y2g8VD4geworCS8qKgorCSAqIFRoZSBjYWNoZWQgbW9kZWwgcGFja2FnZQorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXByb3RlY3RlZCBzdGF0aWMgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UgbW9kZWxQYWNrYWdlOworCisJLyoqCisJICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgc3dpdGNoLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBBdXRob3JpemF0aW9uRFNMU3dpdGNoKCkgeworCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKKwkJCW1vZGVsUGFja2FnZSA9IEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVJTlNUQU5DRTsKKwkJfQorCX0KKworCS8qKgorCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSBzd2l0Y2ggZm9yIHRoZSBnaXZlbiBwYWNrYWdlLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtZXRlciBlUGFja2FnZSB0aGUgcGFja2FnZSBpbiBxdWVzdGlvbi4KKwkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHN3aXRjaCBmb3IgdGhlIGdpdmVuIHBhY2thZ2UuCisJICogQGdlbmVyYXRlZAorCSAqLworCUBPdmVycmlkZQorCXByb3RlY3RlZCBib29sZWFuIGlzU3dpdGNoRm9yKEVQYWNrYWdlIGVQYWNrYWdlKSB7CisJCXJldHVybiBlUGFja2FnZSA9PSBtb2RlbFBhY2thZ2U7CisJfQorCisJLyoqCisJICogQ2FsbHMgPGNvZGU+Y2FzZVhYWDwvY29kZT4gZm9yIGVhY2ggY2xhc3Mgb2YgdGhlIG1vZGVsIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uIG51bGwgcmVzdWx0OyBpdCB5aWVsZHMgdGhhdCByZXN1bHQuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcmV0dXJuIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQgcmV0dXJuZWQgYnkgYSA8Y29kZT5jYXNlWFhYPC9jb2RlPiBjYWxsLgorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgVCBkb1N3aXRjaChpbnQgY2xhc3NpZmllcklELCBFT2JqZWN0IHRoZUVPYmplY3QpIHsKKwkJc3dpdGNoIChjbGFzc2lmaWVySUQpIHsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9NT0RFTDogeworCQkJCUF1dGhvcml6YXRpb25Nb2RlbCBhdXRob3JpemF0aW9uTW9kZWwgPSAoQXV0aG9yaXphdGlvbk1vZGVsKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbk1vZGVsKGF1dGhvcml6YXRpb25Nb2RlbCk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX0xBWllfUkVTT0xWRVI6IHsKKwkJCQlBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIGF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIgPSAoQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcil0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIoYXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcik7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX1BBQ0tBR0U6IHsKKwkJCQlBdXRob3JpemF0aW9uUGFja2FnZSBhdXRob3JpemF0aW9uUGFja2FnZSA9IChBdXRob3JpemF0aW9uUGFja2FnZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25QYWNrYWdlKGF1dGhvcml6YXRpb25QYWNrYWdlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VMUGFja2FnZShhdXRob3JpemF0aW9uUGFja2FnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlTExhenlSZXNvbHZlcihhdXRob3JpemF0aW9uUGFja2FnZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5BVVRIT1JJWkFUSU9OX0JBU0U6IHsKKwkJCQlBdXRob3JpemF0aW9uQmFzZSBhdXRob3JpemF0aW9uQmFzZSA9IChBdXRob3JpemF0aW9uQmFzZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25CYXNlKGF1dGhvcml6YXRpb25CYXNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKGF1dGhvcml6YXRpb25CYXNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEU6IHsKKwkJCQlSb2xlIHJvbGUgPSAoUm9sZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGUocm9sZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkJhc2Uocm9sZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRUxFTUVOVDogeworCQkJCVJvbGVFbGVtZW50IHJvbGVFbGVtZW50ID0gKFJvbGVFbGVtZW50KXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUVsZW1lbnQocm9sZUVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIocm9sZUVsZW1lbnQpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFk6IHsKKwkJCQlSb2xlRW50aXR5IHJvbGVFbnRpdHkgPSAoUm9sZUVudGl0eSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVFbnRpdHkocm9sZUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUm9sZUVsZW1lbnQocm9sZUVudGl0eSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlRW50aXR5KTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTjogeworCQkJCVJvbGVCZWFuIHJvbGVCZWFuID0gKFJvbGVCZWFuKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUJlYW4ocm9sZUJlYW4pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVFbGVtZW50KHJvbGVCZWFuKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKHJvbGVCZWFuKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPOiB7CisJCQkJUm9sZUR0byByb2xlRHRvID0gKFJvbGVEdG8pdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRHRvKHJvbGVEdG8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVFbGVtZW50KHJvbGVEdG8pOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIocm9sZUR0byk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1M6IHsKKwkJCQlSb2xlQmxpcEFsbFVzZXJUYXNrcyByb2xlQmxpcEFsbFVzZXJUYXNrcyA9IChSb2xlQmxpcEFsbFVzZXJUYXNrcyl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVCbGlwQWxsVXNlclRhc2tzKHJvbGVCbGlwQWxsVXNlclRhc2tzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRWxlbWVudChyb2xlQmxpcEFsbFVzZXJUYXNrcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlQmxpcEFsbFVzZXJUYXNrcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLOiB7CisJCQkJUm9sZUJsaXBVc2VyVGFzayByb2xlQmxpcFVzZXJUYXNrID0gKFJvbGVCbGlwVXNlclRhc2spdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlQmxpcFVzZXJUYXNrKHJvbGVCbGlwVXNlclRhc2spOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVFbGVtZW50KHJvbGVCbGlwVXNlclRhc2spOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIocm9sZUJsaXBVc2VyVGFzayk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTUzogeworCQkJCVJvbGVCbGlwUHJvY2VzcyByb2xlQmxpcFByb2Nlc3MgPSAoUm9sZUJsaXBQcm9jZXNzKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUJsaXBQcm9jZXNzKHJvbGVCbGlwUHJvY2Vzcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUm9sZUVsZW1lbnQocm9sZUJsaXBQcm9jZXNzKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKHJvbGVCbGlwUHJvY2Vzcyk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9GRUFUVVJFOiB7CisJCQkJUm9sZUVudGl0eUZlYXR1cmUgcm9sZUVudGl0eUZlYXR1cmUgPSAoUm9sZUVudGl0eUZlYXR1cmUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRW50aXR5RmVhdHVyZShyb2xlRW50aXR5RmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlRW50aXR5RmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0VOVElUWV9BVFRSSUJVVEU6IHsKKwkJCQlSb2xlRW50aXR5QXR0cmlidXRlIHJvbGVFbnRpdHlBdHRyaWJ1dGUgPSAoUm9sZUVudGl0eUF0dHJpYnV0ZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVFbnRpdHlBdHRyaWJ1dGUocm9sZUVudGl0eUF0dHJpYnV0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUm9sZUVudGl0eUZlYXR1cmUocm9sZUVudGl0eUF0dHJpYnV0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlRW50aXR5QXR0cmlidXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX1JFRkVSRU5DRTogeworCQkJCVJvbGVFbnRpdHlSZWZlcmVuY2Ugcm9sZUVudGl0eVJlZmVyZW5jZSA9IChSb2xlRW50aXR5UmVmZXJlbmNlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUVudGl0eVJlZmVyZW5jZShyb2xlRW50aXR5UmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRW50aXR5RmVhdHVyZShyb2xlRW50aXR5UmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKHJvbGVFbnRpdHlSZWZlcmVuY2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX0ZFQVRVUkU6IHsKKwkJCQlSb2xlQmVhbkZlYXR1cmUgcm9sZUJlYW5GZWF0dXJlID0gKFJvbGVCZWFuRmVhdHVyZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVCZWFuRmVhdHVyZShyb2xlQmVhbkZlYXR1cmUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIocm9sZUJlYW5GZWF0dXJlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9BVFRSSUJVVEU6IHsKKwkJCQlSb2xlQmVhbkF0dHJpYnV0ZSByb2xlQmVhbkF0dHJpYnV0ZSA9IChSb2xlQmVhbkF0dHJpYnV0ZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVCZWFuQXR0cmlidXRlKHJvbGVCZWFuQXR0cmlidXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlQmVhbkZlYXR1cmUocm9sZUJlYW5BdHRyaWJ1dGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZUF1dGhvcml6YXRpb25MYXp5UmVzb2x2ZXIocm9sZUJlYW5BdHRyaWJ1dGUpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOX1JFRkVSRU5DRTogeworCQkJCVJvbGVCZWFuUmVmZXJlbmNlIHJvbGVCZWFuUmVmZXJlbmNlID0gKFJvbGVCZWFuUmVmZXJlbmNlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUJlYW5SZWZlcmVuY2Uocm9sZUJlYW5SZWZlcmVuY2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gY2FzZVJvbGVCZWFuRmVhdHVyZShyb2xlQmVhblJlZmVyZW5jZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlQmVhblJlZmVyZW5jZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19GRUFUVVJFOiB7CisJCQkJUm9sZUR0b0ZlYXR1cmUgcm9sZUR0b0ZlYXR1cmUgPSAoUm9sZUR0b0ZlYXR1cmUpdGhlRU9iamVjdDsKKwkJCQlUIHJlc3VsdCA9IGNhc2VSb2xlRHRvRmVhdHVyZShyb2xlRHRvRmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlRHRvRmVhdHVyZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJfQorCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19BVFRSSUJVVEU6IHsKKwkJCQlSb2xlRHRvQXR0cmlidXRlIHJvbGVEdG9BdHRyaWJ1dGUgPSAoUm9sZUR0b0F0dHJpYnV0ZSl0aGVFT2JqZWN0OworCQkJCVQgcmVzdWx0ID0gY2FzZVJvbGVEdG9BdHRyaWJ1dGUocm9sZUR0b0F0dHJpYnV0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlUm9sZUR0b0ZlYXR1cmUocm9sZUR0b0F0dHJpYnV0ZSk7CisJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSByZXN1bHQgPSBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihyb2xlRHRvQXR0cmlidXRlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOworCQkJCXJldHVybiByZXN1bHQ7CisJCQl9CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX1JFRkVSRU5DRTogeworCQkJCVJvbGVEdG9SZWZlcmVuY2Ugcm9sZUR0b1JlZmVyZW5jZSA9IChSb2xlRHRvUmVmZXJlbmNlKXRoZUVPYmplY3Q7CisJCQkJVCByZXN1bHQgPSBjYXNlUm9sZUR0b1JlZmVyZW5jZShyb2xlRHRvUmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VSb2xlRHRvRmVhdHVyZShyb2xlRHRvUmVmZXJlbmNlKTsKKwkJCQlpZiAocmVzdWx0ID09IG51bGwpIHJlc3VsdCA9IGNhc2VBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyKHJvbGVEdG9SZWZlcmVuY2UpOworCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7CisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJCX0KKwkJCWRlZmF1bHQ6IHJldHVybiBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKKwkJfQorCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkF1dGhvcml6YXRpb24gTW9kZWw8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRob3JpemF0aW9uIE1vZGVsPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQXV0aG9yaXphdGlvbk1vZGVsKEF1dGhvcml6YXRpb25Nb2RlbCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aG9yaXphdGlvbiBMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcihBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRob3JpemF0aW9uIFBhY2thZ2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5BdXRob3JpemF0aW9uIFBhY2thZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VBdXRob3JpemF0aW9uUGFja2FnZShBdXRob3JpemF0aW9uUGFja2FnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aG9yaXphdGlvbiBCYXNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+QXV0aG9yaXphdGlvbiBCYXNlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlQXV0aG9yaXphdGlvbkJhc2UoQXV0aG9yaXphdGlvbkJhc2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZShSb2xlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEVsZW1lbnQ8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEVsZW1lbnQ8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlRWxlbWVudChSb2xlRWxlbWVudCBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBFbnRpdHk8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEVudGl0eTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJvbGVFbnRpdHkoUm9sZUVudGl0eSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCZWFuPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCZWFuPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZUJlYW4oUm9sZUJlYW4gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRHRvPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEdG88L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlRHRvKFJvbGVEdG8gb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgQmxpcCBBbGwgVXNlciBUYXNrczwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgQmxpcCBBbGwgVXNlciBUYXNrczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJvbGVCbGlwQWxsVXNlclRhc2tzKFJvbGVCbGlwQWxsVXNlclRhc2tzIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEJsaXAgVXNlciBUYXNrPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCbGlwIFVzZXIgVGFzazwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJvbGVCbGlwVXNlclRhc2soUm9sZUJsaXBVc2VyVGFzayBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCbGlwIFByb2Nlc3M8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEJsaXAgUHJvY2VzczwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJvbGVCbGlwUHJvY2VzcyhSb2xlQmxpcFByb2Nlc3Mgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRW50aXR5IEZlYXR1cmU8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEVudGl0eSBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZUVudGl0eUZlYXR1cmUoUm9sZUVudGl0eUZlYXR1cmUgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRW50aXR5IEF0dHJpYnV0ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRW50aXR5IEF0dHJpYnV0ZTwvZW0+Jy4KKwkgKiBAc2VlICNkb1N3aXRjaChvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdCkgZG9Td2l0Y2goRU9iamVjdCkKKwkgKiBAZ2VuZXJhdGVkCisJICovCisJcHVibGljIFQgY2FzZVJvbGVFbnRpdHlBdHRyaWJ1dGUoUm9sZUVudGl0eUF0dHJpYnV0ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZUVudGl0eVJlZmVyZW5jZShSb2xlRW50aXR5UmVmZXJlbmNlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIEJlYW4gRmVhdHVyZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgQmVhbiBGZWF0dXJlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZUJlYW5GZWF0dXJlKFJvbGVCZWFuRmVhdHVyZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCZWFuIEF0dHJpYnV0ZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgQmVhbiBBdHRyaWJ1dGU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlQmVhbkF0dHJpYnV0ZShSb2xlQmVhbkF0dHJpYnV0ZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBCZWFuIFJlZmVyZW5jZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgQmVhbiBSZWZlcmVuY2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlQmVhblJlZmVyZW5jZShSb2xlQmVhblJlZmVyZW5jZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEdG8gRmVhdHVyZTwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLgorCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgorCSAqIEBwYXJhbSBvYmplY3QgdGhlIHRhcmdldCBvZiB0aGUgc3dpdGNoLgorCSAqIEByZXR1cm4gdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPlJvbGUgRHRvIEZlYXR1cmU8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlRHRvRmVhdHVyZShSb2xlRHRvRmVhdHVyZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEdG8gQXR0cmlidXRlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+Um9sZSBEdG8gQXR0cmlidXRlPC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KSBkb1N3aXRjaChFT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlwdWJsaWMgVCBjYXNlUm9sZUR0b0F0dHJpYnV0ZShSb2xlRHRvQXR0cmlidXRlIG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKKwkvKioKKwkgKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPicuCisJICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KKwkgKiBUaGlzIGltcGxlbWVudGF0aW9uIHJldHVybnMgbnVsbDsKKwkgKiByZXR1cm5pbmcgYSBub24tbnVsbCByZXN1bHQgd2lsbCB0ZXJtaW5hdGUgdGhlIHN3aXRjaC4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5Sb2xlIER0byBSZWZlcmVuY2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VSb2xlRHRvUmVmZXJlbmNlKFJvbGVEdG9SZWZlcmVuY2Ugb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxMYXp5IFJlc29sdmVyPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TExhenkgUmVzb2x2ZXI8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VMTGF6eVJlc29sdmVyKExMYXp5UmVzb2x2ZXIgb2JqZWN0KSB7CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiBpbnRlcnByZXRpbmcgdGhlIG9iamVjdCBhcyBhbiBpbnN0YW5jZSBvZiAnPGVtPkxQYWNrYWdlPC9lbT4nLgorCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+CisJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIG51bGw7CisJICogcmV0dXJuaW5nIGEgbm9uLW51bGwgcmVzdWx0IHdpbGwgdGVybWluYXRlIHRoZSBzd2l0Y2guCisJICogPCEtLSBlbmQtdXNlci1kb2MgLS0+CisJICogQHBhcmFtIG9iamVjdCB0aGUgdGFyZ2V0IG9mIHRoZSBzd2l0Y2guCisJICogQHJldHVybiB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+TFBhY2thZ2U8L2VtPicuCisJICogQHNlZSAjZG9Td2l0Y2gob3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3QpIGRvU3dpdGNoKEVPYmplY3QpCisJICogQGdlbmVyYXRlZAorCSAqLworCXB1YmxpYyBUIGNhc2VMUGFja2FnZShMUGFja2FnZSBvYmplY3QpIHsKKwkJcmV0dXJuIG51bGw7CisJfQorCisJLyoqCisJICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIGludGVycHJldGluZyB0aGUgb2JqZWN0IGFzIGFuIGluc3RhbmNlIG9mICc8ZW0+RU9iamVjdDwvZW0+Jy4KKwkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgorCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsOworCSAqIHJldHVybmluZyBhIG5vbi1udWxsIHJlc3VsdCB3aWxsIHRlcm1pbmF0ZSB0aGUgc3dpdGNoLCBidXQgdGhpcyBpcyB0aGUgbGFzdCBjYXNlIGFueXdheS4KKwkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KKwkgKiBAcGFyYW0gb2JqZWN0IHRoZSB0YXJnZXQgb2YgdGhlIHN3aXRjaC4KKwkgKiBAcmV0dXJuIHRoZSByZXN1bHQgb2YgaW50ZXJwcmV0aW5nIHRoZSBvYmplY3QgYXMgYW4gaW5zdGFuY2Ugb2YgJzxlbT5FT2JqZWN0PC9lbT4nLgorCSAqIEBzZWUgI2RvU3dpdGNoKG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0KQorCSAqIEBnZW5lcmF0ZWQKKwkgKi8KKwlAT3ZlcnJpZGUKKwlwdWJsaWMgVCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgeworCQlyZXR1cm4gbnVsbDsKKwl9CisKK30gLy9BdXRob3JpemF0aW9uRFNMU3dpdGNoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvZXBsLXYxMC5odG1sIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VwbC12MTAuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzk4YWNjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL2VwbC12MTAuaHRtbApAQCAtMCwwICsxLDI1OSBAQAorPCEtLT94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPy0tPgorPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+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+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvbGljZW5zZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTc5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvbGljZW5zZS5odG1sCkBAIC0wLDAgKzEsMTY0IEBACis8IS0tP3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/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+CisKKworPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvbW9kZWwvQXV0aG9yaXphdGlvbkRTTC54Y29yZSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9tb2RlbC9BdXRob3JpemF0aW9uRFNMLnhjb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMmI2YzIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvbW9kZWwvQXV0aG9yaXphdGlvbkRTTC54Y29yZQpAQCAtMCwwICsxLDE1MyBAQAorQEdlbk1vZGVsKGZpbGVFeHRlbnNpb25zPSJhdXRob3JpemF0aW9uIikKK0BHZW5Nb2RlbChtb2RlbE5hbWU9IkF1dGhvcml6YXRpb25EU0wiKQorQEdlbk1vZGVsKHByZWZpeD0iQXV0aG9yaXphdGlvbkRTTCIpCitAR2VuTW9kZWwoY29weXJpZ2h0VGV4dD0iQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorIAorIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAKKyBnZW5lcmF0ZWQgZnJvbSBBdXRob3JpdGFyaW9uRFNMLnhjb3JlCisKKyAiKUBHZW5Nb2RlbCh1cGRhdGVDbGFzc3BhdGg9ImZhbHNlIikKK0BFY29yZShuc1VSST0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMIikKK0BFY29yZShuc1ByZWZpeD0iYXV0aG9yaXphdGlvbkRTTCIpCitARWNvcmUocm9vdFBhY2thZ2U9ImF1dGhvcml6YXRpb25EU0wiKQorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdAoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MUGFja2FnZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmR0by5MRHRvCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZHRvLkxEdG9GZWF0dXJlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxCZWFuCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxCZWFuRmVhdHVyZQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmVudGl0eS5MRW50aXR5CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuZW50aXR5LkxFbnRpdHlGZWF0dXJlCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmFwaS5FY29yZVV0aWwzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXAKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrCisKK2NsYXNzIEF1dGhvcml6YXRpb25Nb2RlbCB7CisJY29udGFpbnMgQXV0aG9yaXphdGlvblBhY2thZ2UgcGNrZworfQorCit0eXBlIEludGVybmFsRU9iamVjdCB3cmFwcyBJbnRlcm5hbEVPYmplY3QKKworY2xhc3MgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciB7CisJb3AgRU9iamVjdCBlUmVzb2x2ZVByb3h5KEludGVybmFsRU9iamVjdCBwcm94eSkgeworCQlyZXR1cm4gRWNvcmVVdGlsMy5yZXNvbHZlKHByb3h5LCB0aGlzLmVSZXNvdXJjZSgpLnJlc291cmNlU2V0KTsKKwl9Cit9CisKK2NsYXNzIEF1dGhvcml6YXRpb25QYWNrYWdlIGV4dGVuZHMgTFBhY2thZ2V7CisJY29udGFpbnMgUm9sZVtdIHJvbGVzCit9CisKK2NsYXNzIEF1dGhvcml6YXRpb25CYXNlIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciB7CisJU3RyaW5nIG5hbWUKK30KKworCitjbGFzcyBSb2xlIGV4dGVuZHMgQXV0aG9yaXphdGlvbkJhc2V7CisJIGNvbnRhaW5zIFJvbGVFbGVtZW50W10gcm9sZUVsZW1lbnRzCit9CisKK2NsYXNzIFJvbGVFbGVtZW50IGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlciB7fQorCitjbGFzcyBSb2xlRW50aXR5IGV4dGVuZHMgUm9sZUVsZW1lbnQgeworCVJvbGVFbnVtW10gZW50aXR5QXV0aG9yaXplZAorCWNvbnRhaW5zIFJvbGVFbnRpdHlGZWF0dXJlW10gZW50aXR5RmVhdHVyZXMKKwlyZWZlcnMgTEVudGl0eSBlbnRpdHlSZWYKK30KKworY2xhc3MgUm9sZUJlYW4gZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJUm9sZUVudW1bXSBiZWFuQXV0aG9yaXplZAorCWNvbnRhaW5zIFJvbGVCZWFuRmVhdHVyZVtdIGJlYW5GZWF0dXJlcworCXJlZmVycyBMQmVhbiBiZWFuUmVmCit9CisKK2NsYXNzIFJvbGVEdG8gZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJUm9sZUVudW1bXSBkdG9BdXRob3JpemVkCisJY29udGFpbnMgUm9sZUR0b0ZlYXR1cmVbXSBkdG9GZWF0dXJlcworCXJlZmVycyBMRHRvIGR0b1JlZgorfQorCitjbGFzcyBSb2xlQmxpcEFsbFVzZXJUYXNrcyBleHRlbmRzIFJvbGVFbGVtZW50IHsKKwlSb2xlQmxpcFVzZXJUYXNrRW51bSBhdXRob3JpemVkCit9CisKK2NsYXNzIFJvbGVCbGlwVXNlclRhc2sgZXh0ZW5kcyBSb2xlRWxlbWVudCB7CisJcmVmZXJzIEJsaXBVc2VyVGFzayB1c2VyVGFzaworCVJvbGVCbGlwVXNlclRhc2tFbnVtIGF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUJsaXBQcm9jZXNzIGV4dGVuZHMgUm9sZUVsZW1lbnQgeworCXJlZmVycyBCbGlwIHByb2Nlc3MKKwkvLyBub3QgbmVjZXNzYXJ5LCBiZWNhdXNlIEpCb3NzIG9ubHkgc3VwcG9ydHMgb25lIHN0YXJ0RXZlbnQgcGVyIHByb2Nlc3MgLSByZWZlcnMgQmxpcFN0YXJ0RXZlbnQgc3RhcnRFdmVudAorCVJvbGVCbGlwUHJvY2Vzc0VudW0gcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZAorCWNvbnRhaW5zIFJvbGVCbGlwQWxsVXNlclRhc2tzIGFsbFVzZXJUYXNrcworCWNvbnRhaW5zIFJvbGVCbGlwVXNlclRhc2tbXSB1c2VyVGFza3MKK30KKworY2xhc3MgUm9sZUVudGl0eUZlYXR1cmUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyeworCXJlZmVycyBMRW50aXR5RmVhdHVyZSBlbnRpdHlBdHRyaUNvbCAKK30KKworY2xhc3MgUm9sZUVudGl0eUF0dHJpYnV0ZSBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJleworCVJvbGVQcm9wZXJ0eUVudW0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUVudGl0eVJlZmVyZW5jZSBleHRlbmRzIFJvbGVFbnRpdHlGZWF0dXJleworCVJvbGVQcm9wZXJ0eUVudW0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUJlYW5GZWF0dXJlIGV4dGVuZHMgQXV0aG9yaXphdGlvbkxhenlSZXNvbHZlcnsKKwlyZWZlcnMgTEJlYW5GZWF0dXJlIGJlYW5BdHRyaUNvbCAKK30KKworY2xhc3MgUm9sZUJlYW5BdHRyaWJ1dGUgZXh0ZW5kcyBSb2xlQmVhbkZlYXR1cmV7CisJUm9sZVByb3BlcnR5RW51bSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUJlYW5SZWZlcmVuY2UgZXh0ZW5kcyBSb2xlQmVhbkZlYXR1cmV7CisJUm9sZVByb3BlcnR5RW51bSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUR0b0ZlYXR1cmUgZXh0ZW5kcyBBdXRob3JpemF0aW9uTGF6eVJlc29sdmVyeworCXJlZmVycyBMRHRvRmVhdHVyZSBkdG9BdHRyaUNvbCAKK30KKworY2xhc3MgUm9sZUR0b0F0dHJpYnV0ZSBleHRlbmRzIFJvbGVEdG9GZWF0dXJleworCVJvbGVQcm9wZXJ0eUVudW0gZHRvQXR0cmlVbmF1dGhvcml6ZWQKK30KKworY2xhc3MgUm9sZUR0b1JlZmVyZW5jZSBleHRlbmRzIFJvbGVEdG9GZWF0dXJleworCVJvbGVQcm9wZXJ0eUVudW0gZHRvQXR0cmlVbmF1dGhvcml6ZWQKK30KKworZW51bSBSb2xlRW51bXsKKwkgYW55IGFzICdhbnknCisJIGNyZWF0YWJsZSBhcyAnY3JlYXRhYmxlJworCSByZWFkYWJsZSBhcyAncmVhZGFibGUnCisJIHVwZGF0YWJsZSBhcyAndXBkYXRhYmxlJworCSBkZWxldGFibGUgYXMgJ2RlbGV0YWJsZScKK30JIAorCitlbnVtIFJvbGVQcm9wZXJ0eUVudW17CisJIGludmlzaWJsZSBhcyAnaW52aXNpYmxlJworICAgICBkaXNhYmxlZCBhcyAnZGlzYWJsZWQnCisJIG5vbmVkaXRhYmxlIGFzICdub25lZGl0YWJsZScKK30KKworZW51bSBSb2xlQmxpcFByb2Nlc3NFbnVteworCSBzdGFydGFibGUgYXMgJ3N0YXJ0YWJsZScKK30KKworZW51bSBSb2xlQmxpcFVzZXJUYXNrRW51bXsKKwkgZXhlY3V0YWJsZSBhcyAnZXhlY3V0YWJsZScKK30KKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3BsdWdpbi5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3BsdWdpbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzQ4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvcGx1Z2luLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNCBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTQgLSBMdW5pZmVyYSBHbWJIIChHcm9zcyBFbnplcnNkb3JmLCBBdXN0cmlhKSwgTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCisjICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgCisjICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAKKyMgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIAorIyAKKyMgIEJhc2VkIG9uIGlkZWFzIGZyb20gWHRleHQsIFh0ZW5kLCBYY29yZQorIyAgIAorIyAgQ29udHJpYnV0b3JzOiAgCisjICAJCUZsb3JpYW4gUGlyY2huZXIgLSBJbml0aWFsIGltcGxlbWVudGF0aW9uIAorIyAgCisKK3BsdWdpbk5hbWUgPSBBdXRob3JpemF0aW9uIERTTCBNb2RlbAorcHJvdmlkZXJOYW1lID0gTG9ldHogR21iSCZDby5LRywgNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3BsdWdpbi54bWwgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvcGx1Z2luLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWU1M2ExCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3BsdWdpbi54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KKworPHBsdWdpbj4KKworPCEtLQorICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZ2VuZXJhdGVkX3BhY2thZ2UiPgorICAgIDxwYWNrYWdlIAorICAgICAgIHVyaSA9ICJodHRwOi8vd3d3Lm9zYnAuZGUveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMIiAKKyAgICAgICBjbGFzcyA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuYXV0aG9yaXphdGlvbkRTTC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSIKKyAgICAgICBnZW5Nb2RlbCA9ICJvcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTC5nZW5tb2RlbCIgLz4gCisJCisgIDwvZXh0ZW5zaW9uPgorCisKKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKy0tPiAgICAgIDwhLS0gQGdlbmVyYXRlZCBDdWJlRFNMIC0tPgorPCEtLSAgICAgIDxwYWNrYWdlCisgICAgICAgICAgICB1cmk9Imh0dHA6Ly93d3cub3NicC5kZS94dGV4dC9jdWJlZHNsL0N1YmVEU0wiCisgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uub3NicC54dGV4dC5jdWJlZHNsLkN1YmVEU0wuQ3ViZURTTFBhY2thZ2UiCisgICAgICAgICAgICBnZW5Nb2RlbD0ibW9kZWwvQ3ViZURTTC54Y29yZSIvPgorICAgPC9leHRlbnNpb24+CistLT4KKworICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmdlbmVyYXRlZF9wYWNrYWdlIj4KKyAgICAgIDwhLS0gQGdlbmVyYXRlZCBBdXRob3JpemF0aW9uRFNMIC0tPgorICAgICAgPHBhY2thZ2UKKyAgICAgICAgICAgIHVyaT0iaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMIgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZSIKKyAgICAgICAgICAgIGdlbk1vZGVsPSJtb2RlbC9BdXRob3JpemF0aW9uRFNMLnhjb3JlIi8+CisgICA8L2V4dGVuc2lvbj4KKworPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvcG9tLnhtbCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTM2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvcG9tLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzwhLS0jIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIC0tPgorPCEtLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAtLT4KKzwhLS0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAtLT4KKzwhLS0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IC0tPgorPCEtLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgLS0+Cis8IS0tIyAtLT4KKzwhLS0jIENvbnRyaWJ1dG9yczogLS0+Cis8IS0tIyAgICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24gLS0+Cis8IS0tIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKwk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisJPHBhcmVudD4KKwkJPGdyb3VwSWQ+b3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKwkJPHZlcnNpb24+MC45LjAtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTxyZWxhdGl2ZVBhdGg+Li48L3JlbGF0aXZlUGF0aD4KKwk8L3BhcmVudD4KKwk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w8L2FydGlmYWN0SWQ+CisJPHBhY2thZ2luZz5lY2xpcHNlLXBsdWdpbjwvcGFja2FnaW5nPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vUkVBRE1FLnR4dCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL1JFQURNRS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZTU1NwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL1JFQURNRS50eHQKQEAgLTAsMCArMSBAQAorZHVtbXkgZmlsZSBuZWVkZWQgZm9yIGdpdCBmb3IgbmVjZXNzYXJ5IGJ1dCBlbXB0eSBkaXJlY3RvcmllcyEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWYyMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDM0OCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LkNvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkRlZmF1bHRSdW50aW1lTW9kdWxlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuQmluZGVyOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0Lm5hbWUuTmFtZXM7CisKKy8qKgorICogTWFudWFsIG1vZGlmaWNhdGlvbnMgZ28gdG8ge29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUnVudGltZU1vZHVsZX0KKyAqLworIEBTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUgZXh0ZW5kcyBEZWZhdWx0UnVudGltZU1vZHVsZSB7CisKKwlwcm90ZWN0ZWQgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKKworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZShCaW5kZXIgYmluZGVyKSB7CisJCXByb3BlcnRpZXMgPSB0cnlCaW5kUHJvcGVydGllcyhiaW5kZXIsICJvcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTC5wcm9wZXJ0aWVzIik7CisJCXN1cGVyLmNvbmZpZ3VyZShiaW5kZXIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVMYW5ndWFnZU5hbWUoQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChTdHJpbmcuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQoQ29uc3RhbnRzLkxBTkdVQUdFX05BTUUpKS50b0luc3RhbmNlKCJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTCIpOworCX0KKwkKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVGaWxlRXh0ZW5zaW9ucyhCaW5kZXIgYmluZGVyKSB7CisJCWlmIChwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShDb25zdGFudHMuRklMRV9FWFRFTlNJT05TKSA9PSBudWxsKQorCQkJYmluZGVyLmJpbmQoU3RyaW5nLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKE5hbWVzLm5hbWVkKENvbnN0YW50cy5GSUxFX0VYVEVOU0lPTlMpKS50b0luc3RhbmNlKCJhdXRob3JpemF0aW9uIik7CisJfQorCQorCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVNlbWFudGljU2VxdWVuY2VyPiBiaW5kSVNlbWFudGljU2VxdWVuY2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcmlhbGl6ZXIuQXV0aG9yaXphdGlvbkRTTFNlbWFudGljU2VxdWVuY2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVN5bnRhY3RpY1NlcXVlbmNlcj4gYmluZElTeW50YWN0aWNTZXF1ZW5jZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2VyaWFsaXplci5BdXRob3JpemF0aW9uRFNMU3ludGFjdGljU2VxdWVuY2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5zZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5JU2VyaWFsaXplcj4gYmluZElTZXJpYWxpemVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5pbXBsLlNlcmlhbGl6ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5JUGFyc2VyPiBiaW5kSVBhcnNlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5wYXJzZXIuYW50bHIuQXV0aG9yaXphdGlvbkRTTFBhcnNlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLklUb2tlblRvU3RyaW5nQ29udmVydGVyPiBiaW5kSVRva2VuVG9TdHJpbmdDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJUb2tlblRvU3RyaW5nQ29udmVydGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5wYXJzZXIuYW50bHIuWHRleHRBbnRsckdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuSUFudGxyVG9rZW5GaWxlUHJvdmlkZXI+IGJpbmRJQW50bHJUb2tlbkZpbGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5wYXJzZXIuYW50bHIuQXV0aG9yaXphdGlvbkRTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5MZXhlcj4gYmluZExleGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IucGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjxvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyPiBwcm92aWRlSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJQcm92aWRlci5jcmVhdGUob3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVSdW50aW1lTGV4ZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXJCaW5kaW5ncy5SVU5USU1FKSkudG8ob3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbC5JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnBhcnNlci5hbnRsci5YdGV4dEFudGxyR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5JVG9rZW5EZWZQcm92aWRlcj4gYmluZElUb2tlbkRlZlByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyVG9rZW5EZWZQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudmFsaWRhdGlvbi5WYWxpZGF0b3JGcmFnbWVudAorCUBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLlNpbmdsZXRvbkJpbmRpbmcoZWFnZXI9dHJ1ZSkJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudmFsaWRhdGlvbi5BdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yPiBiaW5kQXV0aG9yaXphdGlvbkRTTFZhbGlkYXRvcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC52YWxpZGF0aW9uLkF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnNjb3BpbmcuQWJzdHJhY3RTY29waW5nRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJZ25vcmVDYXNlTGlua2luZyhjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kQ29uc3RhbnQoKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSWdub3JlQ2FzZUxpbmtpbmcuY2xhc3MpLnRvKGZhbHNlKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUNvbnRhaW5lci5NYW5hZ2VyPiBiaW5kSUNvbnRhaW5lciRNYW5hZ2VyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5TdGF0ZUJhc2VkQ29udGFpbmVyTWFuYWdlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuYnVpbGRlci5CdWlsZGVySW50ZWdyYXRpb25GcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuY29udGFpbmVycy5JQWxsQ29udGFpbmVyc1N0YXRlLlByb3ZpZGVyPiBiaW5kSUFsbENvbnRhaW5lcnNTdGF0ZSRQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmNvbnRhaW5lcnMuUmVzb3VyY2VTZXRCYXNlZEFsbENvbnRhaW5lcnNTdGF0ZVByb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5idWlsZGVyLkJ1aWxkZXJJbnRlZ3JhdGlvbkZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVJlc291cmNlRGVzY3JpcHRpb25zKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlU2V0QmFzZWRSZXNvdXJjZURlc2NyaXB0aW9ucy5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLmJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVJUmVzb3VyY2VEZXNjcmlwdGlvbnNQZXJzaXN0ZWQoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VEZXNjcmlwdGlvbnMuY2xhc3MpLmFubm90YXRlZFdpdGgoY29tLmdvb2dsZS5pbmplY3QubmFtZS5OYW1lcy5uYW1lZChvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5pbXBsLlJlc291cmNlRGVzY3JpcHRpb25zUHJvdmlkZXIuUEVSU0lTVEVEX0RFU0NSSVBUSU9OUykpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRCYXNlZFJlc291cmNlRGVzY3JpcHRpb25zLmNsYXNzKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZm9ybWF0dGluZy5Gb3JtYXR0ZXJGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5JRm9ybWF0dGVyPiBiaW5kSUZvcm1hdHRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mb3JtYXR0aW5nLkF1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLlR5cGVzRmFjdG9yeSBiaW5kVHlwZXNGYWN0b3J5VG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5UeXBlc0ZhY3RvcnkuZUlOU1RBTkNFOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci50eXBlcy5UeXBlc0dlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuYWNjZXNzLklKdm1UeXBlUHJvdmlkZXIuRmFjdG9yeT4gYmluZElKdm1UeXBlUHJvdmlkZXIkRmFjdG9yeSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5hY2Nlc3MuQ2xhc3NwYXRoVHlwZVByb3ZpZGVyRmFjdG9yeS5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LkFic3RyYWN0VHlwZVNjb3BlUHJvdmlkZXI+IGJpbmRBYnN0cmFjdFR5cGVTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LkNsYXNzcGF0aEJhc2VkVHlwZVNjb3BlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLklFdmFsdWF0aW9uQ29udGV4dD4gYmluZElFdmFsdWF0aW9uQ29udGV4dCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLmltcGwuRGVmYXVsdEV2YWx1YXRpb25Db250ZXh0LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5pbnRlcnByZXRlci5JRXhwcmVzc2lvbkludGVycHJldGVyPiBiaW5kSUV4cHJlc3Npb25JbnRlcnByZXRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmludGVycHJldGVyLmltcGwuWGJhc2VJbnRlcnByZXRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubmFtaW5nLklRdWFsaWZpZWROYW1lQ29udmVydGVyPiBiaW5kSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZVF1YWxpZmllZE5hbWVDb252ZXJ0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZVByb3ZpZGVyPiBiaW5kSVF1YWxpZmllZE5hbWVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuWGJhc2VRdWFsaWZpZWROYW1lUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbnZlcnNpb24uSVZhbHVlQ29udmVydGVyU2VydmljZT4gYmluZElWYWx1ZUNvbnZlcnRlclNlcnZpY2UoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb252ZXJzaW9uLlhiYXNlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZVByb3ZpZGVyPiBiaW5kSVNjb3BlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmJhdGNoLklCYXRjaFNjb3BlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgdm9pZCBjb25maWd1cmVMaW5raW5nSVNjb3BlUHJvdmlkZXIoY29tLmdvb2dsZS5pbmplY3QuQmluZGVyIGJpbmRlcikgeworCQliaW5kZXIuYmluZChvcmcuZWNsaXBzZS54dGV4dC5zY29waW5nLklTY29wZVByb3ZpZGVyLmNsYXNzKS5hbm5vdGF0ZWRXaXRoKG9yZy5lY2xpcHNlLnh0ZXh0LmxpbmtpbmcuTGlua2luZ1Njb3BlUHJvdmlkZXJCaW5kaW5nLmNsYXNzKS50byhvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmJhdGNoLklCYXRjaFNjb3BlUHJvdmlkZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlU2VyaWFsaXplcklTY29wZVByb3ZpZGVyKGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlciBiaW5kZXIpIHsKKwkJYmluZGVyLmJpbmQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlci5jbGFzcykuYW5ub3RhdGVkV2l0aChvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnRva2Vucy5TZXJpYWxpemVyU2NvcGVQcm92aWRlckJpbmRpbmcuY2xhc3MpLnRvKG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcmlhbGl6ZXIuU2VyaWFsaXplclNjb3BlUHJvdmlkZXIuY2xhc3MpOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIHZvaWQgY29uZmlndXJlSVNjb3BlUHJvdmlkZXJEZWxlZ2F0ZShjb20uZ29vZ2xlLmluamVjdC5CaW5kZXIgYmluZGVyKSB7CisJCWJpbmRlci5iaW5kKG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlUHJvdmlkZXIuY2xhc3MpLmFubm90YXRlZFdpdGgoTmFtZXMubmFtZWQob3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5pbXBsLkFic3RyYWN0RGVjbGFyYXRpdmVTY29wZVByb3ZpZGVyLk5BTUVEX0RFTEVHQVRFKSkudG8ob3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5YYmFzZUltcG9ydGVkTmFtZXNwYWNlU2NvcGVQcm92aWRlci5jbGFzcyk7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmxpbmtpbmcuSUxpbmtlcj4gYmluZElMaW5rZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5saW5raW5nLlhiYXNlTGF6eUxpbmtlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuWHRleHRSZXNvdXJjZT4gYmluZFh0ZXh0UmVzb3VyY2UoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5yZXNvdXJjZS5CYXRjaExpbmthYmxlUmVzb3VyY2UuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlAb3JnLmVjbGlwc2UueHRleHQuc2VydmljZS5TaW5nbGV0b25CaW5kaW5nKGVhZ2VyPXRydWUpCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5Kdm1UeXBlUmVmZXJlbmNlc1ZhbGlkYXRvcj4gYmluZEp2bVR5cGVSZWZlcmVuY2VzVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5Kdm1UeXBlUmVmZXJlbmNlc1ZhbGlkYXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuZmVhdHVyZWNhbGxzLklkZW50aWZpYWJsZVNpbXBsZU5hbWVQcm92aWRlcj4gYmluZElkZW50aWZpYWJsZVNpbXBsZU5hbWVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZlYXR1cmVjYWxscy5JZGVudGlmaWFibGVTaW1wbGVOYW1lUHJvdmlkZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklEZXJpdmVkU3RhdGVDb21wdXRlcj4gYmluZElEZXJpdmVkU3RhdGVDb21wdXRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkp2bU1vZGVsQXNzb2NpYXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRGVzY3JpcHRpb24uTWFuYWdlcj4gYmluZElSZXNvdXJjZURlc2NyaXB0aW9uJE1hbmFnZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5EZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlRGVzY3JpcHRpb25NYW5hZ2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuSUdlbmVyYXRvcj4gYmluZElHZW5lcmF0b3IoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb21waWxlci5Kdm1Nb2RlbEdlbmVyYXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YdHlwZUZhY3RvcnkgYmluZFh0eXBlRmFjdG9yeVRvSW5zdGFuY2UoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54dHlwZS5YdHlwZUZhY3RvcnkuZUlOU1RBTkNFOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5kZWJ1Zy5JU3RyYXR1bUJyZWFrcG9pbnRTdXBwb3J0PiBiaW5kSVN0cmF0dW1CcmVha3BvaW50U3VwcG9ydCgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmRlYnVnLlhiYXNlU3RyYXR1bUJyZWFrcG9pbnRTdXBwb3J0LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuTGluZVNlcGFyYXRvckhhcm1vbml6ZXI+IGJpbmRMaW5lU2VwYXJhdG9ySGFybW9uaXplcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmNvbXBpbGVyLm91dHB1dC5UcmFjZUF3YXJlUG9zdFByb2Nlc3Nvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSURlZmF1bHRSZXNvdXJjZURlc2NyaXB0aW9uU3RyYXRlZ3k+IGJpbmRJRGVmYXVsdFJlc291cmNlRGVzY3JpcHRpb25TdHJhdGVneSgpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnJlc291cmNlLlhiYXNlUmVzb3VyY2VEZXNjcmlwdGlvblN0cmF0ZWd5LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLlNldmVyaXR5Q29udmVydGVyPiBiaW5kU2V2ZXJpdHlDb252ZXJ0ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS52YWxpZGF0aW9uLlhiYXNlU2V2ZXJpdHlDb252ZXJ0ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uQ29uZmlndXJhYmxlSXNzdWVDb2Rlc1Byb3ZpZGVyPiBiaW5kQ29uZmlndXJhYmxlSXNzdWVDb2Rlc1Byb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5YYmFzZUNvbmZpZ3VyYWJsZUlzc3VlQ29kZXMuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkVPYmplY3RBdE9mZnNldEhlbHBlcj4gYmluZEVPYmplY3RBdE9mZnNldEhlbHBlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmxpbmtpbmcuQnJva2VuQ29uc3RydWN0b3JDYWxsQXdhcmVFT2JqZWN0QXRPZmZzZXRIZWxwZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uQ2FuY2VsYWJsZURpYWdub3N0aWNpYW4+IGJpbmRDYW5jZWxhYmxlRGlhZ25vc3RpY2lhbigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnZhbGlkYXRpb24uWGJhc2VEaWFnbm9zdGljaWFuLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zY29waW5nLmZlYXR1cmVjYWxscy5TdGF0aWNJbXBsaWNpdE1ldGhvZHNGZWF0dXJlRm9yVHlwZVByb3ZpZGVyLkV4dGVuc2lvbkNsYXNzTmFtZVByb3ZpZGVyPiBiaW5kU3RhdGljSW1wbGljaXRNZXRob2RzRmVhdHVyZUZvclR5cGVQcm92aWRlciRFeHRlbnNpb25DbGFzc05hbWVQcm92aWRlcigpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNjb3BpbmcuYmF0Y2guSW1wbGljaXRseUltcG9ydGVkVHlwZXNBZGFwdGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5NdXRhYmxlRmlsZVN5c3RlbVN1cHBvcnQ+IGJpbmRNdXRhYmxlRmlsZVN5c3RlbVN1cHBvcnQoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5maWxlLkphdmFJT0ZpbGVTeXN0ZW1TdXBwb3J0LmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGVuZC5saWIubWFjcm8uZmlsZS5GaWxlTG9jYXRpb25zPiBiaW5kRmlsZUxvY2F0aW9ucygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuRmlsZUxvY2F0aW9uc0ltcGwuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIGNvbS5nb29nbGUuaW5qZWN0LlByb3ZpZGVyPG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuV29ya3NwYWNlQ29uZmlnPj4gcHJvdmlkZVdvcmtzcGFjZUNvbmZpZygpIHsKKwkJcmV0dXJuIG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmZpbGUuUnVudGltZVdvcmtzcGFjZUNvbmZpZ1Byb3ZpZGVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmNvbXB1dGF0aW9uLklUeXBlQ29tcHV0ZXI+IGJpbmRJVHlwZUNvbXB1dGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudHlwZXN5c3RlbS5YYmFzZVdpdGhBbm5vdGF0aW9uc1R5cGVDb21wdXRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5iYXRjaC5YYmFzZUJhdGNoU2NvcGVQcm92aWRlcj4gYmluZFhiYXNlQmF0Y2hTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudHlwZXN5c3RlbS5YYmFzZVdpdGhBbm5vdGF0aW9uc0JhdGNoU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQubGlua2luZy5JTGlua2luZ0RpYWdub3N0aWNNZXNzYWdlUHJvdmlkZXI+IGJpbmRJTGlua2luZ0RpYWdub3N0aWNNZXNzYWdlUHJvdmlkZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLlVucmVzb2x2ZWRBbm5vdGF0aW9uVHlwZUF3YXJlTWVzc2FnZVByb2R1Y2VyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JTG9jYXRpb25JbkZpbGVQcm92aWRlcj4gYmluZElMb2NhdGlvbkluRmlsZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSnZtTG9jYXRpb25JbkZpbGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JR2xvYmFsU2NvcGVQcm92aWRlcj4gYmluZElHbG9iYWxTY29wZVByb3ZpZGVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLnh0ZXh0LlR5cGVzQXdhcmVEZWZhdWx0R2xvYmFsU2NvcGVQcm92aWRlci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5GZWF0dXJlTmFtZVZhbGlkYXRvcj4gYmluZEZlYXR1cmVOYW1lVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudmFsaWRhdGlvbi5Mb2dpY2FsQ29udGFpbmVyQXdhcmVGZWF0dXJlTmFtZVZhbGlkYXRvci5jbGFzczsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IueGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQueGJhc2UudHlwZXN5c3RlbS5pbnRlcm5hbC5EZWZhdWx0QmF0Y2hUeXBlUmVzb2x2ZXI+IGJpbmREZWZhdWx0QmF0Y2hUeXBlUmVzb2x2ZXIoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkxvZ2ljYWxDb250YWluZXJBd2FyZUJhdGNoVHlwZVJlc29sdmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS50eXBlc3lzdGVtLmludGVybmFsLkRlZmF1bHRSZWVudHJhbnRUeXBlUmVzb2x2ZXI+IGJpbmREZWZhdWx0UmVlbnRyYW50VHlwZVJlc29sdmVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UudHlwZXN5c3RlbS5pbnRlcm5hbC5Mb2dpY2FsQ29udGFpbmVyQXdhcmVSZWVudHJhbnRUeXBlUmVzb2x2ZXIuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnhiYXNlLlhiYXNlR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uSVJlc291cmNlVmFsaWRhdG9yPiBiaW5kSVJlc291cmNlVmFsaWRhdG9yKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMudmFsaWRhdGlvbi5EZXJpdmVkU3RhdGVBd2FyZVJlc291cmNlVmFsaWRhdG9yLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci54YmFzZS5YYmFzZUdlbmVyYXRvckZyYWdtZW50CisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5JSnZtTW9kZWxJbmZlcnJlcj4gYmluZElKdm1Nb2RlbEluZmVycmVyKCkgeworCQlyZXR1cm4gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmp2bW1vZGVsLkF1dGhvcml6YXRpb25EU0xKdm1Nb2RlbEluZmVycmVyLmNsYXNzOworCX0KKworCS8vIGNvbnRyaWJ1dGVkIGJ5IG9yZy5lY2xpcHNlLnh0ZXh0LmdlbmVyYXRvci5ncmFtbWFyQWNjZXNzLkdyYW1tYXJBY2Nlc3NGcmFnbWVudAorCXB1YmxpYyBqYXZhLmxhbmcuQ2xhc3NMb2FkZXIgYmluZENsYXNzTG9hZGVyVG9JbnN0YW5jZSgpIHsKKwkJcmV0dXJuIGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKwl9CisKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IuZ3JhbW1hckFjY2Vzcy5HcmFtbWFyQWNjZXNzRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LklHcmFtbWFyQWNjZXNzPiBiaW5kSUdyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2VydmljZXMuQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MuY2xhc3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZC5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQxN2QxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5JU2V0dXA7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuR3VpY2U7CitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuSW5qZWN0b3I7CisKKy8qKgorICogR2VuZXJhdGVkIGZyb20gU3RhbmRhbG9uZVNldHVwLnhwdCEKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZCBpbXBsZW1lbnRzIElTZXR1cCB7CisKKwlwdWJsaWMgSW5qZWN0b3IgY3JlYXRlSW5qZWN0b3JBbmREb0VNRlJlZ2lzdHJhdGlvbigpIHsKKwkJb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuWGJhc2VXaXRoQW5ub3RhdGlvbnNTdGFuZGFsb25lU2V0dXAuZG9TZXR1cCgpOworCisJCUluamVjdG9yIGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3IoKTsKKwkJcmVnaXN0ZXIoaW5qZWN0b3IpOworCQlyZXR1cm4gaW5qZWN0b3I7CisJfQorCQorCXB1YmxpYyBJbmplY3RvciBjcmVhdGVJbmplY3RvcigpIHsKKwkJcmV0dXJuIEd1aWNlLmNyZWF0ZUluamVjdG9yKG5ldyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUoKSk7CisJfQorCQorCXB1YmxpYyB2b2lkIHJlZ2lzdGVyKEluamVjdG9yIGluamVjdG9yKSB7CisKKwkJb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlRmFjdG9yeSByZXNvdXJjZUZhY3RvcnkgPSBpbmplY3Rvci5nZXRJbnN0YW5jZShvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JUmVzb3VyY2VGYWN0b3J5LmNsYXNzKTsKKwkJb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlU2VydmljZVByb3ZpZGVyIHNlcnZpY2VQcm92aWRlciA9IGluamVjdG9yLmdldEluc3RhbmNlKG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLklSZXNvdXJjZVNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisJCVJlc291cmNlLkZhY3RvcnkuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RXh0ZW5zaW9uVG9GYWN0b3J5TWFwKCkucHV0KCJhdXRob3JpemF0aW9uIiwgcmVzb3VyY2VGYWN0b3J5KTsKKwkJb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSVJlc291cmNlU2VydmljZVByb3ZpZGVyLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEV4dGVuc2lvblRvRmFjdG9yeU1hcCgpLnB1dCgiYXV0aG9yaXphdGlvbiIsIHNlcnZpY2VQcm92aWRlcik7CisJCQorCisKKworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvQXV0aG9yaXphdGlvbkRTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvQXV0aG9yaXphdGlvbkRTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ4MjFlCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9BdXRob3JpemF0aW9uRFNMQW50bHJUb2tlbkZpbGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRscjsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLklBbnRsclRva2VuRmlsZVByb3ZpZGVyOworCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTEFudGxyVG9rZW5GaWxlUHJvdmlkZXIgaW1wbGVtZW50cyBJQW50bHJUb2tlbkZpbGVQcm92aWRlciB7CisJCisJcHVibGljIElucHV0U3RyZWFtIGdldEFudGxyVG9rZW5GaWxlKCkgeworCQlDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAJcmV0dXJuIGNsYXNzTG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oIm9yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLnRva2VucyIpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9BdXRob3JpemF0aW9uRFNMUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyODFiYgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRscjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5zZXJ2aWNlcy5BdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzczsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xQYXJzZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RBbnRsclBhcnNlciB7CisJCisJQEluamVjdAorCXByaXZhdGUgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgdm9pZCBzZXRJbml0aWFsSGlkZGVuVG9rZW5zKFh0ZXh0VG9rZW5TdHJlYW0gdG9rZW5TdHJlYW0pIHsKKwkJdG9rZW5TdHJlYW0uc2V0SW5pdGlhbEhpZGRlblRva2VucygiUlVMRV9XUyIsICJSVUxFX01MX0NPTU1FTlQiLCAiUlVMRV9TTF9DT01NRU5UIik7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlciBjcmVhdGVQYXJzZXIoWHRleHRUb2tlblN0cmVhbSBzdHJlYW0pIHsKKwkJcmV0dXJuIG5ldyBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsLkludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihzdHJlYW0sIGdldEdyYW1tYXJBY2Nlc3MoKSk7CisJfQorCQorCUBPdmVycmlkZSAKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmF1bHRSdWxlTmFtZSgpIHsKKwkJcmV0dXJuICJBdXRob3JpemF0aW9uTW9kZWwiOworCX0KKwkKKwlwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ2V0R3JhbW1hckFjY2VzcygpIHsKKwkJcmV0dXJuIHRoaXMuZ3JhbW1hckFjY2VzczsKKwl9CisJCisJcHVibGljIHZvaWQgc2V0R3JhbW1hckFjY2VzcyhBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzKSB7CisJCXRoaXMuZ3JhbW1hckFjY2VzcyA9IGdyYW1tYXJBY2Nlc3M7CisJfQorCQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkNzQyMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmcKQEAgLTAsMCArMSw3OTAyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitncmFtbWFyIEludGVybmFsQXV0aG9yaXphdGlvbkRTTDsKKworb3B0aW9ucyB7CisJc3VwZXJDbGFzcz1BYnN0cmFjdEludGVybmFsQW50bHJQYXJzZXI7CisJCit9CisKK0BsZXhlcjo6aGVhZGVyIHsKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnBhcnNlci5hbnRsci5pbnRlcm5hbDsKKworLy8gSGFjazogVXNlIG91ciBvd24gTGV4ZXIgc3VwZXJjbGFzcyBieSBtZWFucyBvZiBpbXBvcnQuIAorLy8gQ3VycmVudGx5IHRoZXJlIGlzIG5vIG90aGVyIHdheSB0byBzcGVjaWZ5IHRoZSBzdXBlcmNsYXNzIGZvciB0aGUgbGV4ZXIuCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkxleGVyOworfQorCitAcGFyc2VyOjpoZWFkZXIgeworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsOyAKKworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLio7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmltcGwuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVudW1lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFic3RyYWN0SW50ZXJuYWxBbnRsclBhcnNlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuWHRleHRUb2tlblN0cmVhbS5IaWRkZW5Ub2tlbnM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucGFyc2VyLmFudGxyLkFudGxyRGF0YXR5cGVSdWxlVG9rZW47CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworCit9CisKK0BwYXJzZXI6Om1lbWJlcnMgeworCisgCXByaXZhdGUgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzczsKKyAJCisgICAgcHVibGljIEludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgICAgICB0aGlzKGlucHV0KTsKKyAgICAgICAgdGhpcy5ncmFtbWFyQWNjZXNzID0gZ3JhbW1hckFjY2VzczsKKyAgICAgICAgcmVnaXN0ZXJSdWxlcyhncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKSk7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Rmlyc3RSdWxlTmFtZSgpIHsKKyAgICAJcmV0dXJuICJBdXRob3JpemF0aW9uTW9kZWwiOwkKKyAgIAl9CisgICAJCisgICAJQE92ZXJyaWRlCisgICAJcHJvdGVjdGVkIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisgICAJCXJldHVybiBncmFtbWFyQWNjZXNzOworICAgCX0KK30KKworQHJ1bGVjYXRjaCB7IAorICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgfSAKK30KKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWwKK2VudHJ5UnVsZUF1dGhvcml6YXRpb25Nb2RlbCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUF1dGhvcml6YXRpb25Nb2RlbD1ydWxlQXV0aG9yaXphdGlvbk1vZGVsIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQXV0aG9yaXphdGlvbk1vZGVsLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBdXRob3JpemF0aW9uTW9kZWwKK3J1bGVBdXRob3JpemF0aW9uTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uTW9kZWxBY2Nlc3MoKS5nZXRQY2tnQXV0aG9yaXphdGlvblBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKwkgICAgfQorCQlsdl9wY2tnXzBfMD1ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBja2ciLAorICAgICAgICAJCWx2X3Bja2dfMF8wLCAKKyAgICAgICAgCQkiQXV0aG9yaXphdGlvblBhY2thZ2UiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRob3JpemF0aW9uUGFja2FnZQorZW50cnlSdWxlQXV0aG9yaXphdGlvblBhY2thZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlPXJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBdXRob3JpemF0aW9uUGFja2FnZQorcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J3BhY2thZ2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0UGFja2FnZUtleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV8yXzA9cnVsZVF1YWxpZmllZE5hbWUJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8yXzAsIAorICAgICAgICAJCSJRdWFsaWZpZWROYW1lIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKQlvdGhlcmx2XzM9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMygpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzQXV0aG9yaXphdGlvbkltcG9ydFBhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisJICAgIH0KKwkJbHZfaW1wb3J0c180XzA9cnVsZUF1dGhvcml6YXRpb25JbXBvcnQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiaW1wb3J0cyIsCisgICAgICAgIAkJbHZfaW1wb3J0c180XzAsIAorICAgICAgICAJCSJBdXRob3JpemF0aW9uSW1wb3J0Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSooCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRSb2xlc1JvbGVQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorCSAgICB9CisJCWx2X3JvbGVzXzVfMD1ydWxlUm9sZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJyb2xlcyIsCisgICAgICAgIAkJbHZfcm9sZXNfNV8wLCAKKyAgICAgICAgCQkiUm9sZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfNj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNigpKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0CitlbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUF1dGhvcml6YXRpb25JbXBvcnQ9cnVsZUF1dGhvcml6YXRpb25JbXBvcnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVBdXRob3JpemF0aW9uSW1wb3J0LmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBBdXRob3JpemF0aW9uSW1wb3J0CitydWxlQXV0aG9yaXphdGlvbkltcG9ydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J2ltcG9ydCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpLmdldEltcG9ydEtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRQYXJzZXJSdWxlQ2FsbF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD1ydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbkltcG9ydFJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJpbXBvcnRlZE5hbWVzcGFjZSIsCisgICAgICAgIAkJbHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wLCAKKyAgICAgICAgCQkiQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZQorZW50cnlSdWxlUm9sZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpOyB9CisJIGl2X3J1bGVSb2xlPXJ1bGVSb2xlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUm9sZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZQorcnVsZVJvbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdyb2xlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0Um9sZUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldE5hbWVUUkFOU0xBVEFCTEVJRFBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfbmFtZV8xXzA9cnVsZVRSQU5TTEFUQUJMRUlECQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibmFtZSIsCisgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAJCSJUUkFOU0xBVEFCTEVJRCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8yPSd7JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJvbGVFbGVtZW50c1JvbGVFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9yb2xlRWxlbWVudHNfM18wPXJ1bGVSb2xlRWxlbWVudAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInJvbGVFbGVtZW50cyIsCisgICAgICAgIAkJbHZfcm9sZUVsZW1lbnRzXzNfMCwgCisgICAgICAgIAkJIlJvbGVFbGVtZW50Iik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSoJb3RoZXJsdl80PSd9JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzQoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUVsZW1lbnQKK2VudHJ5UnVsZVJvbGVFbGVtZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRSdWxlKCkpOyB9CisJIGl2X3J1bGVSb2xlRWxlbWVudD1ydWxlUm9sZUVsZW1lbnQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlRWxlbWVudC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUVsZW1lbnQKK3J1bGVSb2xlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlRW50aXR5XzA9cnVsZVJvbGVFbnRpdHkKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1JvbGVFbnRpdHlfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmVhblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1JvbGVCZWFuXzE9cnVsZVJvbGVCZWFuCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Sb2xlQmVhbl8xLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVEdG9QYXJzZXJSdWxlQ2FsbF8yKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlRHRvXzI9cnVsZVJvbGVEdG8KKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1JvbGVEdG9fMi5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlQmxpcFByb2Nlc3NfMz1ydWxlUm9sZUJsaXBQcm9jZXNzCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Sb2xlQmxpcFByb2Nlc3NfMy5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVFbnRpdHkKK2VudHJ5UnVsZVJvbGVFbnRpdHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUVudGl0eT1ydWxlUm9sZUVudGl0eSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVFbnRpdHkuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVFbnRpdHkKK3J1bGVSb2xlRW50aXR5IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldFJvbGVFbnRpdHlBY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdlbnRpdHknIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlLZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5UmVmTEVudGl0eUNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlBdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9lbnRpdHlBdXRob3JpemVkXzNfMD1ydWxlUm9sZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbnRpdHlBdXRob3JpemVkIiwKKyAgICAgICAgCQlsdl9lbnRpdHlBdXRob3JpemVkXzNfMCwgCisgICAgICAgIAkJIlJvbGVFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSsoCW90aGVybHZfND0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eUZlYXR1cmVzUm9sZUVudGl0eUZlYXR1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZW50aXR5RmVhdHVyZXNfNV8wPXJ1bGVSb2xlRW50aXR5RmVhdHVyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVudGl0eUZlYXR1cmVzIiwKKyAgICAgICAgCQlsdl9lbnRpdHlGZWF0dXJlc181XzAsIAorICAgICAgICAJCSJSb2xlRW50aXR5RmVhdHVyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykrCW90aGVybHZfNj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmVhbgorZW50cnlSdWxlUm9sZUJlYW4gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVCZWFuPXJ1bGVSb2xlQmVhbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVCZWFuLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmVhbgorcnVsZVJvbGVCZWFuIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRSb2xlQmVhbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2JlYW4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbktleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5SZWZMQmVhbkNyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkF1dGhvcml6ZWRSb2xlRW51bUVudW1SdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2JlYW5BdXRob3JpemVkXzNfMD1ydWxlUm9sZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYmVhbkF1dGhvcml6ZWQiLAorICAgICAgICAJCWx2X2JlYW5BdXRob3JpemVkXzNfMCwgCisgICAgICAgIAkJIlJvbGVFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSsoCW90aGVybHZfND0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkZlYXR1cmVzUm9sZUJlYW5GZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2JlYW5GZWF0dXJlc181XzA9cnVsZVJvbGVCZWFuRmVhdHVyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJiZWFuRmVhdHVyZXMiLAorICAgICAgICAJCWx2X2JlYW5GZWF0dXJlc181XzAsIAorICAgICAgICAJCSJSb2xlQmVhbkZlYXR1cmUiKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKwlvdGhlcmx2XzY9J30nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpKTsKKyAgICB9CispPykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVEdG8KK2VudHJ5UnVsZVJvbGVEdG8gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUR0bz1ydWxlUm9sZUR0byAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVEdG8uY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVEdG8KK3J1bGVSb2xlRHRvIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldFJvbGVEdG9BY3Rpb25fMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl8xPSdkdG8nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9LZXl3b3JkXzEoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8yPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvUmVmTER0b0Nyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisJfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXREdG9BdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9kdG9BdXRob3JpemVkXzNfMD1ydWxlUm9sZUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkdG9BdXRob3JpemVkIiwKKyAgICAgICAgCQlsdl9kdG9BdXRob3JpemVkXzNfMCwgCisgICAgICAgIAkJIlJvbGVFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSsoCW90aGVybHZfND0neycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0ZlYXR1cmVzUm9sZUR0b0ZlYXR1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfZHRvRmVhdHVyZXNfNV8wPXJ1bGVSb2xlRHRvRmVhdHVyZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImR0b0ZlYXR1cmVzIiwKKyAgICAgICAgCQlsdl9kdG9GZWF0dXJlc181XzAsIAorICAgICAgICAJCSJSb2xlRHRvRmVhdHVyZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykrCW90aGVybHZfNj0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIoKSk7CisgICAgfQorKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcworZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzPXJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmxpcEFsbFVzZXJUYXNrcworcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J2FsbCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRBbGxLZXl3b3JkXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0ndXNlcnRhc2tzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldFVzZXJ0YXNrc0tleXdvcmRfMigpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY2Nlc3MoKS5nZXRBdXRob3JpemVkUm9sZUJsaXBVc2VyVGFza0VudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKwkgICAgfQorCQlsdl9hdXRob3JpemVkXzNfMD1ydWxlUm9sZUJsaXBVc2VyVGFza0VudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiYXV0aG9yaXplZCIsCisgICAgICAgIAkJbHZfYXV0aG9yaXplZF8zXzAsIAorICAgICAgICAJCSJSb2xlQmxpcFVzZXJUYXNrRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmxpcFVzZXJUYXNrCitlbnRyeVJ1bGVSb2xlQmxpcFVzZXJUYXNrIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVCbGlwVXNlclRhc2s9cnVsZVJvbGVCbGlwVXNlclRhc2sgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlQmxpcFVzZXJUYXNrLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmxpcFVzZXJUYXNrCitydWxlUm9sZUJsaXBVc2VyVGFzayByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRSb2xlQmxpcFVzZXJUYXNrQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ndXNlcnRhc2snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRVc2VydGFza0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0VXNlclRhc2tCbGlwVXNlclRhc2tDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldEF1dGhvcml6ZWRSb2xlQmxpcFVzZXJUYXNrRW51bUVudW1SdWxlQ2FsbF8zXzAoKSk7IAorCSAgICB9CisJCWx2X2F1dGhvcml6ZWRfM18wPXJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImF1dGhvcml6ZWQiLAorICAgICAgICAJCWx2X2F1dGhvcml6ZWRfM18wLCAKKyAgICAgICAgCQkiUm9sZUJsaXBVc2VyVGFza0VudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUJsaXBQcm9jZXNzCitlbnRyeVJ1bGVSb2xlQmxpcFByb2Nlc3MgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NSdWxlKCkpOyB9CisJIGl2X3J1bGVSb2xlQmxpcFByb2Nlc3M9cnVsZVJvbGVCbGlwUHJvY2VzcyAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVCbGlwUHJvY2Vzcy5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUJsaXBQcm9jZXNzCitydWxlUm9sZUJsaXBQcm9jZXNzIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0Um9sZUJsaXBQcm9jZXNzQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0ncHJvY2VzcycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0tleXdvcmRfMSgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMj1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc0JsaXBDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCX0KKworKQorKQlvdGhlcmx2XzM9J3snIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CisgICAgfQorKAlvdGhlcmx2XzQ9J2lzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRJc0tleXdvcmRfNF8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkUm9sZUJsaXBQcm9jZXNzRW51bUVudW1SdWxlQ2FsbF80XzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZF81XzA9cnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInByb2Nlc3NTdGFydEF1dGhvcml6ZWQiLAorICAgICAgICAJCWx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wLCAKKyAgICAgICAgCQkiUm9sZUJsaXBQcm9jZXNzRW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpPygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRBbGxVc2VyVGFza3NSb2xlQmxpcEFsbFVzZXJUYXNrc1BhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisJICAgIH0KKwkJbHZfYWxsVXNlclRhc2tzXzZfMD1ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFsbFVzZXJUYXNrcyIsCisgICAgICAgIAkJbHZfYWxsVXNlclRhc2tzXzZfMCwgCisgICAgICAgIAkJIlJvbGVCbGlwQWxsVXNlclRhc2tzIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKT8oCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0VXNlclRhc2tzUm9sZUJsaXBVc2VyVGFza1BhcnNlclJ1bGVDYWxsXzZfMCgpKTsgCisJICAgIH0KKwkJbHZfdXNlclRhc2tzXzdfMD1ydWxlUm9sZUJsaXBVc2VyVGFzawkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidXNlclRhc2tzIiwKKyAgICAgICAgCQlsdl91c2VyVGFza3NfN18wLCAKKyAgICAgICAgCQkiUm9sZUJsaXBVc2VyVGFzayIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqCW90aGVybHZfOD0nfScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUKK2VudHJ5UnVsZVJvbGVFbnRpdHlGZWF0dXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVSdWxlKCkpOyB9CisJIGl2X3J1bGVSb2xlRW50aXR5RmVhdHVyZT1ydWxlUm9sZUVudGl0eUZlYXR1cmUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlRW50aXR5RmVhdHVyZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUVudGl0eUZlYXR1cmUKK3J1bGVSb2xlRW50aXR5RmVhdHVyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlRW50aXR5QXR0cmlidXRlXzA9cnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1JvbGVFbnRpdHlBdHRyaWJ1dGVfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfUm9sZUVudGl0eVJlZmVyZW5jZV8xPXJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Sb2xlRW50aXR5UmVmZXJlbmNlXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlCitlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGU9cnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlRW50aXR5QXR0cmlidXRlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRW50aXR5QXR0cmlidXRlCitydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3Byb3BlcnR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMD1ydWxlUm9sZVByb3BlcnR5RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImVudGl0eUF0dHJpVW5hdXRob3JpemVkIiwKKyAgICAgICAgCQlsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzAsIAorICAgICAgICAJCSJSb2xlUHJvcGVydHlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UKK2VudHJ5UnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUVudGl0eVJlZmVyZW5jZT1ydWxlUm9sZUVudGl0eVJlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVFbnRpdHlSZWZlcmVuY2UKK3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0ncmVmZXJlbmNlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldEVudGl0eUF0dHJpQ29sTEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgCisJfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9cnVsZVJvbGVQcm9wZXJ0eUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCIsCisgICAgICAgIAkJbHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wLCAKKyAgICAgICAgCQkiUm9sZVByb3BlcnR5RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmUKK2VudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVCZWFuRmVhdHVyZT1ydWxlUm9sZUJlYW5GZWF0dXJlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUm9sZUJlYW5GZWF0dXJlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlQmVhbkZlYXR1cmUKK3J1bGVSb2xlQmVhbkZlYXR1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlQmVhbkF0dHJpYnV0ZV8wPXJ1bGVSb2xlQmVhbkF0dHJpYnV0ZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUm9sZUJlYW5BdHRyaWJ1dGVfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlQmVhblJlZmVyZW5jZV8xPXJ1bGVSb2xlQmVhblJlZmVyZW5jZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlCitlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlUnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGU9cnVsZVJvbGVCZWFuQXR0cmlidXRlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGUuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVCZWFuQXR0cmlidXRlCitydWxlUm9sZUJlYW5BdHRyaWJ1dGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdwcm9wZXJ0eScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRQcm9wZXJ0eUtleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEJlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD1ydWxlUm9sZVByb3BlcnR5RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJiZWFuQXR0cmlVbmF1dGhvcml6ZWQiLAorICAgICAgICAJCWx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzAsIAorICAgICAgICAJCSJSb2xlUHJvcGVydHlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlCitlbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUJlYW5SZWZlcmVuY2U9cnVsZVJvbGVCZWFuUmVmZXJlbmNlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlUm9sZUJlYW5SZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVCZWFuUmVmZXJlbmNlCitydWxlUm9sZUJlYW5SZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdyZWZlcmVuY2UnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwlvdGhlcmx2XzE9UlVMRV9JRAorCXsKKwkJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QmVhbkF0dHJpQ29sTEJlYW5SZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzAoKSk7IAorCX0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldEJlYW5BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9iZWFuQXR0cmlVbmF1dGhvcml6ZWRfMl8wPXJ1bGVSb2xlUHJvcGVydHlFbnVtCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImJlYW5BdHRyaVVuYXV0aG9yaXplZCIsCisgICAgICAgIAkJbHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMCwgCisgICAgICAgIAkJIlJvbGVQcm9wZXJ0eUVudW0iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUm9sZUR0b0ZlYXR1cmUKK2VudHJ5UnVsZVJvbGVEdG9GZWF0dXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVSdWxlKCkpOyB9CisJIGl2X3J1bGVSb2xlRHRvRmVhdHVyZT1ydWxlUm9sZUR0b0ZlYXR1cmUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlRHRvRmVhdHVyZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgUm9sZUR0b0ZlYXR1cmUKK3J1bGVSb2xlRHRvRmVhdHVyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvRmVhdHVyZUFjY2VzcygpLmdldFJvbGVEdG9BdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICB9CisgICAgdGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9cnVsZVJvbGVEdG9BdHRyaWJ1dGUKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX1JvbGVEdG9BdHRyaWJ1dGVfMC5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKworICAgIHwKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVBY2Nlc3MoKS5nZXRSb2xlRHRvUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgfQorICAgIHRoaXNfUm9sZUR0b1JlZmVyZW5jZV8xPXJ1bGVSb2xlRHRvUmVmZXJlbmNlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Sb2xlRHRvUmVmZXJlbmNlXzEuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlCitlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZVJvbGVEdG9BdHRyaWJ1dGU9cnVsZVJvbGVEdG9BdHRyaWJ1dGUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVSb2xlRHRvQXR0cmlidXRlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBSb2xlRHRvQXR0cmlidXRlCitydWxlUm9sZUR0b0F0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAlvdGhlcmx2XzA9J3Byb3BlcnR5JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlQWNjZXNzKCkuZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJb3RoZXJsdl8xPVJVTEVfSUQKKwl7CisJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlQWNjZXNzKCkuZ2V0RHRvQXR0cmlDb2xMRHRvQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKwl9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD1ydWxlUm9sZVByb3BlcnR5RW51bQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImR0b0F0dHJpVW5hdXRob3JpemVkIiwKKyAgICAgICAgCQlsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzAsIAorICAgICAgICAJCSJSb2xlUHJvcGVydHlFbnVtIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UKK2VudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlUm9sZUR0b1JlZmVyZW5jZT1ydWxlUm9sZUR0b1JlZmVyZW5jZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVJvbGVEdG9SZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIFJvbGVEdG9SZWZlcmVuY2UKK3J1bGVSb2xlRHRvUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0ncmVmZXJlbmNlJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAgfQorCW90aGVybHZfMT1SVUxFX0lECisJeworCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldER0b0F0dHJpQ29sTER0b1JlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgCisJfQorCispCispKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXREdG9BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9cnVsZVJvbGVQcm9wZXJ0eUVudW0JCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJkdG9BdHRyaVVuYXV0aG9yaXplZCIsCisgICAgICAgIAkJbHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wLCAKKyAgICAgICAgCQkiUm9sZVByb3BlcnR5RW51bSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorZW50cnlSdWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUnVsZSgpKTsgfSAKKwkgaXZfcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPXJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCitydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfUXVhbGlmaWVkTmFtZV8wPXJ1bGVRdWFsaWZpZWROYW1lICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19RdWFsaWZpZWROYW1lXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoCisJa3c9Jy4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSk7IAorICAgIH0KKworCWt3PScqJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRBc3Rlcmlza0tleXdvcmRfMV8xKCkpOyAKKyAgICB9CispPykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVF1YWxpZmllZE5hbWU9cnVsZVF1YWxpZmllZE5hbWUgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWUKK3J1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfVmFsaWRJRF8wPXJ1bGVWYWxpZElEICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19WYWxpZElEXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgKKwknLicgCispPT4KKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICB9CispCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVBY2Nlc3MoKS5nZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xKCkpOyAKKyAgICB9CisgICAgdGhpc19WYWxpZElEXzI9cnVsZVZhbGlkSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX1ZhbGlkSURfMik7CisgICAgfQorCisgICAgeyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykqKQorICAgIDsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZVZhbGlkSUQKK2VudHJ5UnVsZVZhbGlkSUQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyB9IAorCSBpdl9ydWxlVmFsaWRJRD1ydWxlVmFsaWRJRCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVZhbGlkSUQuY3VycmVudC5nZXRUZXh0KCk7IH0gIAorCSBFT0YgCis7CisKKy8vIFJ1bGUgVmFsaWRJRAorcnVsZVZhbGlkSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKyAgICB0aGlzX0lEXzA9UlVMRV9JRCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfSURfMCk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0lEXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0VmFsaWRJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgfQorCisgICAgOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQKK2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVUUkFOU0xBVEFCTEVJRD1ydWxlVFJBTlNMQVRBQkxFSUQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVUUkFOU0xBVEFCTEVJRC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBUUkFOU0xBVEFCTEVJRAorcnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisgICAgdGhpc19JRF8wPVJVTEVfSUQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOworICAgIH0KKworICAgIHsgCisgICAgbmV3TGVhZk5vZGUodGhpc19JRF8wLCBncmFtbWFyQWNjZXNzLmdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkuZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkpOyAKKyAgICB9CisKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYQW5ub3RhdGlvbgorZW50cnlSdWxlWEFubm90YXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhBbm5vdGF0aW9uPXJ1bGVYQW5ub3RhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhBbm5vdGF0aW9uLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYQW5ub3RhdGlvbgorcnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9J0AnIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0Q29tbWVyY2lhbEF0S2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldEFubm90YXRpb25UeXBlSnZtQW5ub3RhdGlvblR5cGVDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJygnIAorKT0+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+KCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY3Rpb25fMF8wXzAoKSwKKyAgICAgICAgICAgICRjdXJyZW50KTsKKyAgICB9CispCW90aGVybHZfMT0nc3luY2hyb25pemVkJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFN5bmNocm9uaXplZEtleXdvcmRfMF8wXzEoKSk7CisgICAgfQorCW90aGVybHZfMj0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRMZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfMF8yKCkpOworICAgIH0KKykpKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UGFyYW1YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfcGFyYW1fM18wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJwYXJhbSIsCisgICAgICAgIAkJbHZfcGFyYW1fM18wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispCW90aGVybHZfND0nKScgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0WFN5bmNocm9uaXplZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8yKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEV4cHJlc3Npb25YRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzNfMCgpKTsgCisJICAgIH0KKwkJbHZfZXhwcmVzc2lvbl81XzA9cnVsZVhFeHByZXNzaW9uCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImV4cHJlc3Npb24iLAorICAgICAgICAJCWx2X2V4cHJlc3Npb25fNV8wLCAKKyAgICAgICAgCQkiWEV4cHJlc3Npb24iKTsKKwkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKwkgICAgfQorCispCispKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWENhdGNoQ2xhdXNlCitlbnRyeVJ1bGVYQ2F0Y2hDbGF1c2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOyB9CisJIGl2X3J1bGVYQ2F0Y2hDbGF1c2U9cnVsZVhDYXRjaENsYXVzZSAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhDYXRjaENsYXVzZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWENhdGNoQ2xhdXNlCitydWxlWENhdGNoQ2xhdXNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKCgJJ2NhdGNoJyAKKyk9PglvdGhlcmx2XzA9J2NhdGNoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRDYXRjaEtleXdvcmRfMCgpKTsKKyAgICB9CispCW90aGVybHZfMT0nKCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXREZWNsYXJlZFBhcmFtRnVsbEp2bUZvcm1hbFBhcmFtZXRlclBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisJICAgIH0KKwkJbHZfZGVjbGFyZWRQYXJhbV8yXzA9cnVsZUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhdGNoQ2xhdXNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImRlY2xhcmVkUGFyYW0iLAorICAgICAgICAJCWx2X2RlY2xhcmVkUGFyYW1fMl8wLCAKKyAgICAgICAgCQkiRnVsbEp2bUZvcm1hbFBhcmFtZXRlciIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykJb3RoZXJsdl8zPScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKS5nZXRFeHByZXNzaW9uWEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF80XzAoKSk7IAorCSAgICB9CisJCWx2X2V4cHJlc3Npb25fNF8wPXJ1bGVYRXhwcmVzc2lvbgkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiZXhwcmVzc2lvbiIsCisgICAgICAgIAkJbHZfZXhwcmVzc2lvbl80XzAsIAorICAgICAgICAJCSJYRXhwcmVzc2lvbiIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVOdW1iZXIKK2VudHJ5UnVsZU51bWJlciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwlAaW5pdCB7IAorCQlIaWRkZW5Ub2tlbnMgbXlIaWRkZW5Ub2tlblN0YXRlID0gKChYdGV4dFRva2VuU3RyZWFtKWlucHV0KS5zZXRIaWRkZW5Ub2tlbnMoKTsKKwl9CisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE51bWJlclJ1bGUoKSk7IH0gCisJIGl2X3J1bGVOdW1iZXI9cnVsZU51bWJlciAKKwkgeyAkY3VycmVudD0kaXZfcnVsZU51bWJlci5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKK2ZpbmFsbHkgeworCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7Cit9CisKKy8vIFJ1bGUgTnVtYmVyCitydWxlTnVtYmVyIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKwkJSGlkZGVuVG9rZW5zIG15SGlkZGVuVG9rZW5TdGF0ZSA9ICgoWHRleHRUb2tlblN0cmVhbSlpbnB1dCkuc2V0SGlkZGVuVG9rZW5zKCk7CisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCAgICB0aGlzX0hFWF8wPVJVTEVfSEVYICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19IRVhfMCk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0hFWF8wLCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEhFWFRlcm1pbmFsUnVsZUNhbGxfMCgpKTsgCisgICAgfQorCisgICAgfCgoICAgIHRoaXNfSU5UXzE9UlVMRV9JTlQgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0lOVF8xKTsKKyAgICB9CisKKyAgICB7IAorICAgIG5ld0xlYWZOb2RlKHRoaXNfSU5UXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0TnVtYmVyQWNjZXNzKCkuZ2V0SU5UVGVybWluYWxSdWxlQ2FsbF8xXzBfMCgpKTsgCisgICAgfQorCisgICAgfCAgICB0aGlzX0RFQ0lNQUxfMj1SVUxFX0RFQ0lNQUwgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0RFQ0lNQUxfMik7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0RFQ0lNQUxfMiwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpKTsgCisgICAgfQorKSgKKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzFfMCgpKTsgCisgICAgfQorKCAgICB0aGlzX0lOVF80PVJVTEVfSU5UICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19JTlRfNCk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0lOVF80LCBncmFtbWFyQWNjZXNzLmdldE51bWJlckFjY2VzcygpLmdldElOVFRlcm1pbmFsUnVsZUNhbGxfMV8xXzFfMCgpKTsgCisgICAgfQorCisgICAgfCAgICB0aGlzX0RFQ0lNQUxfNT1SVUxFX0RFQ0lNQUwgICAgeworCQkkY3VycmVudC5tZXJnZSh0aGlzX0RFQ0lNQUxfNSk7CisgICAgfQorCisgICAgeyAKKyAgICBuZXdMZWFmTm9kZSh0aGlzX0RFQ0lNQUxfNSwgZ3JhbW1hckFjY2Vzcy5nZXROdW1iZXJBY2Nlc3MoKS5nZXRERUNJTUFMVGVybWluYWxSdWxlQ2FsbF8xXzFfMV8xKCkpOyAKKyAgICB9CispKT8pKQorICAgIDsKK2ZpbmFsbHkgeworCW15SGlkZGVuVG9rZW5TdGF0ZS5yZXN0b3JlKCk7Cit9CisKKworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1UeXBlUmVmZXJlbmNlPXJ1bGVKdm1UeXBlUmVmZXJlbmNlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtVHlwZVJlZmVyZW5jZS5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVHlwZVJlZmVyZW5jZQorcnVsZUp2bVR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzBfMCgpKTsgCisgICAgfQorICAgIHRoaXNfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VfMD1ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UKKyAgICB7IAorICAgICAgICAkY3VycmVudCA9ICR0aGlzX0p2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlXzAuY3VycmVudDsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisoKCgoCispCXJ1bGVBcnJheUJyYWNrZXRzKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZUNvbXBvbmVudFR5cGVBY3Rpb25fMF8xXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFycmF5QnJhY2tldHNQYXJzZXJSdWxlQ2FsbF8wXzFfMF8xKCkpOyAKKyAgICB9CitydWxlQXJyYXlCcmFja2V0cworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CispKSopCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0WEZ1bmN0aW9uVHlwZVJlZlBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgIH0KKyAgICB0aGlzX1hGdW5jdGlvblR5cGVSZWZfMz1ydWxlWEZ1bmN0aW9uVHlwZVJlZgorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfWEZ1bmN0aW9uVHlwZVJlZl8zLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorKQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlQXJyYXlCcmFja2V0cworZW50cnlSdWxlQXJyYXlCcmFja2V0cyByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c1J1bGUoKSk7IH0gCisJIGl2X3J1bGVBcnJheUJyYWNrZXRzPXJ1bGVBcnJheUJyYWNrZXRzIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlQXJyYXlCcmFja2V0cy5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBBcnJheUJyYWNrZXRzCitydWxlQXJyYXlCcmFja2V0cyByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAorCWt3PSdbJyAKKyAgICB7CisgICAgICAgICRjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldExlZnRTcXVhcmVCcmFja2V0S2V5d29yZF8wKCkpOyAKKyAgICB9CisKKwlrdz0nXScgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNBY2Nlc3MoKS5nZXRSaWdodFNxdWFyZUJyYWNrZXRLZXl3b3JkXzEoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmCitlbnRyeVJ1bGVYRnVuY3Rpb25UeXBlUmVmIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSk7IH0KKwkgaXZfcnVsZVhGdW5jdGlvblR5cGVSZWY9cnVsZVhGdW5jdGlvblR5cGVSZWYgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVYRnVuY3Rpb25UeXBlUmVmLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBYRnVuY3Rpb25UeXBlUmVmCitydWxlWEZ1bmN0aW9uVHlwZVJlZiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgJb3RoZXJsdl8wPScoJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzAoKSk7CisgICAgfQorKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0p2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzFfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9wYXJhbVR5cGVzXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInBhcmFtVHlwZXMiLAorICAgICAgICAJCWx2X3BhcmFtVHlwZXNfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMj0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEZ1bmN0aW9uVHlwZVJlZkFjY2VzcygpLmdldENvbW1hS2V5d29yZF8wXzFfMV8wKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UGFyYW1UeXBlc0p2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IAorCSAgICB9CisJCWx2X3BhcmFtVHlwZXNfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicGFyYW1UeXBlcyIsCisgICAgICAgIAkJbHZfcGFyYW1UeXBlc18zXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqKT8Jb3RoZXJsdl80PScpJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yKCkpOworICAgIH0KKyk/CW90aGVybHZfNT0nPT4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF8xKCkpOworICAgIH0KKygKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmV0dXJuVHlwZUp2bVR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8yXzAoKSk7IAorCSAgICB9CisJCWx2X3JldHVyblR5cGVfNl8wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkicmV0dXJuVHlwZSIsCisgICAgICAgIAkJbHZfcmV0dXJuVHlwZV82XzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCitlbnRyeVJ1bGVKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U9cnVsZUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlCitydWxlSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZUNyb3NzUmVmZXJlbmNlXzBfMCgpKTsgCisJICAgIH0KKwkJcnVsZVF1YWxpZmllZE5hbWUJCXsgCisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgoKAknPCcgCispPT4Jb3RoZXJsdl8xPSc8JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMV8wKCkpOworICAgIH0KKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzJfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzJfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCW90aGVybHZfMz0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzMsIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMV8yXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0QXJndW1lbnRzSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8yXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzRfMD1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImFyZ3VtZW50cyIsCisgICAgICAgIAkJbHZfYXJndW1lbnRzXzRfMCwgCisgICAgICAgIAkJIkp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpKglvdGhlcmx2XzU9Jz4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl81LCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF8xXzMoKSk7CisgICAgfQorKCgoKCgKKykJJy4nIAorKSk9PigoCisgICAgeworICAgICAgICAkY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpLAorICAgICAgICAgICAgJGN1cnJlbnQpOworICAgIH0KKykJb3RoZXJsdl83PScuJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNywgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEZ1bGxTdG9wS2V5d29yZF8xXzRfMF8wXzEoKSk7CisgICAgfQorKSkoCisoCisJCXsKKwkJCWlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZUNyb3NzUmVmZXJlbmNlXzFfNF8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVWYWxpZElECQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKCgJJzwnIAorKT0+CW90aGVybHZfOT0nPCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzksIGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfNF8yXzAoKSk7CisgICAgfQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEFyZ3VtZW50c0p2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfNF8yXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzEwXzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c18xMF8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgJb3RoZXJsdl8xMT0nLCcgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzExLCBncmFtbWFyQWNjZXNzLmdldEp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfNF8yXzJfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRBcmd1bWVudHNKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xXzRfMl8yXzFfMCgpKTsgCisJICAgIH0KKwkJbHZfYXJndW1lbnRzXzEyXzA9cnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJhcmd1bWVudHMiLAorICAgICAgICAJCWx2X2FyZ3VtZW50c18xMl8wLCAKKyAgICAgICAgCQkiSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkqCW90aGVybHZfMTM9Jz4nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xMywgZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMV80XzJfMygpKTsKKyAgICB9CispPykqKT8pCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK2VudHJ5UnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZT1ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UKK3J1bGVKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0SnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX0p2bVR5cGVSZWZlcmVuY2VfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQorICAgIHsgCisgICAgICAgICRjdXJyZW50ID0gJHRoaXNfSnZtVHlwZVJlZmVyZW5jZV8wLmN1cnJlbnQ7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisgICAgfAorICAgIHsgCisgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICB9CisgICAgdGhpc19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfMT1ydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlCisgICAgeyAKKyAgICAgICAgJGN1cnJlbnQgPSAkdGhpc19Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VfMS5jdXJyZW50OyAKKyAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgIH0KKykKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorZW50cnlSdWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKwk6CisJeyBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlPXJ1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2UuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZQorcnVsZUp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgCisgICAgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKCgKKyAgICB7CisgICAgICAgICRjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjdGlvbl8wKCksCisgICAgICAgICAgICAkY3VycmVudCk7CisgICAgfQorKQlvdGhlcmx2XzE9Jz8nIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFF1ZXN0aW9uTWFya0tleXdvcmRfMSgpKTsKKyAgICB9CisoKCgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0p2bVVwcGVyQm91bmRQYXJzZXJSdWxlQ2FsbF8yXzBfMF8wKCkpOyAKKwkgICAgfQorCQlsdl9jb25zdHJhaW50c18yXzA9cnVsZUp2bVVwcGVyQm91bmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCWFkZCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImNvbnN0cmFpbnRzIiwKKyAgICAgICAgCQlsdl9jb25zdHJhaW50c18yXzAsIAorICAgICAgICAJCSJKdm1VcHBlckJvdW5kIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSgKKygKKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRDb25zdHJhaW50c0p2bVVwcGVyQm91bmRBbmRlZFBhcnNlclJ1bGVDYWxsXzJfMF8xXzAoKSk7IAorCSAgICB9CisJCWx2X2NvbnN0cmFpbnRzXzNfMD1ydWxlSnZtVXBwZXJCb3VuZEFuZGVkCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb25zdHJhaW50cyIsCisgICAgICAgIAkJbHZfY29uc3RyYWludHNfM18wLCAKKyAgICAgICAgCQkiSnZtVXBwZXJCb3VuZEFuZGVkIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSopCisgICAgfCgoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kUGFyc2VyUnVsZUNhbGxfMl8xXzBfMCgpKTsgCisJICAgIH0KKwkJbHZfY29uc3RyYWludHNfNF8wPXJ1bGVKdm1Mb3dlckJvdW5kCQl7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZVJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlhZGQoCisgICAgICAgCQkJJGN1cnJlbnQsIAorICAgICAgIAkJCSJjb25zdHJhaW50cyIsCisgICAgICAgIAkJbHZfY29uc3RyYWludHNfNF8wLCAKKyAgICAgICAgCQkiSnZtTG93ZXJCb3VuZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0Q29uc3RyYWludHNKdm1Mb3dlckJvdW5kQW5kZWRQYXJzZXJSdWxlQ2FsbF8yXzFfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9jb25zdHJhaW50c181XzA9cnVsZUp2bUxvd2VyQm91bmRBbmRlZAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJYWRkKAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkiY29uc3RyYWludHMiLAorICAgICAgICAJCWx2X2NvbnN0cmFpbnRzXzVfMCwgCisgICAgICAgIAkJIkp2bUxvd2VyQm91bmRBbmRlZCIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykqKSk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlSnZtVXBwZXJCb3VuZAorZW50cnlSdWxlSnZtVXBwZXJCb3VuZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRSdWxlKCkpOyB9CisJIGl2X3J1bGVKdm1VcHBlckJvdW5kPXJ1bGVKdm1VcHBlckJvdW5kIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtVXBwZXJCb3VuZC5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgSnZtVXBwZXJCb3VuZAorcnVsZUp2bVVwcGVyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPSdleHRlbmRzJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0RXh0ZW5kc0tleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlUmVmZXJlbmNlXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVSZWZlcmVuY2UiLAorICAgICAgICAJCWx2X3R5cGVSZWZlcmVuY2VfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1VcHBlckJvdW5kQW5kZWQKK2VudHJ5UnVsZUp2bVVwcGVyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bVVwcGVyQm91bmRBbmRlZD1ydWxlSnZtVXBwZXJCb3VuZEFuZGVkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtVXBwZXJCb3VuZEFuZGVkLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1VcHBlckJvdW5kQW5kZWQKK3J1bGVKdm1VcHBlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPScmJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlUmVmZXJlbmNlXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1VcHBlckJvdW5kQW5kZWRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZVJlZmVyZW5jZSIsCisgICAgICAgIAkJbHZfdHlwZVJlZmVyZW5jZV8xXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisvLyBFbnRyeSBydWxlIGVudHJ5UnVsZUp2bUxvd2VyQm91bmQKK2VudHJ5UnVsZUp2bUxvd2VyQm91bmQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsgfQorCSBpdl9ydWxlSnZtTG93ZXJCb3VuZD1ydWxlSnZtTG93ZXJCb3VuZCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZUp2bUxvd2VyQm91bmQuY3VycmVudDsgfSAKKwkgRU9GIAorOworCisvLyBSdWxlIEp2bUxvd2VyQm91bmQKK3J1bGVKdm1Mb3dlckJvdW5kIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0nc3VwZXInIAorICAgIHsKKyAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRTdXBlcktleXdvcmRfMCgpKTsKKyAgICB9CisoCisoCisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlUmVmZXJlbmNlXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJInR5cGVSZWZlcmVuY2UiLAorICAgICAgICAJCWx2X3R5cGVSZWZlcmVuY2VfMV8wLCAKKyAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykpCis7CisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVKdm1Mb3dlckJvdW5kQW5kZWQKK2VudHJ5UnVsZUp2bUxvd2VyQm91bmRBbmRlZCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZFJ1bGUoKSk7IH0KKwkgaXZfcnVsZUp2bUxvd2VyQm91bmRBbmRlZD1ydWxlSnZtTG93ZXJCb3VuZEFuZGVkIAorCSB7ICRjdXJyZW50PSRpdl9ydWxlSnZtTG93ZXJCb3VuZEFuZGVkLmN1cnJlbnQ7IH0gCisJIEVPRiAKKzsKKworLy8gUnVsZSBKdm1Mb3dlckJvdW5kQW5kZWQKK3J1bGVKdm1Mb3dlckJvdW5kQW5kZWQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygJb3RoZXJsdl8wPScmJyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKS5nZXRBbXBlcnNhbmRLZXl3b3JkXzAoKSk7CisgICAgfQorKAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpLmdldFR5cGVSZWZlcmVuY2VKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKwkgICAgfQorCQlsdl90eXBlUmVmZXJlbmNlXzFfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZQkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkidHlwZVJlZmVyZW5jZSIsCisgICAgICAgIAkJbHZfdHlwZVJlZmVyZW5jZV8xXzAsIAorICAgICAgICAJCSJKdm1UeXBlUmVmZXJlbmNlIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkKKzsKKworCisKKworCisKKworLy8gRW50cnkgcnVsZSBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkCitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkUnVsZSgpKTsgfSAKKwkgaXZfcnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQ9cnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQgCisJIHsgJGN1cnJlbnQ9JGl2X3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkLmN1cnJlbnQuZ2V0VGV4dCgpOyB9ICAKKwkgRU9GIAorOworCisvLyBSdWxlIFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQKK3J1bGVRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCisgICAgeyAKKyAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgfQorICAgIHRoaXNfUXVhbGlmaWVkTmFtZV8wPXJ1bGVRdWFsaWZpZWROYW1lICAgIHsKKwkJJGN1cnJlbnQubWVyZ2UodGhpc19RdWFsaWZpZWROYW1lXzApOworICAgIH0KKworICAgIHsgCisgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICB9CisKKwlrdz0nLicgCisgICAgeworICAgICAgICAkY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMSgpKTsgCisgICAgfQorCisJa3c9JyonIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzIoKSk7IAorICAgIH0KKykKKyAgICA7CisKKworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlWEltcG9ydERlY2xhcmF0aW9uCitlbnRyeVJ1bGVYSW1wb3J0RGVjbGFyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIAorCToKKwl7IG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOyB9CisJIGl2X3J1bGVYSW1wb3J0RGVjbGFyYXRpb249cnVsZVhJbXBvcnREZWNsYXJhdGlvbiAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVhJbXBvcnREZWNsYXJhdGlvbi5jdXJyZW50OyB9IAorCSBFT0YgCis7CisKKy8vIFJ1bGUgWEltcG9ydERlY2xhcmF0aW9uCitydWxlWEltcG9ydERlY2xhcmF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyAKKyAgICB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCW90aGVybHZfMD0naW1wb3J0JyAKKyAgICB7CisgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7CisgICAgfQorKCgoCisoCisJCWx2X3N0YXRpY18xXzA9CSdzdGF0aWMnIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfc3RhdGljXzFfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRTdGF0aWNTdGF0aWNLZXl3b3JkXzFfMF8wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAic3RhdGljIiwgdHJ1ZSwgInN0YXRpYyIpOworCSAgICB9CisKKykKKykoCisoCisJCWx2X2V4dGVuc2lvbl8yXzA9CSdleHRlbnNpb24nIAorICAgIHsKKyAgICAgICAgbmV3TGVhZk5vZGUobHZfZXh0ZW5zaW9uXzJfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRFeHRlbnNpb25FeHRlbnNpb25LZXl3b3JkXzFfMF8xXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAiZXh0ZW5zaW9uIiwgdHJ1ZSwgImV4dGVuc2lvbiIpOworCSAgICB9CisKKykKKyk/KAorKAorCQl7CisJCQlpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgIH0KKwkJeyAKKwkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRJbXBvcnRlZFR5cGVKdm1EZWNsYXJlZFR5cGVDcm9zc1JlZmVyZW5jZV8xXzBfMl8wKCkpOyAKKwkgICAgfQorCQlydWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykoKAorKAorCQlsdl93aWxkY2FyZF80XzA9CScqJyAKKyAgICB7CisgICAgICAgIG5ld0xlYWZOb2RlKGx2X3dpbGRjYXJkXzRfMCwgZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRXaWxkY2FyZEFzdGVyaXNrS2V5d29yZF8xXzBfM18wXzAoKSk7CisgICAgfQorIAorCSAgICB7CisJICAgICAgICBpZiAoJGN1cnJlbnQ9PW51bGwpIHsKKwkgICAgICAgICAgICAkY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSk7CisJICAgICAgICB9CisgICAgICAgCQlzZXRXaXRoTGFzdENvbnN1bWVkKCRjdXJyZW50LCAid2lsZGNhcmQiLCB0cnVlLCAiKiIpOworCSAgICB9CisKKykKKykKKyAgICB8KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldE1lbWJlck5hbWVWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8wXzNfMV8wKCkpOyAKKwkgICAgfQorCQlsdl9tZW1iZXJOYW1lXzVfMD1ydWxlVmFsaWRJRAkJeworCSAgICAgICAgaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgIAkJc2V0KAorICAgICAgIAkJCSRjdXJyZW50LCAKKyAgICAgICAJCQkibWVtYmVyTmFtZSIsCisgICAgICAgIAkJbHZfbWVtYmVyTmFtZV81XzAsIAorICAgICAgICAJCSJWYWxpZElEIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkpCisgICAgfCgKKygKKwkJeworCQkJaWYgKCRjdXJyZW50PT1udWxsKSB7CisJICAgICAgICAgICAgJGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYSW1wb3J0RGVjbGFyYXRpb25SdWxlKCkpOworCSAgICAgICAgfQorICAgICAgICB9CisJCXsgCisJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0SW1wb3J0ZWRUeXBlSnZtRGVjbGFyZWRUeXBlQ3Jvc3NSZWZlcmVuY2VfMV8xXzAoKSk7IAorCSAgICB9CisJCXJ1bGVRdWFsaWZpZWROYW1lCQl7IAorCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworCSAgICB9CisKKykKKykKKyAgICB8KAorKAorCQl7IAorCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpLmdldEltcG9ydGVkTmFtZXNwYWNlUXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZFBhcnNlclJ1bGVDYWxsXzFfMl8wKCkpOyAKKwkgICAgfQorCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV83XzA9cnVsZVF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmQJCXsKKwkgICAgICAgIGlmICgkY3VycmVudD09bnVsbCkgeworCSAgICAgICAgICAgICRjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uUnVsZSgpKTsKKwkgICAgICAgIH0KKyAgICAgICAJCXNldCgKKyAgICAgICAJCQkkY3VycmVudCwgCisgICAgICAgCQkJImltcG9ydGVkTmFtZXNwYWNlIiwKKyAgICAgICAgCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV83XzAsIAorICAgICAgICAJCSJRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkIik7CisJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisJICAgIH0KKworKQorKSkoCW90aGVybHZfOD0nOycgCisgICAgeworICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzgsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8yKCkpOworICAgIH0KKyk/KQorOworCisKKworCisKKy8vIEVudHJ5IHJ1bGUgZW50cnlSdWxlUXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0CitlbnRyeVJ1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gCisJOgorCXsgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydFJ1bGUoKSk7IH0gCisJIGl2X3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ9cnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydCAKKwkgeyAkY3VycmVudD0kaXZfcnVsZVF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydC5jdXJyZW50LmdldFRleHQoKTsgfSAgCisJIEVPRiAKKzsKKworLy8gUnVsZSBRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQKK3J1bGVRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIAorICAgIEBpbml0IHsgZW50ZXJSdWxlKCk7IAorICAgIH0KKyAgICBAYWZ0ZXIgeyBsZWF2ZVJ1bGUoKTsgfToKKygKKyAgICB7IAorICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgIH0KKyAgICB0aGlzX1ZhbGlkSURfMD1ydWxlVmFsaWRJRCAgICB7CisJCSRjdXJyZW50Lm1lcmdlKHRoaXNfVmFsaWRJRF8wKTsKKyAgICB9CisKKyAgICB7IAorICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgfQorCisJa3c9Jy4nIAorICAgIHsKKyAgICAgICAgJGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMSgpKTsgCisgICAgfQorKSsKKyAgICA7CisKKworCisKKworLy8gUnVsZSBSb2xlRW51bQorcnVsZVJvbGVFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAllbnVtTGl0ZXJhbF8wPSdhbnknIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0QW55RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8wLCBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0QW55RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfMT0nY3JlYXRhYmxlJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldENyZWF0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldENyZWF0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzI9J3JlYWRhYmxlJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldFJlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8yLCBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0UmVhZGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IAorICAgIH0KKykKKyAgICB8KAllbnVtTGl0ZXJhbF8zPSd1cGRhdGFibGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0VXBkYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8zLCBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnVtQWNjZXNzKCkuZ2V0VXBkYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfND0nZGVsZXRhYmxlJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldERlbGV0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfNCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW51bUFjY2VzcygpLmdldERlbGV0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpKTsgCisgICAgfQorKSk7CisKKworCisvLyBSdWxlIFJvbGVQcm9wZXJ0eUVudW0KK3J1bGVSb2xlUHJvcGVydHlFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoKAllbnVtTGl0ZXJhbF8wPSdpbnZpc2libGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKS5nZXRJbnZpc2libGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVByb3BlcnR5RW51bUFjY2VzcygpLmdldEludmlzaWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpKTsgCisgICAgfQorKQorICAgIHwoCWVudW1MaXRlcmFsXzE9J2Rpc2FibGVkJyAKKwl7CisgICAgICAgICRjdXJyZW50ID0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0RGlzYWJsZWRFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEoKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVByb3BlcnR5RW51bUFjY2VzcygpLmdldERpc2FibGVkRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkpOyAKKyAgICB9CispCisgICAgfCgJZW51bUxpdGVyYWxfMj0nbm9uZWRpdGFibGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKS5nZXROb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpLmdldEVudW1MaXRlcmFsKCkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgbmV3TGVhZk5vZGUoZW51bUxpdGVyYWxfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlUHJvcGVydHlFbnVtQWNjZXNzKCkuZ2V0Tm9uZWRpdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzIoKSk7IAorICAgIH0KKykpOworCisKKworLy8gUnVsZSBSb2xlQmxpcFByb2Nlc3NFbnVtCitydWxlUm9sZUJsaXBQcm9jZXNzRW51bSByZXR1cm5zIFtFbnVtZXJhdG9yIGN1cnJlbnQ9bnVsbF0gCisgICAgQGluaXQgeyBlbnRlclJ1bGUoKTsgfQorICAgIEBhZnRlciB7IGxlYXZlUnVsZSgpOyB9OgorKAllbnVtTGl0ZXJhbF8wPSdzdGFydGFibGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0VudW1BY2Nlc3MoKS5nZXRTdGFydGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkuZ2V0RW51bUxpdGVyYWwoKS5nZXRJbnN0YW5jZSgpOworICAgICAgICBuZXdMZWFmTm9kZShlbnVtTGl0ZXJhbF8wLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0VudW1BY2Nlc3MoKS5nZXRTdGFydGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkpOyAKKyAgICB9CispOworCisKKworLy8gUnVsZSBSb2xlQmxpcFVzZXJUYXNrRW51bQorcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtIHJldHVybnMgW0VudW1lcmF0b3IgY3VycmVudD1udWxsXSAKKyAgICBAaW5pdCB7IGVudGVyUnVsZSgpOyB9CisgICAgQGFmdGVyIHsgbGVhdmVSdWxlKCk7IH06CisoCWVudW1MaXRlcmFsXzA9J2V4ZWN1dGFibGUnIAorCXsKKyAgICAgICAgJGN1cnJlbnQgPSBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tFbnVtQWNjZXNzKCkuZ2V0RXhlY3V0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb24oKS5nZXRFbnVtTGl0ZXJhbCgpLmdldEluc3RhbmNlKCk7CisgICAgICAgIG5ld0xlYWZOb2RlKGVudW1MaXRlcmFsXzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0VudW1BY2Nlc3MoKS5nZXRFeGVjdXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbigpKTsgCisgICAgfQorKTsKKworCisKK1JVTEVfSEVYIDogKCcweCd8JzBYJykgKCcwJy4uJzknfCdhJy4uJ2YnfCdBJy4uJ0YnfCdfJykrICgnIycgKCgnYid8J0InKSAoJ2knfCdJJyl8KCdsJ3wnTCcpKSk/OworCitSVUxFX0lOVCA6ICcwJy4uJzknICgnMCcuLic5J3wnXycpKjsKKworUlVMRV9ERUNJTUFMIDogUlVMRV9JTlQgKCgnZSd8J0UnKSAoJysnfCctJyk/IFJVTEVfSU5UKT8gKCgnYid8J0InKSAoJ2knfCdJJ3wnZCd8J0QnKXwoJ2wnfCdMJ3wnZCd8J0QnfCdmJ3wnRicpKT87CisKK1JVTEVfSUQgOiAnXic/ICgnYScuLid6J3wnQScuLidaJ3wnJCd8J18nKSAoJ2EnLi4neid8J0EnLi4nWid8JyQnfCdfJ3wnMCcuLic5JykqOworCitSVUxFX1NUUklORyA6ICgnIicgKCdcXCcgLnx+KCgnXFwnfCciJykpKSogJyInP3wnXCcnICgnXFwnIC58figoJ1xcJ3wnXCcnKSkpKiAnXCcnPyk7CisKK1JVTEVfTUxfQ09NTUVOVCA6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7fSA6IC4gKSonKi8nOworCitSVUxFX1NMX0NPTU1FTlQgOiAnLy8nIH4oKCdcbid8J1xyJykpKiAoJ1xyJz8gJ1xuJyk/OworCitSVUxFX1dTIDogKCcgJ3wnXHQnfCdccid8J1xuJykrOworCitSVUxFX0FOWV9PVEhFUiA6IC47CisKKwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wudG9rZW5zIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wudG9rZW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Y2MzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC50b2tlbnMKQEAgLTAsMCArMSwyMDMgQEAKKychJz02NAorJyE9Jz00OQorJyE9PSc9NTEKKycjJz0zNQorJyUnPTYzCisnJT0nPTQyCisnJiYnPTQ3CisnJic9OTkKKycoJz0zMQorJyknPTMzCisnKic9MjkKKycqKic9NjEKKycqPSc9NDAKKycrJz01OQorJysrJz02NgorJys9Jz0zOAorJywnPTMyCisnLSc9NjAKKyctLSc9NjcKKyctPSc9MzkKKyctPic9NTMKKycuJz0yOAorJy4uJz01NQorJy4uPCc9NTQKKycvJz02MgorJy89Jz00MQorJzonPTc1CisnOjonPTY4CisnOyc9NzEKKyc8Jz00MworJzw+Jz01NworJz0nPTM0CisnPT0nPTQ4CisnPT09Jz01MAorJz0+Jz01NgorJz4nPTQ0CisnPj0nPTQ1CisnPyc9OTgKKyc/Lic9NjkKKyc/Oic9NTgKKydAJz0zMAorJ1snPTM2CisnXSc9MzcKKydhbGwnPTIxCisnYW55Jz0xMDAKKydhcyc9NjUKKydiZWFuJz0xOQorJ2Nhc2UnPTc3CisnY2F0Y2gnPTk3CisnY3JlYXRhYmxlJz0xMDEKKydkZWZhdWx0Jz03NgorJ2RlbGV0YWJsZSc9MTA0CisnZGlzYWJsZWQnPTEwNgorJ2RvJz04MAorJ2R0byc9MjAKKydlbHNlJz03MworJ2VudGl0eSc9MTgKKydleGVjdXRhYmxlJz0xMDkKKydleHRlbmRzJz04MworJ2V4dGVuc2lvbic9ODUKKydmYWxzZSc9ODgKKydmaW5hbGx5Jz05NQorJ2Zvcic9NzgKKydpZic9NzIKKydpbXBvcnQnPTE2CisnaW5zdGFuY2VvZic9NTIKKydpbnZpc2libGUnPTEwNQorJ2lzJz0yNQorJ25ldyc9ODcKKydub25lZGl0YWJsZSc9MTA3CisnbnVsbCc9OTAKKydwYWNrYWdlJz0xMworJ3Byb2Nlc3MnPTI0CisncHJvcGVydHknPTI2CisncmVhZGFibGUnPTEwMgorJ3JlZmVyZW5jZSc9MjcKKydyZXR1cm4nPTkzCisncm9sZSc9MTcKKydzdGFydGFibGUnPTEwOAorJ3N0YXRpYyc9ODQKKydzdXBlcic9ODYKKydzd2l0Y2gnPTc0Cisnc3luY2hyb25pemVkJz05NgorJ3Rocm93Jz05MgorJ3RydWUnPTg5CisndHJ5Jz05NAorJ3R5cGVvZic9OTEKKyd1cGRhdGFibGUnPTEwMworJ3VzZXJ0YXNrJz0yMworJ3VzZXJ0YXNrcyc9MjIKKyd2YWwnPTgyCisndmFyJz04MQorJ3doaWxlJz03OQorJ3snPTE0CisnfCc9NzAKKyd8fCc9NDYKKyd9Jz0xNQorUlVMRV9BTllfT1RIRVI9MTIKK1JVTEVfREVDSU1BTD04CitSVUxFX0hFWD02CitSVUxFX0lEPTQKK1JVTEVfSU5UPTcKK1JVTEVfTUxfQ09NTUVOVD05CitSVUxFX1NMX0NPTU1FTlQ9MTAKK1JVTEVfU1RSSU5HPTUKK1JVTEVfV1M9MTEKK1RfXzEwMD0xMDAKK1RfXzEwMT0xMDEKK1RfXzEwMj0xMDIKK1RfXzEwMz0xMDMKK1RfXzEwND0xMDQKK1RfXzEwNT0xMDUKK1RfXzEwNj0xMDYKK1RfXzEwNz0xMDcKK1RfXzEwOD0xMDgKK1RfXzEwOT0xMDkKK1RfXzEzPTEzCitUX18xND0xNAorVF9fMTU9MTUKK1RfXzE2PTE2CitUX18xNz0xNworVF9fMTg9MTgKK1RfXzE5PTE5CitUX18yMD0yMAorVF9fMjE9MjEKK1RfXzIyPTIyCitUX18yMz0yMworVF9fMjQ9MjQKK1RfXzI1PTI1CitUX18yNj0yNgorVF9fMjc9MjcKK1RfXzI4PTI4CitUX18yOT0yOQorVF9fMzA9MzAKK1RfXzMxPTMxCitUX18zMj0zMgorVF9fMzM9MzMKK1RfXzM0PTM0CitUX18zNT0zNQorVF9fMzY9MzYKK1RfXzM3PTM3CitUX18zOD0zOAorVF9fMzk9MzkKK1RfXzQwPTQwCitUX180MT00MQorVF9fNDI9NDIKK1RfXzQzPTQzCitUX180ND00NAorVF9fNDU9NDUKK1RfXzQ2PTQ2CitUX180Nz00NworVF9fNDg9NDgKK1RfXzQ5PTQ5CitUX181MD01MAorVF9fNTE9NTEKK1RfXzUyPTUyCitUX181Mz01MworVF9fNTQ9NTQKK1RfXzU1PTU1CitUX181Nj01NgorVF9fNTc9NTcKK1RfXzU4PTU4CitUX181OT01OQorVF9fNjA9NjAKK1RfXzYxPTYxCitUX182Mj02MgorVF9fNjM9NjMKK1RfXzY0PTY0CitUX182NT02NQorVF9fNjY9NjYKK1RfXzY3PTY3CitUX182OD02OAorVF9fNjk9NjkKK1RfXzcwPTcwCitUX183MT03MQorVF9fNzI9NzIKK1RfXzczPTczCitUX183ND03NAorVF9fNzU9NzUKK1RfXzc2PTc2CitUX183Nz03NworVF9fNzg9NzgKK1RfXzc5PTc5CitUX184MD04MAorVF9fODE9ODEKK1RfXzgyPTgyCitUX184Mz04MworVF9fODQ9ODQKK1RfXzg1PTg1CitUX184Nj04NgorVF9fODc9ODcKK1RfXzg4PTg4CitUX184OT04OQorVF9fOTA9OTAKK1RfXzkxPTkxCitUX185Mj05MgorVF9fOTM9OTMKK1RfXzk0PTk0CitUX185NT05NQorVF9fOTY9OTYKK1RfXzk3PTk3CitUX185OD05OAorVF9fOTk9OTkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTIzMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlci5qYXZhCkBAIC0wLDAgKzEsNDQ1MyBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wucGFyc2VyLmFudGxyLmludGVybmFsOworCisvLyBIYWNrOiBVc2Ugb3VyIG93biBMZXhlciBzdXBlcmNsYXNzIGJ5IG1lYW5zIG9mIGltcG9ydC4gCisvLyBDdXJyZW50bHkgdGhlcmUgaXMgbm8gb3RoZXIgd2F5IHRvIHNwZWNpZnkgdGhlIHN1cGVyY2xhc3MgZm9yIHRoZSBsZXhlci4KK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuTGV4ZXI7CisKKworaW1wb3J0IG9yZy5hbnRsci5ydW50aW1lLio7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEludGVybmFsQXV0aG9yaXphdGlvbkRTTExleGVyIGV4dGVuZHMgTGV4ZXIgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTk9NTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTU9NTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTY9NTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTc9NTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTg9NTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTE9NTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTQ9NTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjA9NjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjM9NjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzM9MzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzA9MzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzE9MzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzI9MzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDg9NDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDk9NDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDQ9NDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDU9NDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDY9NDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDc9NDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDA9NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTE9OTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAwPTEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mj05MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mz05MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDI9MTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk0PTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMT0xMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTA9OTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY9MTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc9MTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg9MTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTk9OTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTU9OTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTY9OTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTc9OTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTg9OTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9ERUNJTUFMPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjY9MjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjc9Mjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjg9Mjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjk9Mjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ9MjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA9MjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzI9NzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzg9Nzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworICAgIHB1YmxpYyBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xMZXhlcigpIHs7fSAKKyAgICBwdWJsaWMgSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCkgeworICAgICAgICB0aGlzKGlucHV0LCBuZXcgUmVjb2duaXplclNoYXJlZFN0YXRlKCkpOworICAgIH0KKyAgICBwdWJsaWMgSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMTGV4ZXIoQ2hhclN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHN1cGVyKGlucHV0LHN0YXRlKTsKKworICAgIH0KKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJGaWxlTmFtZSgpIHsgcmV0dXJuICIuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nIjsgfQorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExOjc6ICggJ3BhY2thZ2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE6OTogJ3BhY2thZ2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicGFja2FnZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjo3OiAoICd7JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyOjk6ICd7JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3snKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzOjc6ICggJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM6OTogJ30nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnfScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xNigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ6NzogKCAnaW1wb3J0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0Ojk6ICdpbXBvcnQnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiaW1wb3J0Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xNyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1Ojc6ICggJ3JvbGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU6OTogJ3JvbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgicm9sZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzE4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzE4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjo3OiAoICdlbnRpdHknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY6OTogJ2VudGl0eScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJlbnRpdHkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzE5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc6NzogKCAnYmVhbicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzo5OiAnYmVhbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJiZWFuIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzE5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4Ojc6ICggJ2R0bycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODo5OiAnZHRvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImR0byIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzIxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzIxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTo3OiAoICdhbGwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk6OTogJ2FsbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbGwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzIyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yMjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA6NzogKCAndXNlcnRhc2tzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwOjk6ICd1c2VydGFza3MnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXNlcnRhc2tzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzIyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOjc6ICggJ3VzZXJ0YXNrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOjk6ICd1c2VydGFzaycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ1c2VydGFzayIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjo3OiAoICdwcm9jZXNzJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOjk6ICdwcm9jZXNzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInByb2Nlc3MiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yNTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM6NzogKCAnaXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM6OTogJ2lzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18yNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0Ojc6ICggJ3Byb3BlcnR5JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0Ojk6ICdwcm9wZXJ0eScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJwcm9wZXJ0eSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTo3OiAoICdyZWZlcmVuY2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU6OTogJ3JlZmVyZW5jZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZWZlcmVuY2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzI4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18yOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18yODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY6NzogKCAnLicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjo5OiAnLicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcuJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18yOCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMjkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzI5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzI5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzo3OiAoICcqJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Ojk6ICcqJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyonKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzI5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4Ojc6ICggJ0AnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg6OTogJ0AnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnQCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzAiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzMxIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zMTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk6NzogKCAnKCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTo5OiAnKCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcoJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zMSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzMyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzMyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDo3OiAoICcsJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwOjk6ICcsJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJywnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzMyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxOjc6ICggJyknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE6OTogJyknCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI6NzogKCAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjo5OiAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc9Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMzo3OiAoICcjJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMzOjk6ICcjJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyMnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18zNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMzYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMzY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM0Ojc6ICggJ1snICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzQ6OTogJ1snCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnWycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zNygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zNzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzU6NzogKCAnXScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNTo5OiAnXScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCddJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18zNyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMzgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzM4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzM4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNjo3OiAoICcrPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNjo5OiAnKz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMzgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzM5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18zOSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18zOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzc6NzogKCAnLT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzc6OTogJy09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi09Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzM5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM4Ojc6ICggJyo9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM4Ojk6ICcqPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIqPSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozOTo3OiAoICcvPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozOTo5OiAnLz0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLz0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDA6NzogKCAnJT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDA6OTogJyU9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiU9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQxOjc6ICggJzwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDE6OTogJzwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnPCcpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDMiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDI6NzogKCAnPicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mjo5OiAnPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc+Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzo3OiAoICc+PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Mzo5OiAnPj0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPj0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQ6NzogKCAnfHwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDQ6OTogJ3x8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInx8Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX180NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNDc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ1Ojc6ICggJyYmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ1Ojk6ICcmJicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCImJiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX180NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzQ4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzQ4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Njo3OiAoICc9PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Njo5OiAnPT0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzQ5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX180OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX180OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDc6NzogKCAnIT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDc6OTogJyE9JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIiE9Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzQ5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ4Ojc6ICggJz09PScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0ODo5OiAnPT09JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj09PSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzUxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzUxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0OTo3OiAoICchPT0nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk6OTogJyE9PScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIhPT0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzUyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTA6NzogKCAnaW5zdGFuY2VvZicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1MDo5OiAnaW5zdGFuY2VvZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJpbnN0YW5jZW9mIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzUyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUxOjc6ICggJy0+JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUxOjk6ICctPicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCItPiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1Mjo3OiAoICcuLjwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTI6OTogJy4uPCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIuLjwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTM6NzogKCAnLi4nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTM6OTogJy4uJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIi4uIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU0Ojc6ICggJz0+JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU0Ojk6ICc9PicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI9PiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX181NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzU3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzU3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTo3OiAoICc8PicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NTo5OiAnPD4nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiPD4iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzU4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX181OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX181ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTY6NzogKCAnPzonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTY6OTogJz86JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIj86Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzU4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX181OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNTkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNTk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU3Ojc6ICggJysnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTc6OTogJysnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnKycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNTkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTg6NzogKCAnLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1ODo5OiAnLScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCctJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1OTo3OiAoICcqKicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1OTo5OiAnKionCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiKioiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzYyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjA6NzogKCAnLycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDo5OiAnLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCcvJyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182MiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjMiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzYzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzYzOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MTo3OiAoICclJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYxOjk6ICclJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyUnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzYzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYyOjc6ICggJyEnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjI6OTogJyEnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnIScpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjM6NzogKCAnYXMnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjM6OTogJ2FzJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImFzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0Ojc6ICggJysrJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0Ojk6ICcrKycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIrKyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNjciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzY3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzY3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NTo3OiAoICctLScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NTo5OiAnLS0nCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiLS0iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNjciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzY4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX182OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX182ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY6NzogKCAnOjonICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY6OTogJzo6JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIjo6Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzY4IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX182OSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNjkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNjk7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY3Ojc6ICggJz8uJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY3Ojk6ICc/LicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCI/LiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX182OSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzcwKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzcwOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2ODo3OiAoICd8JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY4Ojk6ICd8JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJ3wnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY5Ojc6ICggJzsnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Njk6OTogJzsnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgnOycpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzcyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzA6NzogKCAnaWYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzA6OTogJ2lmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImlmIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzcyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcxOjc6ICggJ2Vsc2UnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzE6OTogJ2Vsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZWxzZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mjo3OiAoICdzd2l0Y2gnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzI6OTogJ3N3aXRjaCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJzd2l0Y2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzM6NzogKCAnOicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mzo5OiAnOicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc6Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183NSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzYiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc2OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NDo3OiAoICdkZWZhdWx0JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc0Ojk6ICdkZWZhdWx0JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRlZmF1bHQiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzYiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzc3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX183NygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX183NzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzU6NzogKCAnY2FzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NTo5OiAnY2FzZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjYXNlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzc3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX183OCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fNzgoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fNzg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc2Ojc6ICggJ2ZvcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Njo5OiAnZm9yJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImZvciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX183OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fNzkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzc5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzc5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Nzo3OiAoICd3aGlsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Nzo5OiAnd2hpbGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgid2hpbGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fNzkiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgwIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg6NzogKCAnZG8nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg6OTogJ2RvJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRvIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184MSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODEoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc5Ojc6ICggJ3ZhcicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTo5OiAndmFyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInZhciIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184MSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzgyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzgyOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MDo3OiAoICd2YWwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODA6OTogJ3ZhbCcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ2YWwiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzgzIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184MygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184MzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODE6NzogKCAnZXh0ZW5kcycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MTo5OiAnZXh0ZW5kcycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbmRzIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzgzIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgyOjc6ICggJ3N0YXRpYycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Mjo5OiAnc3RhdGljJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YXRpYyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184NCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg1KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg1OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Mzo3OiAoICdleHRlbnNpb24nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODM6OTogJ2V4dGVuc2lvbicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleHRlbnNpb24iKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg2IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184NigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184NjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODQ6NzogKCAnc3VwZXInICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODQ6OTogJ3N1cGVyJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN1cGVyIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg2IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX184NyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fODcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fODc7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg1Ojc6ICggJ25ldycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NTo5OiAnbmV3JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goIm5ldyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX184NyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fODgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzg4KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzg4OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Njo3OiAoICdmYWxzZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Njo5OiAnZmFsc2UnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiZmFsc2UiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fODgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzg5IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX184OSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX184OTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODc6NzogKCAndHJ1ZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Nzo5OiAndHJ1ZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnVlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzg5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTAoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg4Ojc6ICggJ251bGwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODg6OTogJ251bGwnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibnVsbCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzkxKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzkxOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4OTo3OiAoICd0eXBlb2YnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODk6OTogJ3R5cGVvZicKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0eXBlb2YiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTEiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzkyIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185MigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185MjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTA6NzogKCAndGhyb3cnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTA6OTogJ3Rocm93JworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInRocm93Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzkyIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185MyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTMoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTM7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkxOjc6ICggJ3JldHVybicgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MTo5OiAncmV0dXJuJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInJldHVybiIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185MyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Mjo3OiAoICd0cnknICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTI6OTogJ3RyeScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJ0cnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk1IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185NSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185NTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTM6NzogKCAnZmluYWxseScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Mzo5OiAnZmluYWxseScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJmaW5hbGx5Iik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk1IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX185NiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fOTYoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fOTY7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk0Ojc6ICggJ3N5bmNocm9uaXplZCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NDo5OiAnc3luY2hyb25pemVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN5bmNocm9uaXplZCIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185NiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk3KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NTo3OiAoICdjYXRjaCcgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NTo5OiAnY2F0Y2gnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgiY2F0Y2giKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fOTciCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzk4IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX185OCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX185ODsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTY6NzogKCAnPycgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Njo5OiAnPycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCc/Jyk7IAorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX185OCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fOTkiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzk5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzk5OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Nzo3OiAoICcmJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk3Ojk6ICcmJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goJyYnKTsgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzk5IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDAiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDA7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk4Ojg6ICggJ2FueScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODoxMDogJ2FueScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJhbnkiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAwIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDEiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDE7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk5Ojg6ICggJ2NyZWF0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5OToxMDogJ2NyZWF0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJjcmVhdGFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTAxIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwMigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDI7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMDo4OiAoICdyZWFkYWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDA6MTA6ICdyZWFkYWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJyZWFkYWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDIiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwMyIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTAzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwMzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAxOjg6ICggJ3VwZGF0YWJsZScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDE6MTA6ICd1cGRhdGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgidXBkYXRhYmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwMyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA0IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA0OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDI6ODogKCAnZGVsZXRhYmxlJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjoxMDogJ2RlbGV0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJkZWxldGFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA0IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDUiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwNSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDU7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMzo4OiAoICdpbnZpc2libGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAzOjEwOiAnaW52aXNpYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImludmlzaWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDUiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwNiIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA2KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwNjsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA0Ojg6ICggJ2Rpc2FibGVkJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNDoxMDogJ2Rpc2FibGVkJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goImRpc2FibGVkIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwNiIKKworICAgIC8vICRBTlRMUiBzdGFydCAiVF9fMTA3IgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1UX18xMDcoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gVF9fMTA3OworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU6ODogKCAnbm9uZWRpdGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA1OjEwOiAnbm9uZWRpdGFibGUnCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaCgibm9uZWRpdGFibGUiKTsgCisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiVF9fMTA3IgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJUX18xMDgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVRfXzEwOCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBUX18xMDg7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNjo4OiAoICdzdGFydGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA2OjEwOiAnc3RhcnRhYmxlJworICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2goInN0YXJ0YWJsZSIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJUX18xMDgiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlRfXzEwOSIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtVF9fMTA5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFRfXzEwOTsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA3Ojg6ICggJ2V4ZWN1dGFibGUnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA3OjEwOiAnZXhlY3V0YWJsZScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCJleGVjdXRhYmxlIik7IAorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlRfXzEwOSIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9IRVgiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfSEVYKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSEVYOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODczOjEwOiAoICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4NzM6MTI6ICggJzB4JyB8ICcwWCcgKSAoICcwJyAuLiAnOScgfCAnYScgLi4gJ2YnIHwgJ0EnIC4uICdGJyB8ICdfJyApKyAoICcjJyAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODczOjEyOiAoICcweCcgfCAnMFgnICkKKyAgICAgICAgICAgIGludCBhbHQxPTI7CisgICAgICAgICAgICBpbnQgTEExXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExXzA9PScwJykgKSB7CisgICAgICAgICAgICAgICAgaW50IExBMV8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTFfMT09J3gnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMV8xPT0nWCcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQxPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMSwgMSwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3MzoxMzogJzB4JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoKCIweCIpOyAKKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODczOjE4OiAnMFgnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goIjBYIik7IAorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4NzM6MjQ6ICggJzAnIC4uICc5JyB8ICdhJyAuLiAnZicgfCAnQScgLi4gJ0YnIHwgJ18nICkrCisgICAgICAgICAgICBpbnQgY250Mj0wOworICAgICAgICAgICAgbG9vcDI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDI9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTJfMD49JzAnICYmIExBMl8wPD0nOScpfHwoTEEyXzA+PSdBJyAmJiBMQTJfMDw9J0YnKXx8TEEyXzA9PSdfJ3x8KExBMl8wPj0nYScgJiYgTEEyXzA8PSdmJykpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nMCcgJiYgaW5wdXQuTEEoMSk8PSc5Jyl8fChpbnB1dC5MQSgxKT49J0EnICYmIGlucHV0LkxBKDEpPD0nRicpfHxpbnB1dC5MQSgxKT09J18nfHwoaW5wdXQuTEEoMSk+PSdhJyAmJiBpbnB1dC5MQSgxKTw9J2YnKSApIHsKKyAgICAgICAgICAgIAkgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgCSAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MiA+PSAxICkgYnJlYWsgbG9vcDI7CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDIsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MisrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3Mzo1ODogKCAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkgKT8KKyAgICAgICAgICAgIGludCBhbHQ0PTI7CisgICAgICAgICAgICBpbnQgTEE0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE0XzA9PScjJykgKSB7CisgICAgICAgICAgICAgICAgYWx0ND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODczOjU5OiAnIycgKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knICkgfCAoICdsJyB8ICdMJyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnIycpOyAKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODczOjYzOiAoICggJ2InIHwgJ0InICkgKCAnaScgfCAnSScgKSB8ICggJ2wnIHwgJ0wnICkgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTNfMD09J0InfHxMQTNfMD09J2InKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBM18wPT0nTCd8fExBM18wPT0nbCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Mz0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3Mzo2NDogKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdCJ3x8aW5wdXQuTEEoMSk9PSdiJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nSSd8fGlucHV0LkxBKDEpPT0naScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3Mzo4NDogKCAnbCcgfCAnTCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nTCd8fGlucHV0LkxBKDEpPT0nbCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfSEVYIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0lOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9JTlQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9JTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4NzU6MTA6ICggJzAnIC4uICc5JyAoICcwJyAuLiAnOScgfCAnXycgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc1OjEyOiAnMCcgLi4gJzknICggJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hSYW5nZSgnMCcsJzknKTsgCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4NzU6MjE6ICggJzAnIC4uICc5JyB8ICdfJyApKgorICAgICAgICAgICAgbG9vcDU6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDU9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEE1XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTVfMD49JzAnICYmIExBNV8wPD0nOScpfHxMQTVfMD09J18nKSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0NT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHxpbnB1dC5MQSgxKT09J18nICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9JTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfREVDSU1BTCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9ERUNJTUFMKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfREVDSU1BTDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3NzoxNDogKCBSVUxFX0lOVCAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8gKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3NzoxNjogUlVMRV9JTlQgKCAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UICk/ICggKCAnYicgfCAnQicgKSAoICdpJyB8ICdJJyB8ICdkJyB8ICdEJyApIHwgKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc3OjI1OiAoICggJ2UnIHwgJ0UnICkgKCAnKycgfCAnLScgKT8gUlVMRV9JTlQgKT8KKyAgICAgICAgICAgIGludCBhbHQ3PTI7CisgICAgICAgICAgICBpbnQgTEE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE3XzA9PSdFJ3x8TEE3XzA9PSdlJykgKSB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc3OjI2OiAoICdlJyB8ICdFJyApICggJysnIHwgJy0nICk/IFJVTEVfSU5UCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpbnB1dC5MQSgxKT09J0UnfHxpbnB1dC5MQSgxKT09J2UnICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4Nzc6MzY6ICggJysnIHwgJy0nICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ2PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNl8wPT0nKyd8fExBNl8wPT0nLScpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0Nj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nKyd8fGlucHV0LkxBKDEpPT0nLScgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1SVUxFX0lOVCgpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3Nzo1ODogKCAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkgfCAoICdsJyB8ICdMJyB8ICdkJyB8ICdEJyB8ICdmJyB8ICdGJyApICk/CisgICAgICAgICAgICBpbnQgYWx0OD0zOworICAgICAgICAgICAgaW50IExBOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBOF8wPT0nQid8fExBOF8wPT0nYicpICkgeworICAgICAgICAgICAgICAgIGFsdDg9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE4XzA9PSdEJ3x8TEE4XzA9PSdGJ3x8TEE4XzA9PSdMJ3x8TEE4XzA9PSdkJ3x8TEE4XzA9PSdmJ3x8TEE4XzA9PSdsJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ4KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc3OjU5OiAoICdiJyB8ICdCJyApICggJ2knIHwgJ0knIHwgJ2QnIHwgJ0QnICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIGlucHV0LkxBKDEpPT0nQid8fGlucHV0LkxBKDEpPT0nYicgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBtc2U7fQorCisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdJJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdpJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3Nzo4NzogKCAnbCcgfCAnTCcgfCAnZCcgfCAnRCcgfCAnZicgfCAnRicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSdEJ3x8aW5wdXQuTEEoMSk9PSdGJ3x8aW5wdXQuTEEoMSk9PSdMJ3x8aW5wdXQuTEEoMSk9PSdkJ3x8aW5wdXQuTEEoMSk9PSdmJ3x8aW5wdXQuTEEoMSk9PSdsJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9ERUNJTUFMIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX0lEIgorICAgIHB1YmxpYyBmaW5hbCB2b2lkIG1SVUxFX0lEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfSUQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4Nzk6OTogKCAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc5OjExOiAoICdeJyApPyAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nICkgKCAnYScgLi4gJ3onIHwgJ0EnIC4uICdaJyB8ICckJyB8ICdfJyB8ICcwJyAuLiAnOScgKSoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg3OToxMTogKCAnXicgKT8KKyAgICAgICAgICAgIGludCBhbHQ5PTI7CisgICAgICAgICAgICBpbnQgTEE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE5XzA9PSdeJykgKSB7CisgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc5OjExOiAnXicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXicpOyAKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggaW5wdXQuTEEoMSk9PSckJ3x8KGlucHV0LkxBKDEpPj0nQScgJiYgaW5wdXQuTEEoMSk8PSdaJyl8fGlucHV0LkxBKDEpPT0nXyd8fChpbnB1dC5MQSgxKT49J2EnICYmIGlucHV0LkxBKDEpPD0neicpICkgeworICAgICAgICAgICAgICAgIGlucHV0LmNvbnN1bWUoKTsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbiBtc2UgPSBuZXcgTWlzbWF0Y2hlZFNldEV4Y2VwdGlvbihudWxsLGlucHV0KTsKKyAgICAgICAgICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbXNlO30KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODc5OjQ0OiAoICdhJyAuLiAneicgfCAnQScgLi4gJ1onIHwgJyQnIHwgJ18nIHwgJzAnIC4uICc5JyApKgorICAgICAgICAgICAgbG9vcDEwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQxMD0yOworICAgICAgICAgICAgICAgIGludCBMQTEwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMTBfMD09JyQnfHwoTEExMF8wPj0nMCcgJiYgTEExMF8wPD0nOScpfHwoTEExMF8wPj0nQScgJiYgTEExMF8wPD0nWicpfHxMQTEwXzA9PSdfJ3x8KExBMTBfMD49J2EnICYmIExBMTBfMDw9J3onKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDEwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIGlucHV0LkxBKDEpPT0nJCd8fChpbnB1dC5MQSgxKT49JzAnICYmIGlucHV0LkxBKDEpPD0nOScpfHwoaW5wdXQuTEEoMSk+PSdBJyAmJiBpbnB1dC5MQSgxKTw9J1onKXx8aW5wdXQuTEEoMSk9PSdfJ3x8KGlucHV0LkxBKDEpPj0nYScgJiYgaW5wdXQuTEEoMSk8PSd6JykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9JRCIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9TVFJJTkciCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfU1RSSU5HKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU1RSSU5HOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgxOjEzOiAoICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgxOjE1OiAoICdcIicgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcIicgKSApICkqICggJ1wiJyApPyB8ICdcXCcnICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSogKCAnXFwnJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODE6MTU6ICggJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/IHwgJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/ICkKKyAgICAgICAgICAgIGludCBhbHQxNT0yOworICAgICAgICAgICAgaW50IExBMTVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE1XzA9PSdcIicpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKExBMTVfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTU9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDE1LCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxNSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4MToxNjogJ1wiJyAoICdcXFxcJyAuIHwgfiAoICggJ1xcXFwnIHwgJ1wiJyApICkgKSogKCAnXCInICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wiJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODE6MjA6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXCInICkgKSApKgorICAgICAgICAgICAgICAgICAgICBsb29wMTE6CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQxMT0zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTExXzA9PSdcXCcpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTExXzA+PSdcdTAwMDAnICYmIExBMTFfMDw9JyEnKXx8KExBMTFfMD49JyMnICYmIExBMTFfMDw9J1snKXx8KExBMTFfMD49J10nICYmIExBMTFfMDw9J1x1RkZGRicpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMT0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTEpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgxOjIxOiAnXFxcXCcgLgorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBtYXRjaCgnXFwnKTsgCisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4MToyODogfiAoICggJ1xcXFwnIHwgJ1wiJyApICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCAoaW5wdXQuTEEoMSk+PSdcdTAwMDAnICYmIGlucHV0LkxBKDEpPD0nIScpfHwoaW5wdXQuTEEoMSk+PScjJyAmJiBpbnB1dC5MQSgxKTw9J1snKXx8KGlucHV0LkxBKDEpPj0nXScgJiYgaW5wdXQuTEEoMSk8PSdcdUZGRkYnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHRocm93IG1zZTt9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDExOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODE6NDQ6ICggJ1wiJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTI9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTJfMD09J1wiJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgxOjQ0OiAnXCInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdcIicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4MTo0OTogJ1xcJycgKCAnXFxcXCcgLiB8IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKSApKiAoICdcXCcnICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1wnJyk7IAorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODE6NTQ6ICggJ1xcXFwnIC4gfCB+ICggKCAnXFxcXCcgfCAnXFwnJyApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgbG9vcDEzOgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTM9MzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExM18wPT0nXFwnKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMz0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExM18wPj0nXHUwMDAwJyAmJiBMQTEzXzA8PScmJyl8fChMQTEzXzA+PScoJyAmJiBMQTEzXzA8PSdbJyl8fChMQTEzXzA+PSddJyAmJiBMQTEzXzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTM9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4MTo1NTogJ1xcXFwnIC4KKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbWF0Y2goJ1xcJyk7IAorICAgICAgICAgICAgICAgICAgICAJICAgIG1hdGNoQW55KCk7IAorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAJY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODE6NjI6IH4gKCAoICdcXFxcJyB8ICdcXCcnICkgKQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x1MDAwMCcgJiYgaW5wdXQuTEEoMSk8PScmJyl8fChpbnB1dC5MQSgxKT49JygnICYmIGlucHV0LkxBKDEpPD0nWycpfHwoaW5wdXQuTEEoMSk+PSddJyAmJiBpbnB1dC5MQSgxKTw9J1x1RkZGRicpICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIHJlY292ZXIobXNlKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4MTo3OTogKCAnXFwnJyApPworICAgICAgICAgICAgICAgICAgICBpbnQgYWx0MTQ9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBMTRfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBMTRfMD09J1wnJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxND0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgxOjc5OiAnXFwnJworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCgnXCcnKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGUudHlwZSA9IF90eXBlOworICAgICAgICAgICAgc3RhdGUuY2hhbm5lbCA9IF9jaGFubmVsOworICAgICAgICB9CisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgIlJVTEVfU1RSSU5HIgorCisgICAgLy8gJEFOVExSIHN0YXJ0ICJSVUxFX01MX0NPTU1FTlQiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfTUxfQ09NTUVOVCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgX3R5cGUgPSBSVUxFX01MX0NPTU1FTlQ7CisgICAgICAgICAgICBpbnQgX2NoYW5uZWwgPSBERUZBVUxUX1RPS0VOX0NIQU5ORUw7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODM6MTc6ICggJy8qJyAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSogJyovJyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODM6MTk6ICcvKicgKCBvcHRpb25zIHtncmVlZHk9ZmFsc2U7IH0gOiAuICkqICcqLycKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvKiIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgzOjI0OiAoIG9wdGlvbnMge2dyZWVkeT1mYWxzZTsgfSA6IC4gKSoKKyAgICAgICAgICAgIGxvb3AxNjoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTY9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzA9PScqJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTE2XzEgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTE2XzE9PScvJykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQxNj0yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMTZfMT49J1x1MDAwMCcgJiYgTEExNl8xPD0nLicpfHwoTEExNl8xPj0nMCcgJiYgTEExNl8xPD0nXHVGRkZGJykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0MTY9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEExNl8wPj0nXHUwMDAwJyAmJiBMQTE2XzA8PScpJyl8fChMQTE2XzA+PScrJyAmJiBMQTE2XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODgzOjUyOiAuCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgbWF0Y2hBbnkoKTsgCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIG1hdGNoKCIqLyIpOyAKKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX01MX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfU0xfQ09NTUVOVCIKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBtUlVMRV9TTF9DT01NRU5UKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfU0xfQ09NTUVOVDsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4NToxNzogKCAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg1OjE5OiAnLy8nICh+ICggKCAnXFxuJyB8ICdcXHInICkgKSApKiAoICggJ1xccicgKT8gJ1xcbicgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG1hdGNoKCIvLyIpOyAKKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg1OjI0OiAofiAoICggJ1xcbicgfCAnXFxyJyApICkgKSoKKyAgICAgICAgICAgIGxvb3AxNzoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MTc9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEExN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEExN18wPj0nXHUwMDAwJyAmJiBMQTE3XzA8PSdcdCcpfHwoTEExN18wPj0nXHUwMDBCJyAmJiBMQTE3XzA8PSdcZicpfHwoTEExN18wPj0nXHUwMDBFJyAmJiBMQTE3XzA8PSdcdUZGRkYnKSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE3PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg1OjI0OiB+ICggKCAnXFxuJyB8ICdcXHInICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggKGlucHV0LkxBKDEpPj0nXHUwMDAwJyAmJiBpbnB1dC5MQSgxKTw9J1x0Jyl8fChpbnB1dC5MQSgxKT49J1x1MDAwQicgJiYgaW5wdXQuTEEoMSk8PSdcZicpfHwoaW5wdXQuTEEoMSk+PSdcdTAwMEUnICYmIGlucHV0LkxBKDEpPD0nXHVGRkZGJykgKSB7CisgICAgICAgICAgICAJICAgICAgICBpbnB1dC5jb25zdW1lKCk7CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBlbHNlIHsKKyAgICAgICAgICAgIAkgICAgICAgIE1pc21hdGNoZWRTZXRFeGNlcHRpb24gbXNlID0gbmV3IE1pc21hdGNoZWRTZXRFeGNlcHRpb24obnVsbCxpbnB1dCk7CisgICAgICAgICAgICAJICAgICAgICByZWNvdmVyKG1zZSk7CisgICAgICAgICAgICAJICAgICAgICB0aHJvdyBtc2U7fQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMTc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4NTo0MDogKCAoICdcXHInICk/ICdcXG4nICk/CisgICAgICAgICAgICBpbnQgYWx0MTk9MjsKKyAgICAgICAgICAgIGludCBMQTE5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExOV8wPT0nXG4nfHxMQTE5XzA9PSdccicpICkgeworICAgICAgICAgICAgICAgIGFsdDE5PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg1OjQxOiAoICdcXHInICk/ICdcXG4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg1OjQxOiAoICdcXHInICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQxOD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEExOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEExOF8wPT0nXHInKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDE4PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc4ODU6NDE6ICdcXHInCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoKCdccicpOyAKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2goJ1xuJyk7IAorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXRlLnR5cGUgPSBfdHlwZTsKKyAgICAgICAgICAgIHN0YXRlLmNoYW5uZWwgPSBfY2hhbm5lbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJSVUxFX1NMX0NPTU1FTlQiCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgIlJVTEVfV1MiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfV1MoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW50IF90eXBlID0gUlVMRV9XUzsKKyAgICAgICAgICAgIGludCBfY2hhbm5lbCA9IERFRkFVTFRfVE9LRU5fQ0hBTk5FTDsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4Nzo5OiAoICggJyAnIHwgJ1xcdCcgfCAnXFxyJyB8ICdcXG4nICkrICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4NzoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzg4NzoxMTogKCAnICcgfCAnXFx0JyB8ICdcXHInIHwgJ1xcbicgKSsKKyAgICAgICAgICAgIGludCBjbnQyMD0wOworICAgICAgICAgICAgbG9vcDIwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgICAgIGludCBMQTIwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTIwXzA+PSdcdCcgJiYgTEEyMF8wPD0nXG4nKXx8TEEyMF8wPT0nXHInfHxMQTIwXzA9PScgJykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDIwPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIwKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIChpbnB1dC5MQSgxKT49J1x0JyAmJiBpbnB1dC5MQSgxKTw9J1xuJyl8fGlucHV0LkxBKDEpPT0nXHInfHxpbnB1dC5MQSgxKT09JyAnICkgeworICAgICAgICAgICAgCSAgICAgICAgaW5wdXQuY29uc3VtZSgpOworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgZWxzZSB7CisgICAgICAgICAgICAJICAgICAgICBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uIG1zZSA9IG5ldyBNaXNtYXRjaGVkU2V0RXhjZXB0aW9uKG51bGwsaW5wdXQpOworICAgICAgICAgICAgCSAgICAgICAgcmVjb3Zlcihtc2UpOworICAgICAgICAgICAgCSAgICAgICAgdGhyb3cgbXNlO30KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyMCA+PSAxICkgYnJlYWsgbG9vcDIwOworICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyMCwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjbnQyMCsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9XUyIKKworICAgIC8vICRBTlRMUiBzdGFydCAiUlVMRV9BTllfT1RIRVIiCisgICAgcHVibGljIGZpbmFsIHZvaWQgbVJVTEVfQU5ZX09USEVSKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBfdHlwZSA9IFJVTEVfQU5ZX09USEVSOworICAgICAgICAgICAgaW50IF9jaGFubmVsID0gREVGQVVMVF9UT0tFTl9DSEFOTkVMOworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg5OjE2OiAoIC4gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3ODg5OjE4OiAuCisgICAgICAgICAgICB7CisgICAgICAgICAgICBtYXRjaEFueSgpOyAKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0ZS50eXBlID0gX3R5cGU7CisgICAgICAgICAgICBzdGF0ZS5jaGFubmVsID0gX2NoYW5uZWw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiUlVMRV9BTllfT1RIRVIiCisKKyAgICBwdWJsaWMgdm9pZCBtVG9rZW5zKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjg6ICggVF9fMTMgfCBUX18xNCB8IFRfXzE1IHwgVF9fMTYgfCBUX18xNyB8IFRfXzE4IHwgVF9fMTkgfCBUX18yMCB8IFRfXzIxIHwgVF9fMjIgfCBUX18yMyB8IFRfXzI0IHwgVF9fMjUgfCBUX18yNiB8IFRfXzI3IHwgVF9fMjggfCBUX18yOSB8IFRfXzMwIHwgVF9fMzEgfCBUX18zMiB8IFRfXzMzIHwgVF9fMzQgfCBUX18zNSB8IFRfXzM2IHwgVF9fMzcgfCBUX18zOCB8IFRfXzM5IHwgVF9fNDAgfCBUX180MSB8IFRfXzQyIHwgVF9fNDMgfCBUX180NCB8IFRfXzQ1IHwgVF9fNDYgfCBUX180NyB8IFRfXzQ4IHwgVF9fNDkgfCBUX181MCB8IFRfXzUxIHwgVF9fNTIgfCBUX181MyB8IFRfXzU0IHwgVF9fNTUgfCBUX181NiB8IFRfXzU3IHwgVF9fNTggfCBUX181OSB8IFRfXzYwIHwgVF9fNjEgfCBUX182MiB8IFRfXzYzIHwgVF9fNjQgfCBUX182NSB8IFRfXzY2IHwgVF9fNjcgfCBUX182OCB8IFRfXzY5IHwgVF9fNzAgfCBUX183MSB8IFRfXzcyIHwgVF9fNzMgfCBUX183NCB8IFRfXzc1IHwgVF9fNzYgfCBUX183NyB8IFRfXzc4IHwgVF9fNzkgfCBUX184MCB8IFRfXzgxIHwgVF9fODIgfCBUX184MyB8IFRfXzg0IHwgVF9fODUgfCBUX184NiB8IFRfXzg3IHwgVF9fODggfCBUX184OSB8IFRfXzkwIHwgVF9fOTEgfCBUX185MiB8IFRfXzkzIHwgVF9fOTQgfCBUX185NSB8IFRfXzk2IHwgVF9fOTcgfCBUX185OCB8IFRfXzk5IHwgVF9fMTAwIHwgVF9fMTAxIHwgVF9fMTAyIHwgVF9fMTAzIHwgVF9fMTA0IHwgVF9fMTA1IHwgVF9fMTA2IHwgVF9fMTA3IHwgVF9fMTA4IHwgVF9fMTA5IHwgUlVMRV9IRVggfCBSVUxFX0lOVCB8IFJVTEVfREVDSU1BTCB8IFJVTEVfSUQgfCBSVUxFX1NUUklORyB8IFJVTEVfTUxfQ09NTUVOVCB8IFJVTEVfU0xfQ09NTUVOVCB8IFJVTEVfV1MgfCBSVUxFX0FOWV9PVEhFUiApCisgICAgICAgIGludCBhbHQyMT0xMDY7CisgICAgICAgIGFsdDIxID0gZGZhMjEucHJlZGljdChpbnB1dCk7CisgICAgICAgIHN3aXRjaCAoYWx0MjEpIHsKKyAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjEwOiBUX18xMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNjogVF9fMTQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE0KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6MjI6IFRfXzE1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjI4OiBUX18xNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNDogVF9fMTcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzE3KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NDA6IFRfXzE4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjQ2OiBUX18xOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTkoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MjogVF9fMjAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTg6IFRfXzIxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2NDogVF9fMjIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzIyKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjcwOiBUX18yMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjMoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEyIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NzY6IFRfXzI0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo4MjogVF9fMjUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzI1KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjg4OiBUX18yNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMjYoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6OTQ6IFRfXzI3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMDA6IFRfXzI4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMDY6IFRfXzI5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18yOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMTI6IFRfXzMwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMTg6IFRfXzMxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMjQ6IFRfXzMyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMzA6IFRfXzMzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zMygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxMzY6IFRfXzM0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNDI6IFRfXzM1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNDg6IFRfXzM2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNTQ6IFRfXzM3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zNygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNjA6IFRfXzM4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNjY6IFRfXzM5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18zOSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNzI6IFRfXzQwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxNzg6IFRfXzQxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxODQ6IFRfXzQyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxOTA6IFRfXzQzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToxOTY6IFRfXzQ0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMDI6IFRfXzQ1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMDg6IFRfXzQ2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMTQ6IFRfXzQ3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMjA6IFRfXzQ4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMjY6IFRfXzQ5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX180OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMzI6IFRfXzUwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyMzg6IFRfXzUxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNDQ6IFRfXzUyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNTA6IFRfXzUzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNTY6IFRfXzU0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNjI6IFRfXzU1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNjg6IFRfXzU2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyNzQ6IFRfXzU3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyODA6IFRfXzU4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyODY6IFRfXzU5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX181OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyOTI6IFRfXzYwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MToyOTg6IFRfXzYxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMDQ6IFRfXzYyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMTA6IFRfXzYzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMTY6IFRfXzY0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMjI6IFRfXzY1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMjg6IFRfXzY2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozMzQ6IFRfXzY3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNDA6IFRfXzY4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNDY6IFRfXzY5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX182OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNTI6IFRfXzcwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNTg6IFRfXzcxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNjQ6IFRfXzcyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNzA6IFRfXzczCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozNzY6IFRfXzc0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozODI6IFRfXzc1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozODg6IFRfXzc2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTozOTQ6IFRfXzc3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MDA6IFRfXzc4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MDY6IFRfXzc5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX183OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MTI6IFRfXzgwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MTg6IFRfXzgxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MjQ6IFRfXzgyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MzA6IFRfXzgzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0MzY6IFRfXzg0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NDI6IFRfXzg1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NDg6IFRfXzg2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NTQ6IFRfXzg3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NjA6IFRfXzg4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NjY6IFRfXzg5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX184OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0NzI6IFRfXzkwCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNzkgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0Nzg6IFRfXzkxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0ODQ6IFRfXzkyCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0OTA6IFRfXzkzCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185MygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODIgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo0OTY6IFRfXzk0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MDI6IFRfXzk1CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MDg6IFRfXzk2CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MTQ6IFRfXzk3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185NygpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODYgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MjA6IFRfXzk4CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185OCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MjY6IFRfXzk5CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX185OSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgODggOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1MzI6IFRfXzEwMAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAwKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA4OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjUzOTogVF9fMTAxCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDEoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkwIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTQ2OiBUX18xMDIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwMigpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1NTM6IFRfXzEwMworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTAzKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5MiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjU2MDogVF9fMTA0CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDkzIDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTY3OiBUX18xMDUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwNSgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1NzQ6IFRfXzEwNgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA2KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5NSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjU4MTogVF9fMTA3CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1UX18xMDcoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDk2IDoKKyAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE6NTg4OiBUX18xMDgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVRfXzEwOCgpOyAKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTcgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo1OTU6IFRfXzEwOQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtVF9fMTA5KCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OCA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjYwMjogUlVMRV9IRVgKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSEVYKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA5OSA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjYxMTogUlVMRV9JTlQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDAgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2MjA6IFJVTEVfREVDSU1BTAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9ERUNJTUFMKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDEgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2MzM6IFJVTEVfSUQKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfSUQoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwMiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjY0MTogUlVMRV9TVFJJTkcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfU1RSSU5HKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDMgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2NTM6IFJVTEVfTUxfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9NTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDQgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2Njk6IFJVTEVfU0xfQ09NTUVOVAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtUlVMRV9TTF9DT01NRU5UKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxMDUgOgorICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTo2ODU6IFJVTEVfV1MKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfV1MoKTsgCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDEwNiA6CisgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOjY5MzogUlVMRV9BTllfT1RIRVIKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbVJVTEVfQU5ZX09USEVSKCk7IAorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIH0KKworICAgIH0KKworCisgICAgcHJvdGVjdGVkIERGQTIxIGRmYTIxID0gbmV3IERGQTIxKHRoaXMpOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfZW90UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDYyXDJcdWZmZmZcN1w2MlwxXDExMVwxXDExNFw0XHVmZmZmXDFcMTIzXDNcdWZmZmZcMSIrCisgICAgICAgICJcMTMxXDFcMTM1XDFcMTQxXDFcMTQzXDFcMTQ1XDFcMTQ3XDFcMTUxXDFcMTUzXDFcMTU1XDFcMTYwXDFcMTYyIisKKyAgICAgICAgIlwxXHVmZmZmXDdcNjJcMlx1MDA4N1wxXDU3XDVcdWZmZmZcMlw2MlwzXHVmZmZmXDFcNjJcMVx1MDA4ZVwxXDYyIisKKyAgICAgICAgIlwxXHUwMDkxXDEwXDYyXDFcdTAwOWVcMlw2MlwxXHUwMGExXDNcNjJcMVx1MDBhNlwxMFx1ZmZmZlwxXHUwMGE4IisKKyAgICAgICAgIlwzMlx1ZmZmZlwxXHUwMGFhXDdcdWZmZmZcMjFcNjJcMVx1ZmZmZlwxXHUwMDg3XDRcdWZmZmZcM1w2MlwxXHVmZmZmIisKKyAgICAgICAgIlwyXDYyXDFcdWZmZmZcMTFcNjJcMVx1MDBjZVwyXDYyXDFcdWZmZmZcMVw2MlwxXHUwMGQyXDFcdWZmZmZcMSIrCisgICAgICAgICJcdTAwZDNcMlw2Mlw2XHVmZmZmXDdcNjJcMVx1MDBkZVwzXDYyXDFcdTAwZTJcMVx1MDBlM1wxXHUwMGU0XDMiKworICAgICAgICAiXDYyXDFcdTAwZThcMTBcNjJcMVx1MDBmMVw0XDYyXDFcdTAwZjZcMlw2MlwxXHUwMGY5XDFcdWZmZmZcM1w2MiIrCisgICAgICAgICJcMlx1ZmZmZlw3XDYyXDFcdTAxMDRcMlw2MlwxXHVmZmZmXDNcNjJcM1x1ZmZmZlwxXHUwMTBhXDFcNjJcMVx1MDEwYyIrCisgICAgICAgICJcMVx1ZmZmZlwxMFw2MlwxXHVmZmZmXDRcNjJcMVx1ZmZmZlwyXDYyXDFcdWZmZmZcMTBcNjJcMVx1MDEyNFwxIisKKyAgICAgICAgIlw2MlwxXHVmZmZmXDFcdTAxMjZcMVw2MlwxXHUwMTI4XDFcNjJcMVx1MDEyYVwxXHVmZmZmXDFcNjJcMVx1ZmZmZiIrCisgICAgICAgICJcMVw2MlwxXHUwMTJkXDNcNjJcMVx1MDEzMVwzXDYyXDFcdTAxMzVcMVw2MlwxXHUwMTM3XDEwXDYyXDFcdTAxNDAiKworICAgICAgICAiXDFcdTAxNDFcMVw2MlwxXHVmZmZmXDFcNjJcMVx1ZmZmZlwxXDYyXDFcdWZmZmZcMVw2MlwxXHVmZmZmXDFcNjIiKworICAgICAgICAiXDFcdTAxNDdcMVx1ZmZmZlwxXHUwMTQ4XDFcdTAxNDlcMVw2MlwxXHVmZmZmXDNcNjJcMVx1ZmZmZlwxXDYyIisKKyAgICAgICAgIlwxXHVmZmZmXDFcdTAxNGZcMlw2MlwxXHUwMTUyXDRcNjJcMlx1ZmZmZlwzXDYyXDFcdTAxNWFcMVw2MlwzXHVmZmZmIisKKyAgICAgICAgIlwxXHUwMTVjXDNcNjJcMVx1MDE2MFwxXHVmZmZmXDJcNjJcMVx1ZmZmZlwxXDYyXDFcdTAxNjRcMVx1MDE2NiIrCisgICAgICAgICJcNFw2MlwxXHVmZmZmXDFcNjJcMVx1ZmZmZlwxXDYyXDFcdTAxNmRcMVx1MDE2ZVwxXHVmZmZmXDFcdTAxNmYiKworICAgICAgICAiXDFcNjJcMVx1MDE3MVwxXHVmZmZmXDFcdTAxNzJcMVx1ZmZmZlwxXHUwMTczXDFcdTAxNzRcMVw2MlwxXHUwMTc2IisKKyAgICAgICAgIlwxXDYyXDFcdTAxNzhcM1x1ZmZmZlwxXHUwMTc5XDRcdWZmZmZcMVw2MlwxXHVmZmZmXDFcNjJcMlx1ZmZmZiIrCisgICAgICAgICJcMVw2MlwxXHUwMTdkXDFcdTAxN2VcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9lb2ZTID0KKyAgICAgICAgIlx1MDE3Zlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9taW5TID0KKyAgICAgICAgIlwxXDBcMVwxNDFcMlx1ZmZmZlwxXDE0NlwxXDE0NVwxXDE1NFwyXDE0NVwxXDE1NFwxXDE2MFwxXDU2XDFcNTIiKworICAgICAgICAiXDRcdWZmZmZcMVw3NVwzXHVmZmZmXDFcNTNcMVw1NVwxXDUyXDFcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMSIrCisgICAgICAgICJcNzVcMVw1NlwxXDcyXDFcdWZmZmZcMVwxNjRcMlwxNDFcMVwxNTBcMVwxNDFcMVwxNDVcMVwxNTBcMlw2MFwxIisKKyAgICAgICAgIlw0NFw1XHVmZmZmXDFcMTQzXDFcMTU3XDNcdWZmZmZcMVwxNjBcMVw0NFwxXDE2M1wxXDQ0XDFcMTU0XDFcMTQxIisKKyAgICAgICAgIlwxXDE2NFwxXDE2M1wxXDE0NVwxXDE0MVwxXDE1N1wxXDE0NlwxXDQ0XDFcMTYzXDFcMTU0XDFcNDRcMVwxNzEiKworICAgICAgICAiXDFcMTQ1XDFcMTQ0XDFcNzRcMTBcdWZmZmZcMVw3NVwzMlx1ZmZmZlwxXDc1XDdcdWZmZmZcMVwxNTFcMVwxNDEiKworICAgICAgICAiXDFcMTYwXDFcMTU2XDFcMTYzXDFcMTQ1XDFcMTYyXDFcMTU0XDFcMTU2XDFcMTUxXDFcMTU0XDFcMTY3XDFcMTU0IisKKyAgICAgICAgIlwxXDE1NlwxXDE2NVwxXDE2MFwxXDE2MlwxXHVmZmZmXDFcNjBcNFx1ZmZmZlwxXDE1M1wxXDE0M1wxXDE1NyIrCisgICAgICAgICJcMVx1ZmZmZlwxXDE2NFwxXDE1MVwxXHVmZmZmXDJcMTQ1XDFcMTY1XDFcMTQ0XDFcMTUxXDJcMTQ1XDFcMTQzIisKKyAgICAgICAgIlwxXDE1NlwxXDQ0XDFcMTQxXDFcMTQ1XDFcdWZmZmZcMVwxNDFcMVw0NFwxXHVmZmZmXDFcNDRcMVwxNjJcMSIrCisgICAgICAgICJcMTQxXDZcdWZmZmZcMVwxNjRcMVwxNjJcMVwxNDVcMVwxNDNcMVwxNDVcMVwxNDNcMVwxNDFcMVw0NFwxXDE2MyIrCisgICAgICAgICJcMVwxNDFcMVwxNTRcM1w0NFwxXDE1NFwyXDE0NVwxXDQ0XDFcMTQ1XDFcMTU3XDFcMTQxXDJcMTQ1XDFcMTYyIisKKyAgICAgICAgIlwxXDE0MVwxXDE2M1wxXDQ0XDJcMTYyXDFcMTQxXDFcMTY0XDFcNDRcMVwxNTZcMVwxNjVcMVw0NFwxXHVmZmZmIisKKyAgICAgICAgIlwxXDE2NVwxXDE2NFwxXDE0MlwyXHVmZmZmXDJcMTY0XDFcMTQzXDFcMTUxXDFcMTY0XDFcMTYyXDFcMTUwXDEiKworICAgICAgICAiXDQ0XDFcMTUwXDFcMTY0XDFcdWZmZmZcMVwxNDVcMVwxNTRcMVwxNDVcM1x1ZmZmZlwxXDQ0XDFcMTQ0XDFcNDQiKworICAgICAgICAiXDFcdWZmZmZcMVwxNTdcMVwxNjdcMVwxNDdcMVwxNjNcMVwxNjJcMVwxNjRcMVwxNTZcMVwxNTFcMVx1ZmZmZiIrCisgICAgICAgICJcMVwxNDVcMVwxNTZcMVwxNDJcMVwxNzFcMVx1ZmZmZlwxXDE0NFwxXDE2NFwxXHVmZmZmXDFcMTU0XDFcMTQxIisKKyAgICAgICAgIlwxXDE1NFwyXDE0MVwxXDE1MFwxXDE0M1wxXDE0MVwxXDQ0XDFcMTYyXDFcdWZmZmZcMVw0NFwxXDE0MVwxXDQ0IisKKyAgICAgICAgIlwxXDE1NFwxXDQ0XDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDE0NlwxXDQ0XDFcMTQ1XDFcMTYzXDFcMTY0XDEiKworICAgICAgICAiXDQ0XDFcMTQzXDFcMTQyXDFcMTU2XDFcNDRcMVwxNTRcMVw0NFwxXDE2M1wxXDE1MVwxXDE0MVwxXDE2NFwxIisKKyAgICAgICAgIlwxNDJcMVwxNDVcMVwxNjNcMVwxNDJcMlw0NFwxXDE0MlwxXHVmZmZmXDFcMTU3XDFcdWZmZmZcMVwxNDJcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNzFcMVx1ZmZmZlwxXDE2NFwxXDQ0XDFcdWZmZmZcMlw0NFwxXDE3MVwxXHVmZmZmXDFcMTQ1IisKKyAgICAgICAgIlwxXDE1NFwxXDE0M1wxXHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVw0NFwxXDE1N1wxXDE0MlwxXDQ0XDFcMTU0XDEiKworICAgICAgICAiXDE0NFwxXDE1M1wxXDE1NFwyXHVmZmZmXDFcMTU0XDFcMTU2XDFcMTU0XDFcNDRcMVwxNDFcM1x1ZmZmZlwxIisKKyAgICAgICAgIlw0NFwxXDE1N1wyXDE0NVwxXDQ0XDFcdWZmZmZcMVwxNTZcMVwxNTRcMVx1ZmZmZlwxXDE0NVwyXDQ0XDJcMTQ1IisKKyAgICAgICAgIlwxXDE1MVwxXDE0NVwxXHVmZmZmXDFcMTQyXDFcdWZmZmZcMVwxNDZcMlw0NFwxXHVmZmZmXDFcNDRcMVwxNDUiKworICAgICAgICAiXDFcNDRcMVx1ZmZmZlwxXDQ0XDFcdWZmZmZcMlw0NFwxXDE3MlwxXDQ0XDFcMTU0XDFcNDRcM1x1ZmZmZlwxIisKKyAgICAgICAgIlw0NFw0XHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNDVcMlx1ZmZmZlwxXDE0NFwyXDQ0XDJcdWZmZmYiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgREZBMjFfbWF4UyA9CisgICAgICAgICJcMVx1ZmZmZlwxXDE2MlwyXHVmZmZmXDFcMTYzXDFcMTU3XDFcMTcwXDFcMTQ1XDFcMTY0XDJcMTYzXDFcNTYiKworICAgICAgICAiXDFcNzVcNFx1ZmZmZlwxXDc2XDNcdWZmZmZcMVw3NVwxXDc2XDJcNzVcMVw3NlwxXDc1XDFcMTc0XDFcNDZcMSIrCisgICAgICAgICJcNzVcMlw3MlwxXHVmZmZmXDFcMTcxXDFcMTYyXDFcMTU3XDFcMTUwXDFcMTQxXDFcMTY1XDFcMTcxXDFcMTcwIisKKyAgICAgICAgIlwxXDE1NFwxXDE3Mlw1XHVmZmZmXDFcMTQzXDFcMTU3XDNcdWZmZmZcMVwxNjBcMVwxNzJcMVwxNjZcMVwxNzIiKworICAgICAgICAiXDFcMTU0XDJcMTY0XDFcMTYzXDFcMTY0XDFcMTQxXDFcMTU3XDFcMTU0XDFcMTcyXDFcMTYzXDFcMTU0XDFcMTcyIisKKyAgICAgICAgIlwxXDE3MVwxXDE0NVwxXDE0NFwxXDc0XDEwXHVmZmZmXDFcNzVcMzJcdWZmZmZcMVw3NVw3XHVmZmZmXDFcMTUxIisKKyAgICAgICAgIlwxXDE0MVwxXDE2MFwxXDE1NlwxXDE2NFwxXDE0NVwxXDE2MlwxXDE1NFwxXDE1NlwxXDE1MVwxXDE2MlwxXDE2NyIrCisgICAgICAgICJcMVwxNTRcMVwxNTZcMVwxNzFcMVwxNjBcMVwxNjJcMVx1ZmZmZlwxXDE1NFw0XHVmZmZmXDFcMTUzXDFcMTYwIisKKyAgICAgICAgIlwxXDE1N1wxXHVmZmZmXDFcMTY0XDFcMTUxXDFcdWZmZmZcMlwxNDVcMVwxNjVcMVwxNDRcMVwxNTFcMlwxNDUiKworICAgICAgICAiXDFcMTQzXDFcMTU2XDFcMTcyXDFcMTQxXDFcMTQ1XDFcdWZmZmZcMVwxNDFcMVwxNzJcMVx1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVwxNjJcMVwxNDFcNlx1ZmZmZlwyXDE2NFwxXDE0NVwxXDE0M1wxXDE0NVwxXDE0M1wxXDE0MVwxXDE3MlwxIisKKyAgICAgICAgIlwxNjNcMVwxNDFcMVwxNTRcM1wxNzJcMVwxNTRcMlwxNDVcMVwxNzJcMVwxNDVcMVwxNTdcMVwxNDFcMlwxNDUiKworICAgICAgICAiXDFcMTYyXDFcMTQxXDFcMTYzXDFcMTcyXDJcMTYyXDFcMTQxXDFcMTY0XDFcMTcyXDFcMTU2XDFcMTY1XDFcMTcyIisKKyAgICAgICAgIlwxXHVmZmZmXDFcMTY1XDFcMTY0XDFcMTQyXDJcdWZmZmZcMlwxNjRcMVwxNDNcMVwxNTFcMVwxNjRcMVwxNjIiKworICAgICAgICAiXDFcMTUwXDFcMTcyXDFcMTUwXDFcMTY0XDFcdWZmZmZcMVwxNDVcMVwxNTRcMVwxNDVcM1x1ZmZmZlwxXDE3MiIrCisgICAgICAgICJcMVwxNDRcMVwxNzJcMVx1ZmZmZlwxXDE1N1wxXDE2N1wxXDE0N1wxXDE2M1wxXDE2MlwxXDE2NFwxXDE1NlwxIisKKyAgICAgICAgIlwxNTFcMVx1ZmZmZlwxXDE0NVwxXDE1NlwxXDE0MlwxXDE3MVwxXHVmZmZmXDFcMTYzXDFcMTY0XDFcdWZmZmYiKworICAgICAgICAiXDFcMTU0XDFcMTQxXDFcMTU0XDJcMTQxXDFcMTUwXDFcMTQzXDFcMTQxXDFcMTcyXDFcMTYyXDFcdWZmZmZcMSIrCisgICAgICAgICJcMTcyXDFcMTQxXDFcMTcyXDFcMTU0XDFcMTcyXDFcdWZmZmZcMVwxNTFcMVx1ZmZmZlwxXDE0NlwxXDE3MlwxIisKKyAgICAgICAgIlwxNDVcMVwxNjNcMVwxNjRcMVwxNzJcMVwxNDNcMVwxNDJcMVwxNTZcMVwxNzJcMVwxNTRcMVwxNzJcMVwxNjMiKworICAgICAgICAiXDFcMTUxXDFcMTQxXDFcMTY0XDFcMTQyXDFcMTQ1XDFcMTYzXDFcMTQyXDJcMTcyXDFcMTQyXDFcdWZmZmZcMSIrCisgICAgICAgICJcMTU3XDFcdWZmZmZcMVwxNDJcMVx1ZmZmZlwxXDE3MVwxXHVmZmZmXDFcMTY0XDFcMTcyXDFcdWZmZmZcMlwxNzIiKworICAgICAgICAiXDFcMTcxXDFcdWZmZmZcMVwxNDVcMVwxNTRcMVwxNDNcMVx1ZmZmZlwxXDE0NVwxXHVmZmZmXDFcMTcyXDFcMTU3IisKKyAgICAgICAgIlwxXDE0MlwxXDE3MlwxXDE1NFwxXDE0NFwxXDE1M1wxXDE1NFwyXHVmZmZmXDFcMTU0XDFcMTU2XDFcMTU0XDEiKworICAgICAgICAiXDE3MlwxXDE0MVwzXHVmZmZmXDFcMTcyXDFcMTU3XDJcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNTZcMVwxNTRcMSIrCisgICAgICAgICJcdWZmZmZcMVwxNDVcMlwxNzJcMlwxNDVcMVwxNTFcMVwxNDVcMVx1ZmZmZlwxXDE0MlwxXHVmZmZmXDFcMTQ2IisKKyAgICAgICAgIlwyXDE3MlwxXHVmZmZmXDFcMTcyXDFcMTQ1XDFcMTcyXDFcdWZmZmZcMVwxNzJcMVx1ZmZmZlw0XDE3MlwxXDE1NCIrCisgICAgICAgICJcMVwxNzJcM1x1ZmZmZlwxXDE3Mlw0XHVmZmZmXDFcMTQ1XDFcdWZmZmZcMVwxNDVcMlx1ZmZmZlwxXDE0NFwyIisKKyAgICAgICAgIlwxNzJcMlx1ZmZmZiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBERkEyMV9hY2NlcHRTID0KKyAgICAgICAgIlwyXHVmZmZmXDFcMlwxXDNcMTFcdWZmZmZcMVwyMlwxXDIzXDFcMjRcMVwyNVwxXHVmZmZmXDFcMjdcMVwzMCIrCisgICAgICAgICJcMVwzMVwxM1x1ZmZmZlwxXDczXDEyXHVmZmZmXDFcMTQ1XDJcMTQ2XDFcMTUxXDFcMTUyXDJcdWZmZmZcMVwxNDUiKworICAgICAgICAiXDFcMlwxXDNcMjRcdWZmZmZcMVwyMFwxXDM0XDFcNjFcMVwyMVwxXDIyXDFcMjNcMVwyNFwxXDI1XDFcdWZmZmYiKworICAgICAgICAiXDFcNTRcMVwyNlwxXDI3XDFcMzBcMVwzMVwxXDMyXDFcNjZcMVw1N1wxXDMzXDFcNTFcMVw2N1wxXDYwXDFcMzUiKworICAgICAgICAiXDFcMTQ3XDFcMTUwXDFcNjJcMVwzNlwxXDYzXDFcNTVcMVwzN1wxXDQxXDFcNDBcMVw0MlwxXDcyXDFcNDNcMSIrCisgICAgICAgICJcMTI3XDFcdWZmZmZcMVw2NFwxXDU2XDFcNzFcMVwxMjZcMVw3MFwxXDc3XDFcNzNcMjFcdWZmZmZcMVwxNDIiKworICAgICAgICAiXDFcdWZmZmZcMVwxNDNcMVwxNDRcMVwxNDZcMVwxNTFcM1x1ZmZmZlwxXDE1XDJcdWZmZmZcMVw3NFwxNFx1ZmZmZiIrCisgICAgICAgICJcMVwxMDRcMlx1ZmZmZlwxXDY1XDNcdWZmZmZcMVw1MlwxXDUzXDFcNDZcMVw0NFwxXDQ3XDFcNDVcNDNcdWZmZmYiKworICAgICAgICAiXDFcMTBcM1x1ZmZmZlwxXDExXDFcMTMwXDEyXHVmZmZmXDFcMTAyXDNcdWZmZmZcMVwxMDVcMVwxMDZcMVwxMTMiKworICAgICAgICAiXDNcdWZmZmZcMVwxMjJcMTBcdWZmZmZcMVw1XDRcdWZmZmZcMVw3NVwyXHVmZmZmXDFcN1wxMlx1ZmZmZlwxIisKKyAgICAgICAgIlwxMDFcNVx1ZmZmZlwxXDExNlwxXHVmZmZmXDFcMTE1XDI3XHVmZmZmXDFcMTEyXDFcdWZmZmZcMVwxMjVcMSIrCisgICAgICAgICJcdWZmZmZcMVwxMTRcMVx1ZmZmZlwxXDEwM1wyXHVmZmZmXDFcMTIwXDNcdWZmZmZcMVw0XDNcdWZmZmZcMVwxMjEiKworICAgICAgICAiXDFcdWZmZmZcMVw2XDEwXHVmZmZmXDFcNzZcMVwxMTBcNVx1ZmZmZlwxXDExN1wxXDFcMVwxNFw1XHVmZmZmIisKKyAgICAgICAgIlwxXDEwN1wyXHVmZmZmXDFcMTAwXDdcdWZmZmZcMVwxMjNcMVx1ZmZmZlwxXDE2XDNcdWZmZmZcMVwxMzJcMyIrCisgICAgICAgICJcdWZmZmZcMVwxMzZcMVx1ZmZmZlwxXDEzXDZcdWZmZmZcMVwxMzVcMVwxN1wxXDExMVwxXHVmZmZmXDFcMTM0IisKKyAgICAgICAgIlwxXDEyXDFcMTMzXDFcMTQwXDFcdWZmZmZcMVwxMzFcMVx1ZmZmZlwxXDUwXDFcMTQxXDNcdWZmZmZcMVwxMzciKworICAgICAgICAiXDFcMTI0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIERGQTIxX3NwZWNpYWxTID0KKyAgICAgICAgIlwxXDBcdTAxN2VcdWZmZmZ9PiI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERGQTIxX3RyYW5zaXRpb25TID0geworICAgICAgICAgICAgIlwxMVw1N1wyXDU2XDJcNTdcMVw1NlwyMlw1N1wxXDU2XDFcMzVcMVw1NFwxXDIyXDFcNTNcMVwzMFwxIisKKyAgICAgICAgICAgICJcMzRcMVw1NVwxXDE2XDFcMjBcMVwxNFwxXDI1XDFcMTdcMVwyNlwxXDEzXDFcMjdcMVw1MFwxMVw1MSIrCisgICAgICAgICAgICAiXDFcMzdcMVw0MFwxXDMxXDFcMjFcMVwzMlwxXDM2XDFcMTVcMzJcNTNcMVwyM1wxXDU3XDFcMjRcMVw1MiIrCisgICAgICAgICAgICAiXDFcNTNcMVw1N1wxXDExXDFcN1wxXDQyXDFcMTBcMVw2XDFcNDNcMlw1M1wxXDRcNFw1M1wxXDQ2XDEiKworICAgICAgICAgICAgIlw1M1wxXDFcMVw1M1wxXDVcMVw0MVwxXDQ3XDFcMTJcMVw0NVwxXDQ0XDNcNTNcMVwyXDFcMzNcMVwzIisKKyAgICAgICAgICAgICJcdWZmODJcNTciLAorICAgICAgICAgICAgIlwxXDYwXDIwXHVmZmZmXDFcNjEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw3MFw2XHVmZmZmXDFcNjVcMVw2N1w0XHVmZmZmXDFcNjYiLAorICAgICAgICAgICAgIlwxXDcyXDExXHVmZmZmXDFcNzEiLAorICAgICAgICAgICAgIlwxXDc0XDFcdWZmZmZcMVw3M1wxMVx1ZmZmZlwxXDc1IiwKKyAgICAgICAgICAgICJcMVw3NiIsCisgICAgICAgICAgICAiXDFcMTAwXDNcdWZmZmZcMVwxMDJcNVx1ZmZmZlwxXDEwMVw0XHVmZmZmXDFcNzciLAorICAgICAgICAgICAgIlwxXDEwM1wxXHVmZmZmXDFcMTA1XDRcdWZmZmZcMVwxMDQiLAorICAgICAgICAgICAgIlwxXDEwN1wyXHVmZmZmXDFcMTA2IiwKKyAgICAgICAgICAgICJcMVwxMTAiLAorICAgICAgICAgICAgIlwxXDExM1wyMlx1ZmZmZlwxXDExMiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVwxMjFcMVwxMjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDEzMFwyMVx1ZmZmZlwxXDEyNyIsCisgICAgICAgICAgICAiXDFcMTM0XDE3XHVmZmZmXDFcMTMyXDFcMTMzIiwKKyAgICAgICAgICAgICJcMVwxMzdcNFx1ZmZmZlwxXDE0MFwxNVx1ZmZmZlwxXDEzNiIsCisgICAgICAgICAgICAiXDFcMTQyIiwKKyAgICAgICAgICAgICJcMVwxNDQiLAorICAgICAgICAgICAgIlwxXDE0NiIsCisgICAgICAgICAgICAiXDFcMTUwIiwKKyAgICAgICAgICAgICJcMVwxNTIiLAorICAgICAgICAgICAgIlwxXDE1NCIsCisgICAgICAgICAgICAiXDFcMTU3XDEzXHVmZmZmXDFcMTU2IiwKKyAgICAgICAgICAgICJcMVwxNjEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcMTY1XDFcMTY2XDFcdWZmZmZcMVwxNjRcMVx1ZmZmZlwxXDE2NyIsCisgICAgICAgICAgICAiXDFcMTcwXDIwXHVmZmZmXDFcMTcxIiwKKyAgICAgICAgICAgICJcMVwxNzNcN1x1ZmZmZlwxXDE3NFw1XHVmZmZmXDFcMTcyIiwKKyAgICAgICAgICAgICJcMVwxNzUiLAorICAgICAgICAgICAgIlwxXDE3NiIsCisgICAgICAgICAgICAiXDFcMTc3XDExXHVmZmZmXDFcdTAwODFcNVx1ZmZmZlwxXHUwMDgwIiwKKyAgICAgICAgICAgICJcMVx1MDA4NFwxMVx1ZmZmZlwxXHUwMDgyXDZcdWZmZmZcMVx1MDA4MyIsCisgICAgICAgICAgICAiXDEyXHUwMDg2XDEwXHVmZmZmXDFcdTAwODhcMVx1ZmZmZlwzXHUwMDg4XDVcdWZmZmZcMVx1MDA4OCIrCisgICAgICAgICAgICAiXDEzXHVmZmZmXDFcdTAwODVcNlx1ZmZmZlwxXHUwMDg2XDJcdWZmZmZcMVx1MDA4OFwxXHVmZmZmXDMiKworICAgICAgICAgICAgIlx1MDA4OFw1XHVmZmZmXDFcdTAwODhcMTNcdWZmZmZcMVx1MDA4NSIsCisgICAgICAgICAgICAiXDEyXHUwMDg2XDEwXHVmZmZmXDFcdTAwODhcMVx1ZmZmZlwzXHUwMDg4XDVcdWZmZmZcMVx1MDA4OCIrCisgICAgICAgICAgICAiXDIyXHVmZmZmXDFcdTAwODZcMlx1ZmZmZlwxXHUwMDg4XDFcdWZmZmZcM1x1MDA4OFw1XHVmZmZmXDEiKworICAgICAgICAgICAgIlx1MDA4OCIsCisgICAgICAgICAgICAiXDFcNjJcMzRcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDA4YiIsCisgICAgICAgICAgICAiXDFcdTAwOGMiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMDhkIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMDhmXDJcdWZmZmZcMVx1MDA5MCIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVx1MDA5MiIsCisgICAgICAgICAgICAiXDFcdTAwOTVcNFx1ZmZmZlwxXHUwMDkzXDE1XHVmZmZmXDFcdTAwOTQiLAorICAgICAgICAgICAgIlwxXHUwMDk2IiwKKyAgICAgICAgICAgICJcMVx1MDA5NyIsCisgICAgICAgICAgICAiXDFcdTAwOTlcMTZcdWZmZmZcMVx1MDA5OCIsCisgICAgICAgICAgICAiXDFcdTAwOWEiLAorICAgICAgICAgICAgIlwxXHUwMDliIiwKKyAgICAgICAgICAgICJcMVx1MDA5Y1w1XHVmZmZmXDFcdTAwOWQiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwOWYiLAorICAgICAgICAgICAgIlwxXHUwMGEwIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMGEyIiwKKyAgICAgICAgICAgICJcMVx1MDBhMyIsCisgICAgICAgICAgICAiXDFcdTAwYTQiLAorICAgICAgICAgICAgIlwxXHUwMGE1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYTciLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhOSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBhYiIsCisgICAgICAgICAgICAiXDFcdTAwYWMiLAorICAgICAgICAgICAgIlwxXHUwMGFkIiwKKyAgICAgICAgICAgICJcMVx1MDBhZSIsCisgICAgICAgICAgICAiXDFcdTAwYWZcMVx1MDBiMCIsCisgICAgICAgICAgICAiXDFcdTAwYjEiLAorICAgICAgICAgICAgIlwxXHUwMGIyIiwKKyAgICAgICAgICAgICJcMVx1MDBiMyIsCisgICAgICAgICAgICAiXDFcdTAwYjQiLAorICAgICAgICAgICAgIlwxXHUwMGI1IiwKKyAgICAgICAgICAgICJcMVx1MDBiN1w1XHVmZmZmXDFcdTAwYjYiLAorICAgICAgICAgICAgIlwxXHUwMGI4IiwKKyAgICAgICAgICAgICJcMVx1MDBiOSIsCisgICAgICAgICAgICAiXDFcdTAwYmEiLAorICAgICAgICAgICAgIlwxXHUwMGJiXDNcdWZmZmZcMVx1MDBiYyIsCisgICAgICAgICAgICAiXDFcdTAwYmQiLAorICAgICAgICAgICAgIlwxXHUwMGJlIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxMlx1MDA4NlwxMFx1ZmZmZlwxXHUwMDg4XDFcdWZmZmZcM1x1MDA4OFw1XHVmZmZmXDFcdTAwODgiKworICAgICAgICAgICAgIlwyMlx1ZmZmZlwxXHUwMDg2XDJcdWZmZmZcMVx1MDA4OFwxXHVmZmZmXDNcdTAwODhcNVx1ZmZmZlwxIisKKyAgICAgICAgICAgICJcdTAwODgiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwYmYiLAorICAgICAgICAgICAgIlwxXHUwMGMwXDE0XHVmZmZmXDFcdTAwYzEiLAorICAgICAgICAgICAgIlwxXHUwMGMyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGMzIiwKKyAgICAgICAgICAgICJcMVx1MDBjNCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBjNSIsCisgICAgICAgICAgICAiXDFcdTAwYzYiLAorICAgICAgICAgICAgIlwxXHUwMGM3IiwKKyAgICAgICAgICAgICJcMVx1MDBjOCIsCisgICAgICAgICAgICAiXDFcdTAwYzkiLAorICAgICAgICAgICAgIlwxXHUwMGNhIiwKKyAgICAgICAgICAgICJcMVx1MDBjYiIsCisgICAgICAgICAgICAiXDFcdTAwY2MiLAorICAgICAgICAgICAgIlwxXHUwMGNkIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMGNmIiwKKyAgICAgICAgICAgICJcMVx1MDBkMCIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBkMSIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwZDQiLAorICAgICAgICAgICAgIlwxXHUwMGQ1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDBkNiIsCisgICAgICAgICAgICAiXDFcdTAwZDhcMVx1ZmZmZlwxXHUwMGQ3IiwKKyAgICAgICAgICAgICJcMVx1MDBkOSIsCisgICAgICAgICAgICAiXDFcdTAwZGEiLAorICAgICAgICAgICAgIlwxXHUwMGRiIiwKKyAgICAgICAgICAgICJcMVx1MDBkYyIsCisgICAgICAgICAgICAiXDFcdTAwZGQiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwZGYiLAorICAgICAgICAgICAgIlwxXHUwMGUwIiwKKyAgICAgICAgICAgICJcMVx1MDBlMSIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwZTUiLAorICAgICAgICAgICAgIlwxXHUwMGU2IiwKKyAgICAgICAgICAgICJcMVx1MDBlNyIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVx1MDBlOSIsCisgICAgICAgICAgICAiXDFcdTAwZWEiLAorICAgICAgICAgICAgIlwxXHUwMGViIiwKKyAgICAgICAgICAgICJcMVx1MDBlYyIsCisgICAgICAgICAgICAiXDFcdTAwZWQiLAorICAgICAgICAgICAgIlwxXHUwMGVlIiwKKyAgICAgICAgICAgICJcMVx1MDBlZiIsCisgICAgICAgICAgICAiXDFcdTAwZjAiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwZjIiLAorICAgICAgICAgICAgIlwxXHUwMGYzIiwKKyAgICAgICAgICAgICJcMVx1MDBmNCIsCisgICAgICAgICAgICAiXDFcdTAwZjUiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAwZjciLAorICAgICAgICAgICAgIlwxXHUwMGY4IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAwZmEiLAorICAgICAgICAgICAgIlwxXHUwMGZiIiwKKyAgICAgICAgICAgICJcMVx1MDBmYyIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMGZkIiwKKyAgICAgICAgICAgICJcMVx1MDBmZSIsCisgICAgICAgICAgICAiXDFcdTAwZmYiLAorICAgICAgICAgICAgIlwxXHUwMTAwIiwKKyAgICAgICAgICAgICJcMVx1MDEwMSIsCisgICAgICAgICAgICAiXDFcdTAxMDIiLAorICAgICAgICAgICAgIlwxXHUwMTAzIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTA1IiwKKyAgICAgICAgICAgICJcMVx1MDEwNiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDEwNyIsCisgICAgICAgICAgICAiXDFcdTAxMDgiLAorICAgICAgICAgICAgIlwxXHUwMTA5IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTBiIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMGQiLAorICAgICAgICAgICAgIlwxXHUwMTBlIiwKKyAgICAgICAgICAgICJcMVx1MDEwZiIsCisgICAgICAgICAgICAiXDFcdTAxMTAiLAorICAgICAgICAgICAgIlwxXHUwMTExIiwKKyAgICAgICAgICAgICJcMVx1MDExMiIsCisgICAgICAgICAgICAiXDFcdTAxMTMiLAorICAgICAgICAgICAgIlwxXHUwMTE0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTE1IiwKKyAgICAgICAgICAgICJcMVx1MDExNiIsCisgICAgICAgICAgICAiXDFcdTAxMTciLAorICAgICAgICAgICAgIlwxXHUwMTE4IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTE5XDE2XHVmZmZmXDFcdTAxMWEiLAorICAgICAgICAgICAgIlwxXHUwMTFiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTFjIiwKKyAgICAgICAgICAgICJcMVx1MDExZCIsCisgICAgICAgICAgICAiXDFcdTAxMWUiLAorICAgICAgICAgICAgIlwxXHUwMTFmIiwKKyAgICAgICAgICAgICJcMVx1MDEyMCIsCisgICAgICAgICAgICAiXDFcdTAxMjEiLAorICAgICAgICAgICAgIlwxXHUwMTIyIiwKKyAgICAgICAgICAgICJcMVx1MDEyMyIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVx1MDEyNSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTI3IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTI5IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMmIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxMmMiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAxMmUiLAorICAgICAgICAgICAgIlwxXHUwMTJmIiwKKyAgICAgICAgICAgICJcMVx1MDEzMCIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVx1MDEzMiIsCisgICAgICAgICAgICAiXDFcdTAxMzMiLAorICAgICAgICAgICAgIlwxXHUwMTM0IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTM2IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTM4IiwKKyAgICAgICAgICAgICJcMVx1MDEzOSIsCisgICAgICAgICAgICAiXDFcdTAxM2EiLAorICAgICAgICAgICAgIlwxXHUwMTNiIiwKKyAgICAgICAgICAgICJcMVx1MDEzYyIsCisgICAgICAgICAgICAiXDFcdTAxM2QiLAorICAgICAgICAgICAgIlwxXHUwMTNlIiwKKyAgICAgICAgICAgICJcMVx1MDEzZiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTQyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQzIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQ0IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQ1IiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTQ2IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTRhIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTRiIiwKKyAgICAgICAgICAgICJcMVx1MDE0YyIsCisgICAgICAgICAgICAiXDFcdTAxNGQiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNGUiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVx1MDE1MCIsCisgICAgICAgICAgICAiXDFcdTAxNTEiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAxNTMiLAorICAgICAgICAgICAgIlwxXHUwMTU0IiwKKyAgICAgICAgICAgICJcMVx1MDE1NSIsCisgICAgICAgICAgICAiXDFcdTAxNTYiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE1NyIsCisgICAgICAgICAgICAiXDFcdTAxNTgiLAorICAgICAgICAgICAgIlwxXHUwMTU5IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTViIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTVkIiwKKyAgICAgICAgICAgICJcMVx1MDE1ZSIsCisgICAgICAgICAgICAiXDFcdTAxNWYiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE2MSIsCisgICAgICAgICAgICAiXDFcdTAxNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNjMiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwyMiIrCisgICAgICAgICAgICAiXDYyXDFcdTAxNjVcN1w2MiIsCisgICAgICAgICAgICAiXDFcdTAxNjciLAorICAgICAgICAgICAgIlwxXHUwMTY4IiwKKyAgICAgICAgICAgICJcMVx1MDE2OSIsCisgICAgICAgICAgICAiXDFcdTAxNmEiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNmIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcdTAxNmMiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiXDFcdTAxNzAiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiXDFcNjJcMTNcdWZmZmZcMTJcNjJcN1x1ZmZmZlwzMlw2Mlw0XHVmZmZmXDFcNjJcMVx1ZmZmZlwzMiIrCisgICAgICAgICAgICAiXDYyIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTc1IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXHUwMTc3IiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3YSIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICJcMVx1MDE3YiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiLAorICAgICAgICAgICAgIlwxXHUwMTdjIiwKKyAgICAgICAgICAgICJcMVw2MlwxM1x1ZmZmZlwxMlw2Mlw3XHVmZmZmXDMyXDYyXDRcdWZmZmZcMVw2MlwxXHVmZmZmXDMyIisKKyAgICAgICAgICAgICJcNjIiLAorICAgICAgICAgICAgIlwxXDYyXDEzXHVmZmZmXDEyXDYyXDdcdWZmZmZcMzJcNjJcNFx1ZmZmZlwxXDYyXDFcdWZmZmZcMzIiKworICAgICAgICAgICAgIlw2MiIsCisgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICIiCisgICAgfTsKKworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvdCA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvdFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdIERGQTIxX2VvZiA9IERGQS51bnBhY2tFbmNvZGVkU3RyaW5nKERGQTIxX2VvZlMpOworICAgIHN0YXRpYyBmaW5hbCBjaGFyW10gREZBMjFfbWluID0gREZBLnVucGFja0VuY29kZWRTdHJpbmdUb1Vuc2lnbmVkQ2hhcnMoREZBMjFfbWluUyk7CisgICAgc3RhdGljIGZpbmFsIGNoYXJbXSBERkEyMV9tYXggPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZ1RvVW5zaWduZWRDaGFycyhERkEyMV9tYXhTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9hY2NlcHQgPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV9hY2NlcHRTKTsKKyAgICBzdGF0aWMgZmluYWwgc2hvcnRbXSBERkEyMV9zcGVjaWFsID0gREZBLnVucGFja0VuY29kZWRTdHJpbmcoREZBMjFfc3BlY2lhbFMpOworICAgIHN0YXRpYyBmaW5hbCBzaG9ydFtdW10gREZBMjFfdHJhbnNpdGlvbjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBudW1TdGF0ZXMgPSBERkEyMV90cmFuc2l0aW9uUy5sZW5ndGg7CisgICAgICAgIERGQTIxX3RyYW5zaXRpb24gPSBuZXcgc2hvcnRbbnVtU3RhdGVzXVtdOworICAgICAgICBmb3IgKGludCBpPTA7IGk8bnVtU3RhdGVzOyBpKyspIHsKKyAgICAgICAgICAgIERGQTIxX3RyYW5zaXRpb25baV0gPSBERkEudW5wYWNrRW5jb2RlZFN0cmluZyhERkEyMV90cmFuc2l0aW9uU1tpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBERkEyMSBleHRlbmRzIERGQSB7CisKKyAgICAgICAgcHVibGljIERGQTIxKEJhc2VSZWNvZ25pemVyIHJlY29nbml6ZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVjb2duaXplciA9IHJlY29nbml6ZXI7CisgICAgICAgICAgICB0aGlzLmRlY2lzaW9uTnVtYmVyID0gMjE7CisgICAgICAgICAgICB0aGlzLmVvdCA9IERGQTIxX2VvdDsKKyAgICAgICAgICAgIHRoaXMuZW9mID0gREZBMjFfZW9mOworICAgICAgICAgICAgdGhpcy5taW4gPSBERkEyMV9taW47CisgICAgICAgICAgICB0aGlzLm1heCA9IERGQTIxX21heDsKKyAgICAgICAgICAgIHRoaXMuYWNjZXB0ID0gREZBMjFfYWNjZXB0OworICAgICAgICAgICAgdGhpcy5zcGVjaWFsID0gREZBMjFfc3BlY2lhbDsKKyAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbiA9IERGQTIxX3RyYW5zaXRpb247CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMToxOiBUb2tlbnMgOiAoIFRfXzEzIHwgVF9fMTQgfCBUX18xNSB8IFRfXzE2IHwgVF9fMTcgfCBUX18xOCB8IFRfXzE5IHwgVF9fMjAgfCBUX18yMSB8IFRfXzIyIHwgVF9fMjMgfCBUX18yNCB8IFRfXzI1IHwgVF9fMjYgfCBUX18yNyB8IFRfXzI4IHwgVF9fMjkgfCBUX18zMCB8IFRfXzMxIHwgVF9fMzIgfCBUX18zMyB8IFRfXzM0IHwgVF9fMzUgfCBUX18zNiB8IFRfXzM3IHwgVF9fMzggfCBUX18zOSB8IFRfXzQwIHwgVF9fNDEgfCBUX180MiB8IFRfXzQzIHwgVF9fNDQgfCBUX180NSB8IFRfXzQ2IHwgVF9fNDcgfCBUX180OCB8IFRfXzQ5IHwgVF9fNTAgfCBUX181MSB8IFRfXzUyIHwgVF9fNTMgfCBUX181NCB8IFRfXzU1IHwgVF9fNTYgfCBUX181NyB8IFRfXzU4IHwgVF9fNTkgfCBUX182MCB8IFRfXzYxIHwgVF9fNjIgfCBUX182MyB8IFRfXzY0IHwgVF9fNjUgfCBUX182NiB8IFRfXzY3IHwgVF9fNjggfCBUX182OSB8IFRfXzcwIHwgVF9fNzEgfCBUX183MiB8IFRfXzczIHwgVF9fNzQgfCBUX183NSB8IFRfXzc2IHwgVF9fNzcgfCBUX183OCB8IFRfXzc5IHwgVF9fODAgfCBUX184MSB8IFRfXzgyIHwgVF9fODMgfCBUX184NCB8IFRfXzg1IHwgVF9fODYgfCBUX184NyB8IFRfXzg4IHwgVF9fODkgfCBUX185MCB8IFRfXzkxIHwgVF9fOTIgfCBUX185MyB8IFRfXzk0IHwgVF9fOTUgfCBUX185NiB8IFRfXzk3IHwgVF9fOTggfCBUX185OSB8IFRfXzEwMCB8IFRfXzEwMSB8IFRfXzEwMiB8IFRfXzEwMyB8IFRfXzEwNCB8IFRfXzEwNSB8IFRfXzEwNiB8IFRfXzEwNyB8IFRfXzEwOCB8IFRfXzEwOSB8IFJVTEVfSEVYIHwgUlVMRV9JTlQgfCBSVUxFX0RFQ0lNQUwgfCBSVUxFX0lEIHwgUlVMRV9TVFJJTkcgfCBSVUxFX01MX0NPTU1FTlQgfCBSVUxFX1NMX0NPTU1FTlQgfCBSVUxFX1dTIHwgUlVMRV9BTllfT1RIRVIgKTsiOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBpbnQgc3BlY2lhbFN0YXRlVHJhbnNpdGlvbihpbnQgcywgSW50U3RyZWFtIF9pbnB1dCkgdGhyb3dzIE5vVmlhYmxlQWx0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEludFN0cmVhbSBpbnB1dCA9IF9pbnB1dDsKKyAgICAgICAgCWludCBfcyA9IHM7CisgICAgICAgICAgICBzd2l0Y2ggKCBzICkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIDAgOiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIxXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMV8wPT0ncCcpICkge3MgPSAxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSd7JykgKSB7cyA9IDI7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J30nKSApIHtzID0gMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0naScpICkge3MgPSA0O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdyJykgKSB7cyA9IDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2UnKSApIHtzID0gNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nYicpICkge3MgPSA3O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdkJykgKSB7cyA9IDg7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKExBMjFfMD09J2EnKSApIHtzID0gOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndScpICkge3MgPSAxMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLicpICkge3MgPSAxMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKicpICkge3MgPSAxMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nQCcpICkge3MgPSAxMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKCcpICkge3MgPSAxNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLCcpICkge3MgPSAxNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKScpICkge3MgPSAxNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPScpICkge3MgPSAxNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIycpICkge3MgPSAxODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nWycpICkge3MgPSAxOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXScpICkge3MgPSAyMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nKycpICkge3MgPSAyMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLScpICkge3MgPSAyMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nLycpICkge3MgPSAyMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJScpICkge3MgPSAyNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPCcpICkge3MgPSAyNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPicpICkge3MgPSAyNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nfCcpICkge3MgPSAyNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nJicpICkge3MgPSAyODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nIScpICkge3MgPSAyOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nPycpICkge3MgPSAzMDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOicpICkge3MgPSAzMTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nOycpICkge3MgPSAzMjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ncycpICkge3MgPSAzMzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nYycpICkge3MgPSAzNDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nZicpICkge3MgPSAzNTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndycpICkge3MgPSAzNjt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndicpICkge3MgPSAzNzt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nbicpICkge3MgPSAzODt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0ndCcpICkge3MgPSAzOTt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nMCcpICkge3MgPSA0MDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBMjFfMD49JzEnICYmIExBMjFfMDw9JzknKSkgKSB7cyA9IDQxO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdeJykgKSB7cyA9IDQyO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSckJ3x8KExBMjFfMD49J0EnICYmIExBMjFfMDw9J1onKXx8TEEyMV8wPT0nXyd8fChMQTIxXzA+PSdnJyAmJiBMQTIxXzA8PSdoJyl8fChMQTIxXzA+PSdqJyAmJiBMQTIxXzA8PSdtJyl8fExBMjFfMD09J28nfHxMQTIxXzA9PSdxJ3x8KExBMjFfMD49J3gnICYmIExBMjFfMDw9J3onKSkgKSB7cyA9IDQzO30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTIxXzA9PSdcIicpICkge3MgPSA0NDt9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEyMV8wPT0nXCcnKSApIHtzID0gNDU7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggKChMQTIxXzA+PSdcdCcgJiYgTEEyMV8wPD0nXG4nKXx8TEEyMV8wPT0nXHInfHxMQTIxXzA9PScgJykgKSB7cyA9IDQ2O30KKworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICgoTEEyMV8wPj0nXHUwMDAwJyAmJiBMQTIxXzA8PSdcYicpfHwoTEEyMV8wPj0nXHUwMDBCJyAmJiBMQTIxXzA8PSdcZicpfHwoTEEyMV8wPj0nXHUwMDBFJyAmJiBMQTIxXzA8PSdcdTAwMUYnKXx8TEEyMV8wPT0nXFwnfHxMQTIxXzA9PSdgJ3x8KExBMjFfMD49J34nICYmIExBMjFfMDw9J1x1RkZGRicpKSApIHtzID0gNDc7fQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHM+PTAgKSByZXR1cm4gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKGdldERlc2NyaXB0aW9uKCksIDIxLCBfcywgaW5wdXQpOworICAgICAgICAgICAgZXJyb3IobnZhZSk7CisgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICB9CisgICAgfQorIAorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk5OWQzCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIuamF2YQpAQCAtMCwwICsxLDEwMDE1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5wYXJzZXIuYW50bHIuaW50ZXJuYWw7IAorCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuaW1wbC4qOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRW51bWVyYXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnBhcnNlci5hbnRsci5YdGV4dFRva2VuU3RyZWFtLkhpZGRlblRva2VuczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5wYXJzZXIuYW50bHIuQW50bHJEYXRhdHlwZVJ1bGVUb2tlbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2VydmljZXMuQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3M7CisKKworCitpbXBvcnQgb3JnLmFudGxyLnJ1bnRpbWUuKjsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMUGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RJbnRlcm5hbEFudGxyUGFyc2VyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRva2VuTmFtZXMgPSBuZXcgU3RyaW5nW10geworICAgICAgICAiPGludmFsaWQ+IiwgIjxFT1I+IiwgIjxET1dOPiIsICI8VVA+IiwgIlJVTEVfSUQiLCAiUlVMRV9TVFJJTkciLCAiUlVMRV9IRVgiLCAiUlVMRV9JTlQiLCAiUlVMRV9ERUNJTUFMIiwgIlJVTEVfTUxfQ09NTUVOVCIsICJSVUxFX1NMX0NPTU1FTlQiLCAiUlVMRV9XUyIsICJSVUxFX0FOWV9PVEhFUiIsICIncGFja2FnZSciLCAiJ3snIiwgIid9JyIsICInaW1wb3J0JyIsICIncm9sZSciLCAiJ2VudGl0eSciLCAiJ2JlYW4nIiwgIidkdG8nIiwgIidhbGwnIiwgIid1c2VydGFza3MnIiwgIid1c2VydGFzayciLCAiJ3Byb2Nlc3MnIiwgIidpcyciLCAiJ3Byb3BlcnR5JyIsICIncmVmZXJlbmNlJyIsICInLiciLCAiJyonIiwgIidAJyIsICInKCciLCAiJywnIiwgIicpJyIsICInPSciLCAiJyMnIiwgIidbJyIsICInXSciLCAiJys9JyIsICInLT0nIiwgIicqPSciLCAiJy89JyIsICInJT0nIiwgIic8JyIsICInPiciLCAiJz49JyIsICInfHwnIiwgIicmJiciLCAiJz09JyIsICInIT0nIiwgIic9PT0nIiwgIichPT0nIiwgIidpbnN0YW5jZW9mJyIsICInLT4nIiwgIicuLjwnIiwgIicuLiciLCAiJz0+JyIsICInPD4nIiwgIic/OiciLCAiJysnIiwgIictJyIsICInKionIiwgIicvJyIsICInJSciLCAiJyEnIiwgIidhcyciLCAiJysrJyIsICInLS0nIiwgIic6OiciLCAiJz8uJyIsICInfCciLCAiJzsnIiwgIidpZiciLCAiJ2Vsc2UnIiwgIidzd2l0Y2gnIiwgIic6JyIsICInZGVmYXVsdCciLCAiJ2Nhc2UnIiwgIidmb3InIiwgIid3aGlsZSciLCAiJ2RvJyIsICIndmFyJyIsICIndmFsJyIsICInZXh0ZW5kcyciLCAiJ3N0YXRpYyciLCAiJ2V4dGVuc2lvbiciLCAiJ3N1cGVyJyIsICInbmV3JyIsICInZmFsc2UnIiwgIid0cnVlJyIsICInbnVsbCciLCAiJ3R5cGVvZiciLCAiJ3Rocm93JyIsICIncmV0dXJuJyIsICIndHJ5JyIsICInZmluYWxseSciLCAiJ3N5bmNocm9uaXplZCciLCAiJ2NhdGNoJyIsICInPyciLCAiJyYnIiwgIidhbnknIiwgIidjcmVhdGFibGUnIiwgIidyZWFkYWJsZSciLCAiJ3VwZGF0YWJsZSciLCAiJ2RlbGV0YWJsZSciLCAiJ2ludmlzaWJsZSciLCAiJ2Rpc2FibGVkJyIsICInbm9uZWRpdGFibGUnIiwgIidzdGFydGFibGUnIiwgIidleGVjdXRhYmxlJyIKKyAgICB9OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSEVYPTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTA9NTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTk9NTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTU9NTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTY9NTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTc9NTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTg9NTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTE9NTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTI9NTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTM9NTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNTQ9NTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjA9NjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjE9NjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9JRD00OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfSU5UPTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjY9NjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9NTF9DT01NRU5UPTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjc9Njc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjg9Njg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjk9Njk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjI9NjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjM9NjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjQ9NjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNjU9NjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzc9Mzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzg9Mzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzk9Mzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzM9MzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzQ9MzQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzU9MzU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzY9MzY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzA9MzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzE9MzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMzI9MzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDg9NDg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDk9NDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDQ9NDQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDU9NDU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDY9NDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDc9NDc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDA9NDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDE9NDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDI9NDI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNDM9NDM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTE9OTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTAwPTEwMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mj05MjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX185Mz05MzsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDI9MTAyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzk0PTk0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwMT0xMDE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTA9OTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTk9MTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTU9MTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTY9MTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTc9MTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTg9MTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTk9OTk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTM9MTM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTQ9MTQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTU9OTU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTY9OTY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTc9OTc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fOTg9OTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9ERUNJTUFMPTg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjY9MjY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjc9Mjc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjg9Mjg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjk9Mjk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjI9MjI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjM9MjM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjQ9MjQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjU9MjU7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjA9MjA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMjE9MjE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzA9NzA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzE9NzE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzI9NzI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9TVFJJTkc9NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSVUxFX1NMX0NPTU1FTlQ9MTA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzc9Nzc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzg9Nzg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzk9Nzk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fNzM9NzM7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GPS0xOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc0PTc0OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc1PTc1OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzc2PTc2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgwPTgwOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgxPTgxOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgyPTgyOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzgzPTgzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJVTEVfV1M9MTE7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUlVMRV9BTllfT1RIRVI9MTI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODg9ODg7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA4PTEwODsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184OT04OTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDc9MTA3OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwOT0xMDk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODQ9ODQ7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA0PTEwNDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX184NT04NTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUX18xMDM9MTAzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzg2PTg2OworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRfXzEwNj0xMDY7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fODc9ODc7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVF9fMTA1PTEwNTsKKworICAgIC8vIGRlbGVnYXRlcworICAgIC8vIGRlbGVnYXRvcnMKKworCisgICAgICAgIHB1YmxpYyBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIoVG9rZW5TdHJlYW0gaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMoaW5wdXQsIG5ldyBSZWNvZ25pemVyU2hhcmVkU3RhdGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgUmVjb2duaXplclNoYXJlZFN0YXRlIHN0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihpbnB1dCwgc3RhdGUpOworICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIAorCisgICAgcHVibGljIFN0cmluZ1tdIGdldFRva2VuTmFtZXMoKSB7IHJldHVybiBJbnRlcm5hbEF1dGhvcml6YXRpb25EU0xQYXJzZXIudG9rZW5OYW1lczsgfQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JhbW1hckZpbGVOYW1lKCkgeyByZXR1cm4gIi4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmciOyB9CisKKworCisgICAgIAlwcml2YXRlIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzIGdyYW1tYXJBY2Nlc3M7CisgICAgIAkKKyAgICAgICAgcHVibGljIEludGVybmFsQXV0aG9yaXphdGlvbkRTTFBhcnNlcihUb2tlblN0cmVhbSBpbnB1dCwgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcykgeworICAgICAgICAgICAgdGhpcyhpbnB1dCk7CisgICAgICAgICAgICB0aGlzLmdyYW1tYXJBY2Nlc3MgPSBncmFtbWFyQWNjZXNzOworICAgICAgICAgICAgcmVnaXN0ZXJSdWxlcyhncmFtbWFyQWNjZXNzLmdldEdyYW1tYXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0UnVsZU5hbWUoKSB7CisgICAgICAgIAlyZXR1cm4gIkF1dGhvcml6YXRpb25Nb2RlbCI7CQorICAgICAgIAl9CisgICAgICAgCQorICAgICAgIAlAT3ZlcnJpZGUKKyAgICAgICAJcHJvdGVjdGVkIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzIGdldEdyYW1tYXJBY2Nlc3MoKSB7CisgICAgICAgCQlyZXR1cm4gZ3JhbW1hckFjY2VzczsKKyAgICAgICAJfQorCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Njg6MTogZW50cnlSdWxlQXV0aG9yaXphdGlvbk1vZGVsIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVBdXRob3JpemF0aW9uTW9kZWw9IHJ1bGVBdXRob3JpemF0aW9uTW9kZWwgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZUF1dGhvcml6YXRpb25Nb2RlbCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OToyOiAoaXZfcnVsZUF1dGhvcml6YXRpb25Nb2RlbD0gcnVsZUF1dGhvcml6YXRpb25Nb2RlbCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDoyOiBpdl9ydWxlQXV0aG9yaXphdGlvbk1vZGVsPSBydWxlQXV0aG9yaXphdGlvbk1vZGVsIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvbk1vZGVsX2luX2VudHJ5UnVsZUF1dGhvcml6YXRpb25Nb2RlbDc1KTsKKyAgICAgICAgICAgIGl2X3J1bGVBdXRob3JpemF0aW9uTW9kZWw9cnVsZUF1dGhvcml6YXRpb25Nb2RlbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUF1dGhvcml6YXRpb25Nb2RlbDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWw4NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVBdXRob3JpemF0aW9uTW9kZWwiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUF1dGhvcml6YXRpb25Nb2RlbCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3OjE6IHJ1bGVBdXRob3JpemF0aW9uTW9kZWwgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAobHZfcGNrZ18wXzA9IHJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVBdXRob3JpemF0aW9uTW9kZWwoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcGNrZ18wXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MDoyODogKCAoIChsdl9wY2tnXzBfMD0gcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgxOjE6ICggKGx2X3Bja2dfMF8wPSBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgxOjE6ICggKGx2X3Bja2dfMF8wPSBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgyOjE6IChsdl9wY2tnXzBfMD0gcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODI6MTogKGx2X3Bja2dfMF8wPSBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzozOiBsdl9wY2tnXzBfMD0gcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvbk1vZGVsQWNjZXNzKCkuZ2V0UGNrZ0F1dGhvcml6YXRpb25QYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvblBhY2thZ2VfaW5fcnVsZUF1dGhvcml6YXRpb25Nb2RlbDEzMCk7CisgICAgICAgICAgICBsdl9wY2tnXzBfMD1ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbFJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkicGNrZyIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9wY2tnXzBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiQXV0aG9yaXphdGlvblBhY2thZ2UiKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUF1dGhvcml6YXRpb25Nb2RlbCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNzoxOiBlbnRyeVJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2U9IHJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVBdXRob3JpemF0aW9uUGFja2FnZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDg6MjogKGl2X3J1bGVBdXRob3JpemF0aW9uUGFja2FnZT0gcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwOToyOiBpdl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2U9IHJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvblBhY2thZ2VfaW5fZW50cnlSdWxlQXV0aG9yaXphdGlvblBhY2thZ2UxNjUpOworICAgICAgICAgICAgaXZfcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlPXJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlMTc1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVBdXRob3JpemF0aW9uUGFja2FnZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNjoxOiBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdwYWNrYWdlJyAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApIG90aGVybHZfMz0gJ3snICggKGx2X2ltcG9ydHNfNF8wPSBydWxlQXV0aG9yaXphdGlvbkltcG9ydCApICkqICggKGx2X3JvbGVzXzVfMD0gcnVsZVJvbGUgKSApKiBvdGhlcmx2XzY9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlQXV0aG9yaXphdGlvblBhY2thZ2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gbHZfbmFtZV8yXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfaW1wb3J0c180XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcm9sZXNfNV8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE5OjI4OiAoICggKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgKSApKiAoIChsdl9yb2xlc181XzA9IHJ1bGVSb2xlICkgKSogb3RoZXJsdl82PSAnfScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMDoxOiAoICgpIG90aGVybHZfMT0gJ3BhY2thZ2UnICggKGx2X25hbWVfMl8wPSBydWxlUXVhbGlmaWVkTmFtZSApICkgb3RoZXJsdl8zPSAneycgKCAobHZfaW1wb3J0c180XzA9IHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0ICkgKSogKCAobHZfcm9sZXNfNV8wPSBydWxlUm9sZSApICkqIG90aGVybHZfNj0gJ30nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIwOjE6ICggKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgKSApKiAoIChsdl9yb2xlc181XzA9IHJ1bGVSb2xlICkgKSogb3RoZXJsdl82PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjA6MjogKCkgb3RoZXJsdl8xPSAncGFja2FnZScgKCAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkgKSBvdGhlcmx2XzM9ICd7JyAoIChsdl9pbXBvcnRzXzRfMD0gcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgKSApKiAoIChsdl9yb2xlc181XzA9IHJ1bGVSb2xlICkgKSogb3RoZXJsdl82PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIwOjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMTo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMTMsRk9MTE9XXzEzX2luX3J1bGVBdXRob3JpemF0aW9uUGFja2FnZTIyMSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRQYWNrYWdlS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMDoxOiAoIChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMToxOiAobHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMxOjE6IChsdl9uYW1lXzJfMD0gcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzI6MzogbHZfbmFtZV8yXzA9IHJ1bGVRdWFsaWZpZWROYW1lCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUXVhbGlmaWVkTmFtZV9pbl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UyNDIpOworICAgICAgICAgICAgbHZfbmFtZV8yXzA9cnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJuYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X25hbWVfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJRdWFsaWZpZWROYW1lIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZUF1dGhvcml6YXRpb25QYWNrYWdlMjU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUyOjE6ICggKGx2X2ltcG9ydHNfNF8wPSBydWxlQXV0aG9yaXphdGlvbkltcG9ydCApICkqCisgICAgICAgICAgICBsb29wMToKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0MT0yOworICAgICAgICAgICAgICAgIGludCBMQTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExXzA9PTE2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MT0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQxKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTM6MTogKGx2X2ltcG9ydHNfNF8wPSBydWxlQXV0aG9yaXphdGlvbkltcG9ydCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTM6MTogKGx2X2ltcG9ydHNfNF8wPSBydWxlQXV0aG9yaXphdGlvbkltcG9ydCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU0OjM6IGx2X2ltcG9ydHNfNF8wPSBydWxlQXV0aG9yaXphdGlvbkltcG9ydAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKS5nZXRJbXBvcnRzQXV0aG9yaXphdGlvbkltcG9ydFBhcnNlclJ1bGVDYWxsXzRfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvbkltcG9ydF9pbl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UyNzUpOworICAgICAgICAgICAgCSAgICBsdl9pbXBvcnRzXzRfMD1ydWxlQXV0aG9yaXphdGlvbkltcG9ydCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImltcG9ydHMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9pbXBvcnRzXzRfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJBdXRob3JpemF0aW9uSW1wb3J0Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MDozOiAoIChsdl9yb2xlc181XzA9IHJ1bGVSb2xlICkgKSoKKyAgICAgICAgICAgIGxvb3AyOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyPTI7CisgICAgICAgICAgICAgICAgaW50IExBMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTJfMD09MTcpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQyPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDIpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MToxOiAobHZfcm9sZXNfNV8wPSBydWxlUm9sZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzE6MTogKGx2X3JvbGVzXzVfMD0gcnVsZVJvbGUgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MjozOiBsdl9yb2xlc181XzA9IHJ1bGVSb2xlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZUFjY2VzcygpLmdldFJvbGVzUm9sZVBhcnNlclJ1bGVDYWxsXzVfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZV9pbl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UyOTcpOworICAgICAgICAgICAgCSAgICBsdl9yb2xlc181XzA9cnVsZVJvbGUoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyb2xlcyIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JvbGVzXzVfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJSb2xlIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlQXV0aG9yaXphdGlvblBhY2thZ2UzMTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZUF1dGhvcml6YXRpb25QYWNrYWdlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUF1dGhvcml6YXRpb25JbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDA6MTogZW50cnlSdWxlQXV0aG9yaXphdGlvbkltcG9ydCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlQXV0aG9yaXphdGlvbkltcG9ydD0gcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVBdXRob3JpemF0aW9uSW1wb3J0ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMToyOiAoaXZfcnVsZUF1dGhvcml6YXRpb25JbXBvcnQ9IHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMjoyOiBpdl9ydWxlQXV0aG9yaXphdGlvbkltcG9ydD0gcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlQXV0aG9yaXphdGlvbkltcG9ydF9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0MzQ2KTsKKyAgICAgICAgICAgIGl2X3J1bGVBdXRob3JpemF0aW9uSW1wb3J0PXJ1bGVBdXRob3JpemF0aW9uSW1wb3J0KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlQXV0aG9yaXphdGlvbkltcG9ydDsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBdXRob3JpemF0aW9uSW1wb3J0MzU2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZUF1dGhvcml6YXRpb25JbXBvcnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUF1dGhvcml6YXRpb25JbXBvcnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDk6MTogcnVsZUF1dGhvcml6YXRpb25JbXBvcnQgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVBdXRob3JpemF0aW9uSW1wb3J0KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTI6Mjg6ICggKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTM6MTogKG90aGVybHZfMD0gJ2ltcG9ydCcgKCAobHZfaW1wb3J0ZWROYW1lc3BhY2VfMV8wPSBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEzOjE6IChvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMzozOiBvdGhlcmx2XzA9ICdpbXBvcnQnICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgb3RoZXJsdl8wPShUb2tlbiltYXRjaChpbnB1dCwxNixGT0xMT1dfMTZfaW5fcnVsZUF1dGhvcml6YXRpb25JbXBvcnQzOTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE3OjE6ICggKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTg6MTogKGx2X2ltcG9ydGVkTmFtZXNwYWNlXzFfMD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE4OjE6IChsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOTozOiBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9IHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9ydWxlQXV0aG9yaXphdGlvbkltcG9ydDQxNCk7CisgICAgICAgICAgICBsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzA9cnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uSW1wb3J0UnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJpbXBvcnRlZE5hbWVzcGFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9pbXBvcnRlZE5hbWVzcGFjZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIkF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlQXV0aG9yaXphdGlvbkltcG9ydCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQzOjE6IGVudHJ5UnVsZVJvbGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGU9IHJ1bGVSb2xlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUm9sZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDQ6MjogKGl2X3J1bGVSb2xlPSBydWxlUm9sZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDU6MjogaXZfcnVsZVJvbGU9IHJ1bGVSb2xlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVfaW5fZW50cnlSdWxlUm9sZTQ1MCk7CisgICAgICAgICAgICBpdl9ydWxlUm9sZT1ydWxlUm9sZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJvbGU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZTQ2MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUyOjE6IHJ1bGVSb2xlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdyb2xlJyAoIChsdl9uYW1lXzFfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSBvdGhlcmx2XzI9ICd7JyAoIChsdl9yb2xlRWxlbWVudHNfM18wPSBydWxlUm9sZUVsZW1lbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUm9sZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBsdl9uYW1lXzFfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yb2xlRWxlbWVudHNfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU1OjI4OiAoIChvdGhlcmx2XzA9ICdyb2xlJyAoIChsdl9uYW1lXzFfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSBvdGhlcmx2XzI9ICd7JyAoIChsdl9yb2xlRWxlbWVudHNfM18wPSBydWxlUm9sZUVsZW1lbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU2OjE6IChvdGhlcmx2XzA9ICdyb2xlJyAoIChsdl9uYW1lXzFfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkgKSBvdGhlcmx2XzI9ICd7JyAoIChsdl9yb2xlRWxlbWVudHNfM18wPSBydWxlUm9sZUVsZW1lbnQgKSApKiBvdGhlcmx2XzQ9ICd9JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NjoxOiAob3RoZXJsdl8wPSAncm9sZScgKCAobHZfbmFtZV8xXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgb3RoZXJsdl8yPSAneycgKCAobHZfcm9sZUVsZW1lbnRzXzNfMD0gcnVsZVJvbGVFbGVtZW50ICkgKSogb3RoZXJsdl80PSAnfScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTY6Mzogb3RoZXJsdl8wPSAncm9sZScgKCAobHZfbmFtZV8xXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkgb3RoZXJsdl8yPSAneycgKCAobHZfcm9sZUVsZW1lbnRzXzNfMD0gcnVsZVJvbGVFbGVtZW50ICkgKSogb3RoZXJsdl80PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMTcsRk9MTE9XXzE3X2luX3J1bGVSb2xlNDk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0Um9sZUtleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjA6MTogKCAobHZfbmFtZV8xXzA9IHJ1bGVUUkFOU0xBVEFCTEVJRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYxOjE6IChsdl9uYW1lXzFfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYxOjE6IChsdl9uYW1lXzFfMD0gcnVsZVRSQU5TTEFUQUJMRUlEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYyOjM6IGx2X25hbWVfMV8wPSBydWxlVFJBTlNMQVRBQkxFSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQWNjZXNzKCkuZ2V0TmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVUUkFOU0xBVEFCTEVJRF9pbl9ydWxlUm9sZTUxOCk7CisgICAgICAgICAgICBsdl9uYW1lXzFfMD1ydWxlVFJBTlNMQVRBQkxFSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfbmFtZV8xXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlRSQU5TTEFUQUJMRUlEIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVJvbGU1MzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8yLCBncmFtbWFyQWNjZXNzLmdldFJvbGVBY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MjoxOiAoIChsdl9yb2xlRWxlbWVudHNfM18wPSBydWxlUm9sZUVsZW1lbnQgKSApKgorICAgICAgICAgICAgbG9vcDM6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM9MjsKKyAgICAgICAgICAgICAgICBpbnQgTEEzXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKChMQTNfMD49MTggJiYgTEEzXzA8PTIwKXx8TEEzXzA9PTI0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0Mz0xOworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODM6MTogKGx2X3JvbGVFbGVtZW50c18zXzA9IHJ1bGVSb2xlRWxlbWVudCApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODM6MTogKGx2X3JvbGVFbGVtZW50c18zXzA9IHJ1bGVSb2xlRWxlbWVudCApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg0OjM6IGx2X3JvbGVFbGVtZW50c18zXzA9IHJ1bGVSb2xlRWxlbWVudAorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJvbGVFbGVtZW50c1JvbGVFbGVtZW50UGFyc2VyUnVsZUNhbGxfM18wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRWxlbWVudF9pbl9ydWxlUm9sZTU1MSk7CisgICAgICAgICAgICAJICAgIGx2X3JvbGVFbGVtZW50c18zXzA9cnVsZVJvbGVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZVJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyb2xlRWxlbWVudHMiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yb2xlRWxlbWVudHNfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlJvbGVFbGVtZW50Iik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlUm9sZTU2NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUFjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyOjE6IGVudHJ5UnVsZVJvbGVFbGVtZW50IHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVSb2xlRWxlbWVudD0gcnVsZVJvbGVFbGVtZW50IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUm9sZUVsZW1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVJvbGVFbGVtZW50ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMzoyOiAoaXZfcnVsZVJvbGVFbGVtZW50PSBydWxlUm9sZUVsZW1lbnQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE0OjI6IGl2X3J1bGVSb2xlRWxlbWVudD0gcnVsZVJvbGVFbGVtZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRWxlbWVudF9pbl9lbnRyeVJ1bGVSb2xlRWxlbWVudDYwMCk7CisgICAgICAgICAgICBpdl9ydWxlUm9sZUVsZW1lbnQ9cnVsZVJvbGVFbGVtZW50KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUVsZW1lbnQ7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUVsZW1lbnQ2MTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUVsZW1lbnQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVFbGVtZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzIxOjE6IHJ1bGVSb2xlRWxlbWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19Sb2xlRW50aXR5XzA9IHJ1bGVSb2xlRW50aXR5IHwgdGhpc19Sb2xlQmVhbl8xPSBydWxlUm9sZUJlYW4gfCB0aGlzX1JvbGVEdG9fMj0gcnVsZVJvbGVEdG8gfCB0aGlzX1JvbGVCbGlwUHJvY2Vzc18zPSBydWxlUm9sZUJsaXBQcm9jZXNzICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlRWxlbWVudCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1JvbGVFbnRpdHlfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1JvbGVCZWFuXzEgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Sb2xlRHRvXzIgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Sb2xlQmxpcFByb2Nlc3NfMyA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNDoyODogKCAodGhpc19Sb2xlRW50aXR5XzA9IHJ1bGVSb2xlRW50aXR5IHwgdGhpc19Sb2xlQmVhbl8xPSBydWxlUm9sZUJlYW4gfCB0aGlzX1JvbGVEdG9fMj0gcnVsZVJvbGVEdG8gfCB0aGlzX1JvbGVCbGlwUHJvY2Vzc18zPSBydWxlUm9sZUJsaXBQcm9jZXNzICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjU6MTogKHRoaXNfUm9sZUVudGl0eV8wPSBydWxlUm9sZUVudGl0eSB8IHRoaXNfUm9sZUJlYW5fMT0gcnVsZVJvbGVCZWFuIHwgdGhpc19Sb2xlRHRvXzI9IHJ1bGVSb2xlRHRvIHwgdGhpc19Sb2xlQmxpcFByb2Nlc3NfMz0gcnVsZVJvbGVCbGlwUHJvY2VzcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNToxOiAodGhpc19Sb2xlRW50aXR5XzA9IHJ1bGVSb2xlRW50aXR5IHwgdGhpc19Sb2xlQmVhbl8xPSBydWxlUm9sZUJlYW4gfCB0aGlzX1JvbGVEdG9fMj0gcnVsZVJvbGVEdG8gfCB0aGlzX1JvbGVCbGlwUHJvY2Vzc18zPSBydWxlUm9sZUJsaXBQcm9jZXNzICkKKyAgICAgICAgICAgIGludCBhbHQ0PTQ7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgMTg6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyMDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0ND0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQ9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjY6NTogdGhpc19Sb2xlRW50aXR5XzA9IHJ1bGVSb2xlRW50aXR5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0Um9sZUVudGl0eVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eV9pbl9ydWxlUm9sZUVsZW1lbnQ2NTcpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1JvbGVFbnRpdHlfMD1ydWxlUm9sZUVudGl0eSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1JvbGVFbnRpdHlfMDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMzNjo1OiB0aGlzX1JvbGVCZWFuXzE9IHJ1bGVSb2xlQmVhbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudEFjY2VzcygpLmdldFJvbGVCZWFuUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlQmVhbl9pbl9ydWxlUm9sZUVsZW1lbnQ2ODQpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1JvbGVCZWFuXzE9cnVsZVJvbGVCZWFuKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUm9sZUJlYW5fMTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM0Njo1OiB0aGlzX1JvbGVEdG9fMj0gcnVsZVJvbGVEdG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlRHRvUGFyc2VyUnVsZUNhbGxfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvX2luX3J1bGVSb2xlRWxlbWVudDcxMSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUm9sZUR0b18yPXJ1bGVSb2xlRHRvKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUm9sZUR0b18yOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzU2OjU6IHRoaXNfUm9sZUJsaXBQcm9jZXNzXzM9IHJ1bGVSb2xlQmxpcFByb2Nlc3MKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKS5nZXRSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwUHJvY2Vzc19pbl9ydWxlUm9sZUVsZW1lbnQ3MzgpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1JvbGVCbGlwUHJvY2Vzc18zPXJ1bGVSb2xlQmxpcFByb2Nlc3MoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Sb2xlQmxpcFByb2Nlc3NfMzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVFbGVtZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVFbnRpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozNzI6MTogZW50cnlSdWxlUm9sZUVudGl0eSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUVudGl0eT0gcnVsZVJvbGVFbnRpdHkgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlRW50aXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlRW50aXR5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM3MzoyOiAoaXZfcnVsZVJvbGVFbnRpdHk9IHJ1bGVSb2xlRW50aXR5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM3NDoyOiBpdl9ydWxlUm9sZUVudGl0eT0gcnVsZVJvbGVFbnRpdHkgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eV9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5NzczKTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlRW50aXR5PXJ1bGVSb2xlRW50aXR5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUVudGl0eTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5NzgzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVFbnRpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVFbnRpdHkiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODE6MTogcnVsZVJvbGVFbnRpdHkgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApICkrIChvdGhlcmx2XzQ9ICd7JyAoIChsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlRW50aXR5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9lbnRpdHlBdXRob3JpemVkXzNfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbnRpdHlGZWF0dXJlc181XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODQ6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApICkrIChvdGhlcmx2XzQ9ICd7JyAoIChsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODU6MTogKCAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApICkrIChvdGhlcmx2XzQ9ICd7JyAoIChsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzg1OjE6ICggKCkgb3RoZXJsdl8xPSAnZW50aXR5JyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2VudGl0eUF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfZW50aXR5RmVhdHVyZXNfNV8wPSBydWxlUm9sZUVudGl0eUZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM4NToyOiAoKSBvdGhlcmx2XzE9ICdlbnRpdHknICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApICkrIChvdGhlcmx2XzQ9ICd7JyAoIChsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM4NToyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozODY6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0Um9sZUVudGl0eUFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwxOCxGT0xMT1dfMThfaW5fcnVsZVJvbGVFbnRpdHk4MjkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzk1OjE6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mzk2OjE6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozOTY6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjM5NzozOiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlUm9sZUVudGl0eTg0OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldEVudGl0eVJlZkxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDA4OjI6ICggKGx2X2VudGl0eUF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKworICAgICAgICAgICAgaW50IGNudDU9MDsKKyAgICAgICAgICAgIGxvb3A1OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1PTI7CisgICAgICAgICAgICAgICAgaW50IExBNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICBpZiAoICgoTEE1XzA+PTEwMCAmJiBMQTVfMDw9MTA0KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDU9MTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDA5OjE6IChsdl9lbnRpdHlBdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQwOToxOiAobHZfZW50aXR5QXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDEwOjM6IGx2X2VudGl0eUF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBY2Nlc3MoKS5nZXRFbnRpdHlBdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRW51bV9pbl9ydWxlUm9sZUVudGl0eTg3MCk7CisgICAgICAgICAgICAJICAgIGx2X2VudGl0eUF1dGhvcml6ZWRfM18wPXJ1bGVSb2xlRW51bSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZW50aXR5QXV0aG9yaXplZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VudGl0eUF1dGhvcml6ZWRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlJvbGVFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250NSA+PSAxICkgYnJlYWsgbG9vcDU7CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDUsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250NSsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDI2OjM6IChvdGhlcmx2XzQ9ICd7JyAoIChsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/CisgICAgICAgICAgICBpbnQgYWx0Nz0yOworICAgICAgICAgICAgaW50IExBN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBN18wPT0xNCkgKSB7CisgICAgICAgICAgICAgICAgYWx0Nz0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MjY6NTogb3RoZXJsdl80PSAneycgKCAobHZfZW50aXR5RmVhdHVyZXNfNV8wPSBydWxlUm9sZUVudGl0eUZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVSb2xlRW50aXR5ODg0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzQsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MzA6MTogKCAobHZfZW50aXR5RmVhdHVyZXNfNV8wPSBydWxlUm9sZUVudGl0eUZlYXR1cmUgKSApKworICAgICAgICAgICAgICAgICAgICBpbnQgY250Nj0wOworICAgICAgICAgICAgICAgICAgICBsb29wNjoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDY9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEE2XzA+PTI2ICYmIExBNl8wPD0yNykpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDY9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDYpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MzE6MTogKGx2X2VudGl0eUZlYXR1cmVzXzVfMD0gcnVsZVJvbGVFbnRpdHlGZWF0dXJlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0MzE6MTogKGx2X2VudGl0eUZlYXR1cmVzXzVfMD0gcnVsZVJvbGVFbnRpdHlGZWF0dXJlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQzMjozOiBsdl9lbnRpdHlGZWF0dXJlc181XzA9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0RW50aXR5RmVhdHVyZXNSb2xlRW50aXR5RmVhdHVyZVBhcnNlclJ1bGVDYWxsXzRfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRW50aXR5RmVhdHVyZV9pbl9ydWxlUm9sZUVudGl0eTkwNSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZW50aXR5RmVhdHVyZXNfNV8wPXJ1bGVSb2xlRW50aXR5RmVhdHVyZSgpOworCisgICAgICAgICAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZW50aXR5RmVhdHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VudGl0eUZlYXR1cmVzXzVfMCwgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlJvbGVFbnRpdHlGZWF0dXJlIik7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIGNudDYgPj0gMSApIGJyZWFrIGxvb3A2OworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbig2LCBpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNudDYrKzsKKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZVJvbGVFbnRpdHk5MTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVFbnRpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJlYW4iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NjA6MTogZW50cnlSdWxlUm9sZUJlYW4gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGVCZWFuPSBydWxlUm9sZUJlYW4gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlQmVhbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZUJlYW4gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDYxOjI6IChpdl9ydWxlUm9sZUJlYW49IHJ1bGVSb2xlQmVhbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NjI6MjogaXZfcnVsZVJvbGVCZWFuPSBydWxlUm9sZUJlYW4gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuX2luX2VudHJ5UnVsZVJvbGVCZWFuOTU2KTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlQmVhbj1ydWxlUm9sZUJlYW4oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVSb2xlQmVhbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlQmVhbjk2Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW4iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0Njk6MTogcnVsZVJvbGVCZWFuIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnYmVhbicgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSAoIChsdl9iZWFuQXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApICkrIChvdGhlcmx2XzQ9ICd7JyAoIChsdl9iZWFuRmVhdHVyZXNfNV8wPSBydWxlUm9sZUJlYW5GZWF0dXJlICkgKSsgb3RoZXJsdl82PSAnfScgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVCZWFuKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfND1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzY9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9iZWFuQXV0aG9yaXplZF8zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfYmVhbkZlYXR1cmVzXzVfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ3MjoyODogKCAoICgpIG90aGVybHZfMT0gJ2JlYW4nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfYmVhbkF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfYmVhbkZlYXR1cmVzXzVfMD0gcnVsZVJvbGVCZWFuRmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NzM6MTogKCAoKSBvdGhlcmx2XzE9ICdiZWFuJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtICkgKSsgKG90aGVybHZfND0gJ3snICggKGx2X2JlYW5GZWF0dXJlc181XzA9IHJ1bGVSb2xlQmVhbkZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ3MzoxOiAoICgpIG90aGVybHZfMT0gJ2JlYW4nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfYmVhbkF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfYmVhbkZlYXR1cmVzXzVfMD0gcnVsZVJvbGVCZWFuRmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDczOjI6ICgpIG90aGVybHZfMT0gJ2JlYW4nICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgKCAobHZfYmVhbkF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfYmVhbkZlYXR1cmVzXzVfMD0gcnVsZVJvbGVCZWFuRmVhdHVyZSApICkrIG90aGVybHZfNj0gJ30nICk/CisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ3MzoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0NzQ6NTogCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldFJvbGVCZWFuQWN0aW9uXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDE5LEZPTExPV18xOV9pbl9ydWxlUm9sZUJlYW4xMDEyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5LZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDgzOjE6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDg0OjE6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo0ODQ6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ4NTozOiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVJvbGVCZWFuMTAzMik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRCZWFuUmVmTEJlYW5Dcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk2OjI6ICggKGx2X2JlYW5BdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtICkgKSsKKyAgICAgICAgICAgIGludCBjbnQ4PTA7CisgICAgICAgICAgICBsb29wODoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0OD0yOworICAgICAgICAgICAgICAgIGludCBMQThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBOF8wPj0xMDAgJiYgTEE4XzA8PTEwNCkpICkgeworICAgICAgICAgICAgICAgICAgICBhbHQ4PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDgpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjQ5NzoxOiAobHZfYmVhbkF1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk3OjE6IChsdl9iZWFuQXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NDk4OjM6IGx2X2JlYW5BdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldEJlYW5BdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRW51bV9pbl9ydWxlUm9sZUJlYW4xMDUzKTsKKyAgICAgICAgICAgIAkgICAgbHZfYmVhbkF1dGhvcml6ZWRfM18wPXJ1bGVSb2xlRW51bSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImJlYW5BdXRob3JpemVkIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfYmVhbkF1dGhvcml6ZWRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlJvbGVFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250OCA+PSAxICkgYnJlYWsgbG9vcDg7CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDgsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250OCsrOworICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTE0OjM6IChvdGhlcmx2XzQ9ICd7JyAoIChsdl9iZWFuRmVhdHVyZXNfNV8wPSBydWxlUm9sZUJlYW5GZWF0dXJlICkgKSsgb3RoZXJsdl82PSAnfScgKT8KKyAgICAgICAgICAgIGludCBhbHQxMD0yOworICAgICAgICAgICAgaW50IExBMTBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTEwXzA9PTE0KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxMD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQxMCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTE0OjU6IG90aGVybHZfND0gJ3snICggKGx2X2JlYW5GZWF0dXJlc181XzA9IHJ1bGVSb2xlQmVhbkZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVSb2xlQmVhbjEwNjcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkFjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1MTg6MTogKCAobHZfYmVhbkZlYXR1cmVzXzVfMD0gcnVsZVJvbGVCZWFuRmVhdHVyZSApICkrCisgICAgICAgICAgICAgICAgICAgIGludCBjbnQ5PTA7CisgICAgICAgICAgICAgICAgICAgIGxvb3A5OgorICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWx0OT0yOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBOV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTlfMD49MjYgJiYgTEE5XzA8PTI3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0OT0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0OSkgeworICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUxOToxOiAobHZfYmVhbkZlYXR1cmVzXzVfMD0gcnVsZVJvbGVCZWFuRmVhdHVyZSApCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTE5OjE6IChsdl9iZWFuRmVhdHVyZXNfNV8wPSBydWxlUm9sZUJlYW5GZWF0dXJlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjUyMDozOiBsdl9iZWFuRmVhdHVyZXNfNV8wPSBydWxlUm9sZUJlYW5GZWF0dXJlCisgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQWNjZXNzKCkuZ2V0QmVhbkZlYXR1cmVzUm9sZUJlYW5GZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuRmVhdHVyZV9pbl9ydWxlUm9sZUJlYW4xMDg4KTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9iZWFuRmVhdHVyZXNfNV8wPXJ1bGVSb2xlQmVhbkZlYXR1cmUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJiZWFuRmVhdHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2JlYW5GZWF0dXJlc181XzAsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJSb2xlQmVhbkZlYXR1cmUiKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggY250OSA+PSAxICkgYnJlYWsgbG9vcDk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWFybHlFeGl0RXhjZXB0aW9uIGVlZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWFybHlFeGl0RXhjZXB0aW9uKDksIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZWVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY250OSsrOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlUm9sZUJlYW4xMTAxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzYsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUJlYW4iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUR0byIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU0ODoxOiBlbnRyeVJ1bGVSb2xlRHRvIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVSb2xlRHRvPSBydWxlUm9sZUR0byBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVEdG8oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVJvbGVEdG8gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTQ5OjI6IChpdl9ydWxlUm9sZUR0bz0gcnVsZVJvbGVEdG8gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTUwOjI6IGl2X3J1bGVSb2xlRHRvPSBydWxlUm9sZUR0byBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvX2luX2VudHJ5UnVsZVJvbGVEdG8xMTM5KTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlRHRvPXJ1bGVSb2xlRHRvKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUR0bzsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRHRvMTE0OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRHRvIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTU3OjE6IHJ1bGVSb2xlRHRvIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnZHRvJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUm9sZUR0bygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfZHRvQXV0aG9yaXplZF8zXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfZHRvRmVhdHVyZXNfNV8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTYwOjI4OiAoICggKCkgb3RoZXJsdl8xPSAnZHRvJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTYxOjE6ICggKCkgb3RoZXJsdl8xPSAnZHRvJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU2MToxOiAoICgpIG90aGVybHZfMT0gJ2R0bycgKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKSAoIChsdl9kdG9BdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtICkgKSsgKG90aGVybHZfND0gJ3snICggKGx2X2R0b0ZlYXR1cmVzXzVfMD0gcnVsZVJvbGVEdG9GZWF0dXJlICkgKSsgb3RoZXJsdl82PSAnfScgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NjE6MjogKCkgb3RoZXJsdl8xPSAnZHRvJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApICggKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKyAob3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NjE6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTYyOjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldFJvbGVEdG9BY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjAsRk9MTE9XXzIwX2luX3J1bGVSb2xlRHRvMTE5NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0tleXdvcmRfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NzE6MTogKCAob3RoZXJsdl8yPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1NzI6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjU3MjoxOiAob3RoZXJsdl8yPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTczOjM6IG90aGVybHZfMj0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVSb2xlRHRvMTIxNSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b1JlZkxEdG9Dcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTg0OjI6ICggKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKSApKworICAgICAgICAgICAgaW50IGNudDExPTA7CisgICAgICAgICAgICBsb29wMTE6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDExPTI7CisgICAgICAgICAgICAgICAgaW50IExBMTFfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoKExBMTFfMD49MTAwICYmIExBMTFfMDw9MTA0KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDExPTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDExKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1ODU6MTogKGx2X2R0b0F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUVudW0gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NTg1OjE6IChsdl9kdG9BdXRob3JpemVkXzNfMD0gcnVsZVJvbGVFbnVtICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo1ODY6MzogbHZfZHRvQXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlRW51bQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0FjY2VzcygpLmdldER0b0F1dGhvcml6ZWRSb2xlRW51bUVudW1SdWxlQ2FsbF8zXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnVtX2luX3J1bGVSb2xlRHRvMTIzNik7CisgICAgICAgICAgICAJICAgIGx2X2R0b0F1dGhvcml6ZWRfM18wPXJ1bGVSb2xlRW51bSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZHRvQXV0aG9yaXplZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2R0b0F1dGhvcml6ZWRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlJvbGVFbnVtIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGlmICggY250MTEgPj0gMSApIGJyZWFrIGxvb3AxMTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFYXJseUV4aXRFeGNlcHRpb24oMTEsIGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY250MTErKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYwMjozOiAob3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JyApPworICAgICAgICAgICAgaW50IGFsdDEzPTI7CisgICAgICAgICAgICBpbnQgTEExM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTNfMD09MTQpICkgeworICAgICAgICAgICAgICAgIGFsdDEzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDEzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDI6NTogb3RoZXJsdl80PSAneycgKCAobHZfZHRvRmVhdHVyZXNfNV8wPSBydWxlUm9sZUR0b0ZlYXR1cmUgKSApKyBvdGhlcmx2XzY9ICd9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMTQsRk9MTE9XXzE0X2luX3J1bGVSb2xlRHRvMTI1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BY2Nlc3MoKS5nZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjA2OjE6ICggKGx2X2R0b0ZlYXR1cmVzXzVfMD0gcnVsZVJvbGVEdG9GZWF0dXJlICkgKSsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNudDEyPTA7CisgICAgICAgICAgICAgICAgICAgIGxvb3AxMjoKKyAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDEyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEExMl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKChMQTEyXzA+PTI2ICYmIExBMTJfMDw9MjcpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQxMj0xOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MTIpIHsKKyAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDc6MTogKGx2X2R0b0ZlYXR1cmVzXzVfMD0gcnVsZVJvbGVEdG9GZWF0dXJlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MDc6MTogKGx2X2R0b0ZlYXR1cmVzXzVfMD0gcnVsZVJvbGVEdG9GZWF0dXJlICkKKyAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjYwODozOiBsdl9kdG9GZWF0dXJlc181XzA9IHJ1bGVSb2xlRHRvRmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0RHRvRmVhdHVyZXNSb2xlRHRvRmVhdHVyZVBhcnNlclJ1bGVDYWxsXzRfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvRmVhdHVyZV9pbl9ydWxlUm9sZUR0bzEyNzEpOworICAgICAgICAgICAgICAgICAgICAJICAgIGx2X2R0b0ZlYXR1cmVzXzVfMD1ydWxlUm9sZUR0b0ZlYXR1cmUoKTsKKworICAgICAgICAgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1J1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImR0b0ZlYXR1cmVzIiwKKyAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9kdG9GZWF0dXJlc181XzAsIAorICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJSb2xlRHRvRmVhdHVyZSIpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBjbnQxMiA+PSAxICkgYnJlYWsgbG9vcDEyOworICAgICAgICAgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVhcmx5RXhpdEV4Y2VwdGlvbiBlZWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigxMiwgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlZWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQxMisrOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDE1LEZPTExPV18xNV9pbl9ydWxlUm9sZUR0bzEyODQpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQWNjZXNzKCkuZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVEdG8iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2MzY6MTogZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzPSBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjM3OjI6IChpdl9ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3M9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2Mzg6MjogaXZfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzPSBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzX2luX2VudHJ5UnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzMTMyMik7CisgICAgICAgICAgICBpdl9ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3M9cnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3M7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUJsaXBBbGxVc2VyVGFza3MxMzMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0NToxOiBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICdhbGwnIG90aGVybHZfMj0gJ3VzZXJ0YXNrcycgKCAobHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8yPW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfYXV0aG9yaXplZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NDg6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICdhbGwnIG90aGVybHZfMj0gJ3VzZXJ0YXNrcycgKCAobHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0OToxOiAoICgpIG90aGVybHZfMT0gJ2FsbCcgb3RoZXJsdl8yPSAndXNlcnRhc2tzJyAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0OToxOiAoICgpIG90aGVybHZfMT0gJ2FsbCcgb3RoZXJsdl8yPSAndXNlcnRhc2tzJyAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY0OToyOiAoKSBvdGhlcmx2XzE9ICdhbGwnIG90aGVybHZfMj0gJ3VzZXJ0YXNrcycgKCAobHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjQ5OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjY1MDo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjEsRk9MTE9XXzIxX2luX3J1bGVSb2xlQmxpcEFsbFVzZXJUYXNrczEzNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0QWxsS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDIyLEZPTExPV18yMl9pbl9ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MxMzkwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldFVzZXJ0YXNrc0tleXdvcmRfMigpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2NjM6MTogKCAobHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY0OjE6IChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY0OjE6IChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NjY1OjM6IGx2X2F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUJsaXBVc2VyVGFza0VudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldEF1dGhvcml6ZWRSb2xlQmxpcFVzZXJUYXNrRW51bUVudW1SdWxlQ2FsbF8zXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtX2luX3J1bGVSb2xlQmxpcEFsbFVzZXJUYXNrczE0MTEpOworICAgICAgICAgICAgbHZfYXV0aG9yaXplZF8zXzA9cnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiYXV0aG9yaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9hdXRob3JpemVkXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUm9sZUJsaXBVc2VyVGFza0VudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlQmxpcFVzZXJUYXNrIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Njg5OjE6IGVudHJ5UnVsZVJvbGVCbGlwVXNlclRhc2sgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGVCbGlwVXNlclRhc2s9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZUJsaXBVc2VyVGFzayA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTA6MjogKGl2X3J1bGVSb2xlQmxpcFVzZXJUYXNrPSBydWxlUm9sZUJsaXBVc2VyVGFzayBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTE6MjogaXZfcnVsZVJvbGVCbGlwVXNlclRhc2s9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwVXNlclRhc2tfaW5fZW50cnlSdWxlUm9sZUJsaXBVc2VyVGFzazE0NDcpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVCbGlwVXNlclRhc2s9cnVsZVJvbGVCbGlwVXNlclRhc2soKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVSb2xlQmxpcFVzZXJUYXNrOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCbGlwVXNlclRhc2sxNDU3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVCbGlwVXNlclRhc2siCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVCbGlwVXNlclRhc2siCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo2OTg6MTogcnVsZVJvbGVCbGlwVXNlclRhc2sgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoKSBvdGhlcmx2XzE9ICd1c2VydGFzaycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUm9sZUJsaXBVc2VyVGFzaygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfYXV0aG9yaXplZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDE6Mjg6ICggKCAoKSBvdGhlcmx2XzE9ICd1c2VydGFzaycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzAyOjE6ICggKCkgb3RoZXJsdl8xPSAndXNlcnRhc2snICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAobHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDI6MTogKCAoKSBvdGhlcmx2XzE9ICd1c2VydGFzaycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcwMjoyOiAoKSBvdGhlcmx2XzE9ICd1c2VydGFzaycgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MDI6MjogKCkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzAzOjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFJvbGVCbGlwVXNlclRhc2tBY3Rpb25fMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMjMsRk9MTE9XXzIzX2luX3J1bGVSb2xlQmxpcFVzZXJUYXNrMTUwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFVzZXJ0YXNrS2V5d29yZF8xKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcxMjoxOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcxMzoxOiAoIHJ1bGVRdWFsaWZpZWROYW1lICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzEzOjE6ICggcnVsZVF1YWxpZmllZE5hbWUgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3MTQ6MzogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza1J1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrQWNjZXNzKCkuZ2V0VXNlclRhc2tCbGlwVXNlclRhc2tDcm9zc1JlZmVyZW5jZV8yXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVF1YWxpZmllZE5hbWVfaW5fcnVsZVJvbGVCbGlwVXNlclRhc2sxNTI2KTsKKyAgICAgICAgICAgIHJ1bGVRdWFsaWZpZWROYW1lKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjcyNzoyOiAoIChsdl9hdXRob3JpemVkXzNfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mjg6MTogKGx2X2F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUJsaXBVc2VyVGFza0VudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mjg6MTogKGx2X2F1dGhvcml6ZWRfM18wPSBydWxlUm9sZUJsaXBVc2VyVGFza0VudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Mjk6MzogbHZfYXV0aG9yaXplZF8zXzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrRW51bQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRBdXRob3JpemVkUm9sZUJsaXBVc2VyVGFza0VudW1FbnVtUnVsZUNhbGxfM18wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlQmxpcFVzZXJUYXNrRW51bV9pbl9ydWxlUm9sZUJsaXBVc2VyVGFzazE1NDcpOworICAgICAgICAgICAgbHZfYXV0aG9yaXplZF8zXzA9cnVsZVJvbGVCbGlwVXNlclRhc2tFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJhdXRob3JpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2F1dGhvcml6ZWRfM18wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJSb2xlQmxpcFVzZXJUYXNrRW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVCbGlwVXNlclRhc2siCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUJsaXBQcm9jZXNzIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzUzOjE6IGVudHJ5UnVsZVJvbGVCbGlwUHJvY2VzcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUJsaXBQcm9jZXNzPSBydWxlUm9sZUJsaXBQcm9jZXNzIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUm9sZUJsaXBQcm9jZXNzKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlQmxpcFByb2Nlc3MgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzU0OjI6IChpdl9ydWxlUm9sZUJsaXBQcm9jZXNzPSBydWxlUm9sZUJsaXBQcm9jZXNzIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc1NToyOiBpdl9ydWxlUm9sZUJsaXBQcm9jZXNzPSBydWxlUm9sZUJsaXBQcm9jZXNzIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJsaXBQcm9jZXNzX2luX2VudHJ5UnVsZVJvbGVCbGlwUHJvY2VzczE1ODMpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVCbGlwUHJvY2Vzcz1ydWxlUm9sZUJsaXBQcm9jZXNzKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUJsaXBQcm9jZXNzOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCbGlwUHJvY2VzczE1OTMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlUm9sZUJsaXBQcm9jZXNzIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlQmxpcFByb2Nlc3MiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NjI6MTogcnVsZVJvbGVCbGlwUHJvY2VzcyByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICgpIG90aGVybHZfMT0gJ3Byb2Nlc3MnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2lzJyAoIChsdl9wcm9jZXNzU3RhcnRBdXRob3JpemVkXzVfMD0gcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0gKSApICk/ICggKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApICk/ICggKGx2X3VzZXJUYXNrc183XzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrICkgKSogb3RoZXJsdl84PSAnfScgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVCbGlwUHJvY2VzcygpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl80PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2FsbFVzZXJUYXNrc182XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdXNlclRhc2tzXzdfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc2NToyODogKCAoICgpIG90aGVybHZfMT0gJ3Byb2Nlc3MnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2lzJyAoIChsdl9wcm9jZXNzU3RhcnRBdXRob3JpemVkXzVfMD0gcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0gKSApICk/ICggKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApICk/ICggKGx2X3VzZXJUYXNrc183XzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrICkgKSogb3RoZXJsdl84PSAnfScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc2NjoxOiAoICgpIG90aGVybHZfMT0gJ3Byb2Nlc3MnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2lzJyAoIChsdl9wcm9jZXNzU3RhcnRBdXRob3JpemVkXzVfMD0gcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0gKSApICk/ICggKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApICk/ICggKGx2X3VzZXJUYXNrc183XzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrICkgKSogb3RoZXJsdl84PSAnfScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3NjY6MTogKCAoKSBvdGhlcmx2XzE9ICdwcm9jZXNzJyAoIChvdGhlcmx2XzI9IFJVTEVfSUQgKSApIG90aGVybHZfMz0gJ3snIChvdGhlcmx2XzQ9ICdpcycgKCAobHZfcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZF81XzA9IHJ1bGVSb2xlQmxpcFByb2Nlc3NFbnVtICkgKSApPyAoIChsdl9hbGxVc2VyVGFza3NfNl8wPSBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgKSApPyAoIChsdl91c2VyVGFza3NfN18wPSBydWxlUm9sZUJsaXBVc2VyVGFzayApICkqIG90aGVybHZfOD0gJ30nICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzY2OjI6ICgpIG90aGVybHZfMT0gJ3Byb2Nlc3MnICggKG90aGVybHZfMj0gUlVMRV9JRCApICkgb3RoZXJsdl8zPSAneycgKG90aGVybHZfND0gJ2lzJyAoIChsdl9wcm9jZXNzU3RhcnRBdXRob3JpemVkXzVfMD0gcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW0gKSApICk/ICggKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApICk/ICggKGx2X3VzZXJUYXNrc183XzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrICkgKSogb3RoZXJsdl84PSAnfScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzY2OjI6ICgpCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc2Nzo1OiAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFJvbGVCbGlwUHJvY2Vzc0FjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwyNCxGT0xMT1dfMjRfaW5fcnVsZVJvbGVCbGlwUHJvY2VzczE2MzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFByb2Nlc3NLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc2OjE6ICggKG90aGVybHZfMj0gUlVMRV9JRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzc3OjE6IChvdGhlcmx2XzI9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3Nzc6MTogKG90aGVybHZfMj0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjc3ODozOiBvdGhlcmx2XzI9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8yPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVSb2xlQmxpcFByb2Nlc3MxNjU5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8zPShUb2tlbiltYXRjaChpbnB1dCwxNCxGT0xMT1dfMTRfaW5fcnVsZVJvbGVCbGlwUHJvY2VzczE2NzEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8zLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6NzkzOjE6IChvdGhlcmx2XzQ9ICdpcycgKCAobHZfcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZF81XzA9IHJ1bGVSb2xlQmxpcFByb2Nlc3NFbnVtICkgKSApPworICAgICAgICAgICAgaW50IGFsdDE0PTI7CisgICAgICAgICAgICBpbnQgTEExNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTRfMD09MjUpICkgeworICAgICAgICAgICAgICAgIGFsdDE0PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTM6Mzogb3RoZXJsdl80PSAnaXMnICggKGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wPSBydWxlUm9sZUJsaXBQcm9jZXNzRW51bSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDI1LEZPTExPV18yNV9pbl9ydWxlUm9sZUJsaXBQcm9jZXNzMTY4NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldElzS2V5d29yZF80XzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzk3OjE6ICggKGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wPSBydWxlUm9sZUJsaXBQcm9jZXNzRW51bSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTg6MTogKGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wPSBydWxlUm9sZUJsaXBQcm9jZXNzRW51bSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo3OTg6MTogKGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wPSBydWxlUm9sZUJsaXBQcm9jZXNzRW51bSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Nzk5OjM6IGx2X3Byb2Nlc3NTdGFydEF1dGhvcml6ZWRfNV8wPSBydWxlUm9sZUJsaXBQcm9jZXNzRW51bQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0UHJvY2Vzc1N0YXJ0QXV0aG9yaXplZFJvbGVCbGlwUHJvY2Vzc0VudW1FbnVtUnVsZUNhbGxfNF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwUHJvY2Vzc0VudW1faW5fcnVsZVJvbGVCbGlwUHJvY2VzczE3MDUpOworICAgICAgICAgICAgICAgICAgICBsdl9wcm9jZXNzU3RhcnRBdXRob3JpemVkXzVfMD1ydWxlUm9sZUJsaXBQcm9jZXNzRW51bSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc1J1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJwcm9jZXNzU3RhcnRBdXRob3JpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZF81XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiUm9sZUJsaXBQcm9jZXNzRW51bSIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgxNTo0OiAoIChsdl9hbGxVc2VyVGFza3NfNl8wPSBydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MgKSApPworICAgICAgICAgICAgaW50IGFsdDE1PTI7CisgICAgICAgICAgICBpbnQgTEExNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMTVfMD09MjEpICkgeworICAgICAgICAgICAgICAgIGFsdDE1PTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE1KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MTY6MTogKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MTY6MTogKGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODE3OjM6IGx2X2FsbFVzZXJUYXNrc182XzA9IHJ1bGVSb2xlQmxpcEFsbFVzZXJUYXNrcworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0QWxsVXNlclRhc2tzUm9sZUJsaXBBbGxVc2VyVGFza3NQYXJzZXJSdWxlQ2FsbF81XzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCbGlwQWxsVXNlclRhc2tzX2luX3J1bGVSb2xlQmxpcFByb2Nlc3MxNzI4KTsKKyAgICAgICAgICAgICAgICAgICAgbHZfYWxsVXNlclRhc2tzXzZfMD1ydWxlUm9sZUJsaXBBbGxVc2VyVGFza3MoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkiYWxsVXNlclRhc2tzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfYWxsVXNlclRhc2tzXzZfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJSb2xlQmxpcEFsbFVzZXJUYXNrcyIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgzMzozOiAoIChsdl91c2VyVGFza3NfN18wPSBydWxlUm9sZUJsaXBVc2VyVGFzayApICkqCisgICAgICAgICAgICBsb29wMTY6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDE2PTI7CisgICAgICAgICAgICAgICAgaW50IExBMTZfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEExNl8wPT0yMykgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDE2PTE7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDE2KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4MzQ6MTogKGx2X3VzZXJUYXNrc183XzA9IHJ1bGVSb2xlQmxpcFVzZXJUYXNrICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgzNDoxOiAobHZfdXNlclRhc2tzXzdfMD0gcnVsZVJvbGVCbGlwVXNlclRhc2sgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjgzNTozOiBsdl91c2VyVGFza3NfN18wPSBydWxlUm9sZUJsaXBVc2VyVGFzaworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzQWNjZXNzKCkuZ2V0VXNlclRhc2tzUm9sZUJsaXBVc2VyVGFza1BhcnNlclJ1bGVDYWxsXzZfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUJsaXBVc2VyVGFza19pbl9ydWxlUm9sZUJsaXBQcm9jZXNzMTc1MCk7CisgICAgICAgICAgICAJICAgIGx2X3VzZXJUYXNrc183XzA9cnVsZVJvbGVCbGlwVXNlclRhc2soKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFByb2Nlc3NSdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkidXNlclRhc2tzIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfdXNlclRhc2tzXzdfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJSb2xlQmxpcFVzZXJUYXNrIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworICAgICAgICAgICAgb3RoZXJsdl84PShUb2tlbiltYXRjaChpbnB1dCwxNSxGT0xMT1dfMTVfaW5fcnVsZVJvbGVCbGlwUHJvY2VzczE3NjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl84LCBncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpLmdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF83KCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlQmxpcFByb2Nlc3MiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NjM6MTogZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGVFbnRpdHlGZWF0dXJlPSBydWxlUm9sZUVudGl0eUZlYXR1cmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlRW50aXR5RmVhdHVyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZUVudGl0eUZlYXR1cmUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODY0OjI6IChpdl9ydWxlUm9sZUVudGl0eUZlYXR1cmU9IHJ1bGVSb2xlRW50aXR5RmVhdHVyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NjU6MjogaXZfcnVsZVJvbGVFbnRpdHlGZWF0dXJlPSBydWxlUm9sZUVudGl0eUZlYXR1cmUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5RmVhdHVyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnRpdHlGZWF0dXJlX2luX2VudHJ5UnVsZVJvbGVFbnRpdHlGZWF0dXJlMTc5OSk7CisgICAgICAgICAgICBpdl9ydWxlUm9sZUVudGl0eUZlYXR1cmU9cnVsZVJvbGVFbnRpdHlGZWF0dXJlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUVudGl0eUZlYXR1cmU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlUm9sZUVudGl0eUZlYXR1cmUxODA5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVFbnRpdHlGZWF0dXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRW50aXR5RmVhdHVyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjg3MjoxOiBydWxlUm9sZUVudGl0eUZlYXR1cmUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfUm9sZUVudGl0eUF0dHJpYnV0ZV8wPSBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSB8IHRoaXNfUm9sZUVudGl0eVJlZmVyZW5jZV8xPSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUm9sZUVudGl0eUZlYXR1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Sb2xlRW50aXR5QXR0cmlidXRlXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Sb2xlRW50aXR5UmVmZXJlbmNlXzEgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NzU6Mjg6ICggKHRoaXNfUm9sZUVudGl0eUF0dHJpYnV0ZV8wPSBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSB8IHRoaXNfUm9sZUVudGl0eVJlZmVyZW5jZV8xPSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6ODc2OjE6ICh0aGlzX1JvbGVFbnRpdHlBdHRyaWJ1dGVfMD0gcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgfCB0aGlzX1JvbGVFbnRpdHlSZWZlcmVuY2VfMT0gcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4NzY6MTogKHRoaXNfUm9sZUVudGl0eUF0dHJpYnV0ZV8wPSBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSB8IHRoaXNfUm9sZUVudGl0eVJlZmVyZW5jZV8xPSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSApCisgICAgICAgICAgICBpbnQgYWx0MTc9MjsKKyAgICAgICAgICAgIGludCBMQTE3XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEExN18wPT0yNikgKSB7CisgICAgICAgICAgICAgICAgYWx0MTc9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEExN18wPT0yNykgKSB7CisgICAgICAgICAgICAgICAgYWx0MTc9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMTcsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDE3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4Nzc6NTogdGhpc19Sb2xlRW50aXR5QXR0cmlidXRlXzA9IHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eUF0dHJpYnV0ZV9pbl9ydWxlUm9sZUVudGl0eUZlYXR1cmUxODU2KTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19Sb2xlRW50aXR5QXR0cmlidXRlXzA9cnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Sb2xlRW50aXR5QXR0cmlidXRlXzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo4ODc6NTogdGhpc19Sb2xlRW50aXR5UmVmZXJlbmNlXzE9IHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUVudGl0eVJlZmVyZW5jZV9pbl9ydWxlUm9sZUVudGl0eUZlYXR1cmUxODgzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19Sb2xlRW50aXR5UmVmZXJlbmNlXzE9cnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Sb2xlRW50aXR5UmVmZXJlbmNlXzE7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRW50aXR5RmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTAzOjE6IGVudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGU9IHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlUm9sZUVudGl0eUF0dHJpYnV0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MDQ6MjogKGl2X3J1bGVSb2xlRW50aXR5QXR0cmlidXRlPSBydWxlUm9sZUVudGl0eUF0dHJpYnV0ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MDU6MjogaXZfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGU9IHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGVfaW5fZW50cnlSdWxlUm9sZUVudGl0eUF0dHJpYnV0ZTE5MTgpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGU9cnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVSb2xlRW50aXR5QXR0cmlidXRlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUxOTI4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MTI6MTogcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKG90aGVybHZfMD0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlRW50aXR5QXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzA9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIEVudW1lcmF0b3IgbHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE1OjI4OiAoIChvdGhlcmx2XzA9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTE2OjE6IChvdGhlcmx2XzA9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkxNjoxOiAob3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MTY6Mzogb3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX3J1bGVSb2xlRW50aXR5QXR0cmlidXRlMTk2NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkyMDoxOiAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkyMToxOiAob3RoZXJsdl8xPSBSVUxFX0lEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTIxOjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MjI6Mzogb3RoZXJsdl8xPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUxOTg1KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjkzMzoyOiAoIChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MzQ6MTogKGx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MzQ6MTogKGx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5MzU6MzogbHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bQorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlUHJvcGVydHlFbnVtX2luX3J1bGVSb2xlRW50aXR5QXR0cmlidXRlMjAwNik7CisgICAgICAgICAgICBsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9cnVsZVJvbGVQcm9wZXJ0eUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlBdHRyaWJ1dGVSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgCQkJImVudGl0eUF0dHJpVW5hdXRob3JpemVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAJCWx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUm9sZVByb3BlcnR5RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVFbnRpdHlBdHRyaWJ1dGUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUVudGl0eVJlZmVyZW5jZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk1OToxOiBlbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlPSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTYwOjI6IChpdl9ydWxlUm9sZUVudGl0eVJlZmVyZW5jZT0gcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTYxOjI6IGl2X3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlPSBydWxlUm9sZUVudGl0eVJlZmVyZW5jZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlX2luX2VudHJ5UnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UyMDQyKTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlPXJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUVudGl0eVJlZmVyZW5jZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlMjA1Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTY4OjE6IHJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdyZWZlcmVuY2UnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVFbnRpdHlSZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzE6Mjg6ICggKG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTcyOjE6IChvdGhlcmx2XzA9ICdyZWZlcmVuY2UnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzI6MTogKG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk3MjozOiBvdGhlcmx2XzA9ICdyZWZlcmVuY2UnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzI3X2luX3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlMjA4OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldFJlZmVyZW5jZUtleXdvcmRfMCgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5NzY6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5Nzc6MTogKG90aGVybHZfMT0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjk3NzoxOiAob3RoZXJsdl8xPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTc4OjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVSb2xlRW50aXR5UmVmZXJlbmNlMjEwOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpLmdldEVudGl0eUF0dHJpQ29sTEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzo5ODk6MjogKCAobHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTkwOjE6IChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTkwOjE6IChsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6OTkxOjM6IGx2X2VudGl0eUF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZVByb3BlcnR5RW51bV9pbl9ydWxlUm9sZUVudGl0eVJlZmVyZW5jZTIxMzApOworICAgICAgICAgICAgbHZfZW50aXR5QXR0cmlVbmF1dGhvcml6ZWRfMl8wPXJ1bGVSb2xlUHJvcGVydHlFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJlbnRpdHlBdHRyaVVuYXV0aG9yaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9lbnRpdHlBdHRyaVVuYXV0aG9yaXplZF8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlJvbGVQcm9wZXJ0eUVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRW50aXR5UmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMTU6MTogZW50cnlSdWxlUm9sZUJlYW5GZWF0dXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVSb2xlQmVhbkZlYXR1cmU9IHJ1bGVSb2xlQmVhbkZlYXR1cmUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVJvbGVCZWFuRmVhdHVyZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDE2OjI6IChpdl9ydWxlUm9sZUJlYW5GZWF0dXJlPSBydWxlUm9sZUJlYW5GZWF0dXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMTc6MjogaXZfcnVsZVJvbGVCZWFuRmVhdHVyZT0gcnVsZVJvbGVCZWFuRmVhdHVyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuRmVhdHVyZV9pbl9lbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmUyMTY2KTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlQmVhbkZlYXR1cmU9cnVsZVJvbGVCZWFuRmVhdHVyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJvbGVCZWFuRmVhdHVyZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlQmVhbkZlYXR1cmUyMTc2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVCZWFuRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5GZWF0dXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTAyNDoxOiBydWxlUm9sZUJlYW5GZWF0dXJlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1JvbGVCZWFuQXR0cmlidXRlXzA9IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSB8IHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMT0gcnVsZVJvbGVCZWFuUmVmZXJlbmNlICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlQmVhbkZlYXR1cmUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19Sb2xlQmVhbkF0dHJpYnV0ZV8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMSA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjc6Mjg6ICggKHRoaXNfUm9sZUJlYW5BdHRyaWJ1dGVfMD0gcnVsZVJvbGVCZWFuQXR0cmlidXRlIHwgdGhpc19Sb2xlQmVhblJlZmVyZW5jZV8xPSBydWxlUm9sZUJlYW5SZWZlcmVuY2UgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjg6MTogKHRoaXNfUm9sZUJlYW5BdHRyaWJ1dGVfMD0gcnVsZVJvbGVCZWFuQXR0cmlidXRlIHwgdGhpc19Sb2xlQmVhblJlZmVyZW5jZV8xPSBydWxlUm9sZUJlYW5SZWZlcmVuY2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDI4OjE6ICh0aGlzX1JvbGVCZWFuQXR0cmlidXRlXzA9IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSB8IHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMT0gcnVsZVJvbGVCZWFuUmVmZXJlbmNlICkKKyAgICAgICAgICAgIGludCBhbHQxOD0yOworICAgICAgICAgICAgaW50IExBMThfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE4XzA9PTI2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE4XzA9PTI3KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOD0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxOCwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTgpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwMjk6NTogdGhpc19Sb2xlQmVhbkF0dHJpYnV0ZV8wPSBydWxlUm9sZUJlYW5BdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVCZWFuQXR0cmlidXRlX2luX3J1bGVSb2xlQmVhbkZlYXR1cmUyMjIzKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19Sb2xlQmVhbkF0dHJpYnV0ZV8wPXJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1JvbGVCZWFuQXR0cmlidXRlXzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDM5OjU6IHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMT0gcnVsZVJvbGVCZWFuUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJvbGVCZWFuUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlQmVhblJlZmVyZW5jZV9pbl9ydWxlUm9sZUJlYW5GZWF0dXJlMjI1MCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUm9sZUJlYW5SZWZlcmVuY2VfMT1ydWxlUm9sZUJlYW5SZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Sb2xlQmVhblJlZmVyZW5jZV8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUJlYW5GZWF0dXJlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA1NToxOiBlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGU9IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlQmVhbkF0dHJpYnV0ZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU2OjI6IChpdl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGU9IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDU3OjI6IGl2X3J1bGVSb2xlQmVhbkF0dHJpYnV0ZT0gcnVsZVJvbGVCZWFuQXR0cmlidXRlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlQmVhbkF0dHJpYnV0ZV9pbl9lbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZTIyODUpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVCZWFuQXR0cmlidXRlPXJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJvbGVCZWFuQXR0cmlidXRlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCZWFuQXR0cmlidXRlMjI5NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5BdHRyaWJ1dGUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDY0OjE6IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlQmVhbkF0dHJpYnV0ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8wPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBFbnVtZXJhdG9yIGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDY3OjI4OiAoIChvdGhlcmx2XzA9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9iZWFuQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNjg6MTogKG90aGVybHZfMD0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNjg6MTogKG90aGVybHZfMD0gJ3Byb3BlcnR5JyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNjg6Mzogb3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDI2LEZPTExPV18yNl9pbl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGUyMzMyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMCwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwNzI6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDczOjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDczOjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDc0OjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGUyMzUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEJlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwODU6MjogKCAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEwODY6MTogKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTA4NjoxOiAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMDg3OjM6IGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZVByb3BlcnR5RW51bV9pbl9ydWxlUm9sZUJlYW5BdHRyaWJ1dGUyMzczKTsKKyAgICAgICAgICAgIGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9cnVsZVJvbGVQcm9wZXJ0eUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJiZWFuQXR0cmlVbmF1dGhvcml6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUm9sZVByb3BlcnR5RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVCZWFuQXR0cmlidXRlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTExMToxOiBlbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUJlYW5SZWZlcmVuY2U9IHJ1bGVSb2xlQmVhblJlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlQmVhblJlZmVyZW5jZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTEyOjI6IChpdl9ydWxlUm9sZUJlYW5SZWZlcmVuY2U9IHJ1bGVSb2xlQmVhblJlZmVyZW5jZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTEzOjI6IGl2X3J1bGVSb2xlQmVhblJlZmVyZW5jZT0gcnVsZVJvbGVCZWFuUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlQmVhblJlZmVyZW5jZV9pbl9lbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZTI0MDkpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVCZWFuUmVmZXJlbmNlPXJ1bGVSb2xlQmVhblJlZmVyZW5jZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJvbGVCZWFuUmVmZXJlbmNlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVCZWFuUmVmZXJlbmNlMjQxOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlQmVhblJlZmVyZW5jZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUJlYW5SZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTIwOjE6IHJ1bGVSb2xlQmVhblJlZmVyZW5jZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAncmVmZXJlbmNlJyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlUm9sZUJlYW5SZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9iZWFuQXR0cmlVbmF1dGhvcml6ZWRfMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTEyMzoyODogKCAob3RoZXJsdl8wPSAncmVmZXJlbmNlJyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTEyNDoxOiAob3RoZXJsdl8wPSAncmVmZXJlbmNlJyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExMjQ6MTogKG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9iZWFuQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTI0OjM6IG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9iZWFuQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjcsRk9MTE9XXzI3X2luX3J1bGVSb2xlQmVhblJlZmVyZW5jZTI0NTYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExMjg6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTI5OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTI5OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTMwOjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlUm9sZUJlYW5SZWZlcmVuY2UyNDc2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldEJlYW5BdHRyaUNvbExCZWFuUmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDE6MjogKCAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNDI6MTogKGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE0MjoxOiAobHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTQzOjM6IGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZVByb3BlcnR5RW51bV9pbl9ydWxlUm9sZUJlYW5SZWZlcmVuY2UyNDk3KTsKKyAgICAgICAgICAgIGx2X2JlYW5BdHRyaVVuYXV0aG9yaXplZF8yXzA9cnVsZVJvbGVQcm9wZXJ0eUVudW0oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuUmVmZXJlbmNlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJiZWFuQXR0cmlVbmF1dGhvcml6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfYmVhbkF0dHJpVW5hdXRob3JpemVkXzJfMCwgCisgICAgICAgICAgICAgICAgICAgICAgCQkiUm9sZVByb3BlcnR5RW51bSIpOworICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVJvbGVCZWFuUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVJvbGVEdG9GZWF0dXJlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE2NzoxOiBlbnRyeVJ1bGVSb2xlRHRvRmVhdHVyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUR0b0ZlYXR1cmU9IHJ1bGVSb2xlRHRvRmVhdHVyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVEdG9GZWF0dXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlRHRvRmVhdHVyZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTY4OjI6IChpdl9ydWxlUm9sZUR0b0ZlYXR1cmU9IHJ1bGVSb2xlRHRvRmVhdHVyZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTY5OjI6IGl2X3J1bGVSb2xlRHRvRmVhdHVyZT0gcnVsZVJvbGVEdG9GZWF0dXJlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0ZlYXR1cmVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvRmVhdHVyZV9pbl9lbnRyeVJ1bGVSb2xlRHRvRmVhdHVyZTI1MzMpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVEdG9GZWF0dXJlPXJ1bGVSb2xlRHRvRmVhdHVyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVJvbGVEdG9GZWF0dXJlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVEdG9GZWF0dXJlMjU0Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvRmVhdHVyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlUm9sZUR0b0ZlYXR1cmUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTc2OjE6IHJ1bGVSb2xlRHRvRmVhdHVyZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9IHJ1bGVSb2xlRHRvQXR0cmlidXRlIHwgdGhpc19Sb2xlRHRvUmVmZXJlbmNlXzE9IHJ1bGVSb2xlRHRvUmVmZXJlbmNlICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVSb2xlRHRvRmVhdHVyZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1JvbGVEdG9BdHRyaWJ1dGVfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1JvbGVEdG9SZWZlcmVuY2VfMSA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExNzk6Mjg6ICggKHRoaXNfUm9sZUR0b0F0dHJpYnV0ZV8wPSBydWxlUm9sZUR0b0F0dHJpYnV0ZSB8IHRoaXNfUm9sZUR0b1JlZmVyZW5jZV8xPSBydWxlUm9sZUR0b1JlZmVyZW5jZSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE4MDoxOiAodGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9IHJ1bGVSb2xlRHRvQXR0cmlidXRlIHwgdGhpc19Sb2xlRHRvUmVmZXJlbmNlXzE9IHJ1bGVSb2xlRHRvUmVmZXJlbmNlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTE4MDoxOiAodGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9IHJ1bGVSb2xlRHRvQXR0cmlidXRlIHwgdGhpc19Sb2xlRHRvUmVmZXJlbmNlXzE9IHJ1bGVSb2xlRHRvUmVmZXJlbmNlICkKKyAgICAgICAgICAgIGludCBhbHQxOT0yOworICAgICAgICAgICAgaW50IExBMTlfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTE5XzA9PTI2KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOT0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoIChMQTE5XzA9PTI3KSApIHsKKyAgICAgICAgICAgICAgICBhbHQxOT0yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAxOSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoYWx0MTkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjExODE6NTogdGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9IHJ1bGVSb2xlRHRvQXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkuZ2V0Um9sZUR0b0F0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZUR0b0F0dHJpYnV0ZV9pbl9ydWxlUm9sZUR0b0ZlYXR1cmUyNTkwKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc19Sb2xlRHRvQXR0cmlidXRlXzA9cnVsZVJvbGVEdG9BdHRyaWJ1dGUoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19Sb2xlRHRvQXR0cmlidXRlXzA7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMTkxOjU6IHRoaXNfUm9sZUR0b1JlZmVyZW5jZV8xPSBydWxlUm9sZUR0b1JlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvRmVhdHVyZUFjY2VzcygpLmdldFJvbGVEdG9SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVEdG9SZWZlcmVuY2VfaW5fcnVsZVJvbGVEdG9GZWF0dXJlMjYxNyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfUm9sZUR0b1JlZmVyZW5jZV8xPXJ1bGVSb2xlRHRvUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfUm9sZUR0b1JlZmVyZW5jZV8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUR0b0ZlYXR1cmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlUm9sZUR0b0F0dHJpYnV0ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMDc6MTogZW50cnlSdWxlUm9sZUR0b0F0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlUm9sZUR0b0F0dHJpYnV0ZT0gcnVsZVJvbGVEdG9BdHRyaWJ1dGUgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVSb2xlRHRvQXR0cmlidXRlID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMDg6MjogKGl2X3J1bGVSb2xlRHRvQXR0cmlidXRlPSBydWxlUm9sZUR0b0F0dHJpYnV0ZSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjA5OjI6IGl2X3J1bGVSb2xlRHRvQXR0cmlidXRlPSBydWxlUm9sZUR0b0F0dHJpYnV0ZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVSb2xlRHRvQXR0cmlidXRlX2luX2VudHJ5UnVsZVJvbGVEdG9BdHRyaWJ1dGUyNjUyKTsKKyAgICAgICAgICAgIGl2X3J1bGVSb2xlRHRvQXR0cmlidXRlPXJ1bGVSb2xlRHRvQXR0cmlidXRlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlUm9sZUR0b0F0dHJpYnV0ZTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlMjY2Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVSb2xlRHRvQXR0cmlidXRlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVSb2xlRHRvQXR0cmlidXRlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIxNjoxOiBydWxlUm9sZUR0b0F0dHJpYnV0ZSByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAob3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVEdG9BdHRyaWJ1dGUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjE5OjI4OiAoIChvdGhlcmx2XzA9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIyMDoxOiAob3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjIwOjE6IChvdGhlcmx2XzA9ICdwcm9wZXJ0eScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMjA6Mzogb3RoZXJsdl8wPSAncHJvcGVydHknICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIG90aGVybHZfMD0oVG9rZW4pbWF0Y2goaW5wdXQsMjYsRk9MTE9XXzI2X2luX3J1bGVSb2xlRHRvQXR0cmlidXRlMjY5OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzAsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldFByb3BlcnR5S2V5d29yZF8wKCkpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMjQ6MTogKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjI1OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjI1OjE6IChvdGhlcmx2XzE9IFJVTEVfSUQgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjI2OjM6IG90aGVybHZfMT0gUlVMRV9JRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvQXR0cmlidXRlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCxSVUxFX0lELEZPTExPV19SVUxFX0lEX2luX3J1bGVSb2xlRHRvQXR0cmlidXRlMjcxOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjM3OjI6ICggKGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyMzg6MTogKGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjM4OjE6IChsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTIzOTozOiBsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVQcm9wZXJ0eUVudW1faW5fcnVsZVJvbGVEdG9BdHRyaWJ1dGUyNzQwKTsKKyAgICAgICAgICAgIGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD1ydWxlUm9sZVByb3BlcnR5RW51bSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZVJ1bGUoKSk7CisgICAgICAgICAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAJCQkiZHRvQXR0cmlVbmF1dGhvcml6ZWQiLAorICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAJCSJSb2xlUHJvcGVydHlFbnVtIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlUm9sZUR0b0F0dHJpYnV0ZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVSb2xlRHRvUmVmZXJlbmNlIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI2MzoxOiBlbnRyeVJ1bGVSb2xlRHRvUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVSb2xlRHRvUmVmZXJlbmNlPSBydWxlUm9sZUR0b1JlZmVyZW5jZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVJvbGVEdG9SZWZlcmVuY2UgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI2NDoyOiAoaXZfcnVsZVJvbGVEdG9SZWZlcmVuY2U9IHJ1bGVSb2xlRHRvUmVmZXJlbmNlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNjU6MjogaXZfcnVsZVJvbGVEdG9SZWZlcmVuY2U9IHJ1bGVSb2xlRHRvUmVmZXJlbmNlIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVJvbGVEdG9SZWZlcmVuY2VfaW5fZW50cnlSdWxlUm9sZUR0b1JlZmVyZW5jZTI3NzYpOworICAgICAgICAgICAgaXZfcnVsZVJvbGVEdG9SZWZlcmVuY2U9cnVsZVJvbGVEdG9SZWZlcmVuY2UoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVSb2xlRHRvUmVmZXJlbmNlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UyNzg2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVJvbGVEdG9SZWZlcmVuY2UiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVJvbGVEdG9SZWZlcmVuY2UiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjcyOjE6IHJ1bGVSb2xlRHRvUmVmZXJlbmNlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IChvdGhlcmx2XzA9ICdyZWZlcmVuY2UnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVJvbGVEdG9SZWZlcmVuY2UoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMD1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzE9bnVsbDsKKyAgICAgICAgRW51bWVyYXRvciBsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjc1OjI4OiAoIChvdGhlcmx2XzA9ICdyZWZlcmVuY2UnICggKG90aGVybHZfMT0gUlVMRV9JRCApICkgKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNzY6MTogKG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNzY6MTogKG90aGVybHZfMD0gJ3JlZmVyZW5jZScgKCAob3RoZXJsdl8xPSBSVUxFX0lEICkgKSAoIChsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzA9IHJ1bGVSb2xlUHJvcGVydHlFbnVtICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyNzY6Mzogb3RoZXJsdl8wPSAncmVmZXJlbmNlJyAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApICggKGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBvdGhlcmx2XzA9KFRva2VuKW1hdGNoKGlucHV0LDI3LEZPTExPV18yN19pbl9ydWxlUm9sZUR0b1JlZmVyZW5jZTI4MjMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8wLCBncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VBY2Nlc3MoKS5nZXRSZWZlcmVuY2VLZXl3b3JkXzAoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI4MDoxOiAoIChvdGhlcmx2XzE9IFJVTEVfSUQgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyODE6MTogKG90aGVybHZfMT0gUlVMRV9JRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyODE6MTogKG90aGVybHZfMT0gUlVMRV9JRCApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyODI6Mzogb3RoZXJsdl8xPSBSVUxFX0lECisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LFJVTEVfSUQsRk9MTE9XX1JVTEVfSURfaW5fcnVsZVJvbGVEdG9SZWZlcmVuY2UyODQzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RHRvQXR0cmlDb2xMRHRvUmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkpOyAKKyAgICAgICAgICAgICAgCQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyOTM6MjogKCAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTI5NDoxOiAobHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPSBydWxlUm9sZVByb3BlcnR5RW51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEyOTQ6MTogKGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMjk1OjM6IGx2X2R0b0F0dHJpVW5hdXRob3JpemVkXzJfMD0gcnVsZVJvbGVQcm9wZXJ0eUVudW0KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlUm9sZVByb3BlcnR5RW51bV9pbl9ydWxlUm9sZUR0b1JlZmVyZW5jZTI4NjQpOworICAgICAgICAgICAgbHZfZHRvQXR0cmlVbmF1dGhvcml6ZWRfMl8wPXJ1bGVSb2xlUHJvcGVydHlFbnVtKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJkdG9BdHRyaVVuYXV0aG9yaXplZCIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl9kdG9BdHRyaVVuYXV0aG9yaXplZF8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlJvbGVQcm9wZXJ0eUVudW0iKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVSb2xlRHRvUmVmZXJlbmNlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMxOToxOiBlbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzIwOjI6IChpdl9ydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ9IHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzIxOjI6IGl2X3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZD0gcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZF9pbl9lbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDI5MDEpOworICAgICAgICAgICAgaXZfcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkPXJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDI5MTIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMyODoxOiBydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiB0aGlzX1F1YWxpZmllZE5hbWVfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMzE6Mjg6ICggKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzMyOjE6ICh0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzMzI6MTogKHRoaXNfUXVhbGlmaWVkTmFtZV8wPSBydWxlUXVhbGlmaWVkTmFtZSAoa3c9ICcuJyBrdz0gJyonICk/ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTMzMzo1OiB0aGlzX1F1YWxpZmllZE5hbWVfMD0gcnVsZVF1YWxpZmllZE5hbWUgKGt3PSAnLicga3c9ICcqJyApPworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDI5NTkpOworICAgICAgICAgICAgdGhpc19RdWFsaWZpZWROYW1lXzA9cnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCWN1cnJlbnQubWVyZ2UodGhpc19RdWFsaWZpZWROYW1lXzApOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzQzOjE6IChrdz0gJy4nIGt3PSAnKicgKT8KKyAgICAgICAgICAgIGludCBhbHQyMD0yOworICAgICAgICAgICAgaW50IExBMjBfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoIChMQTIwXzA9PTI4KSApIHsKKyAgICAgICAgICAgICAgICBhbHQyMD0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyMCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM0NDoyOiBrdz0gJy4nIGt3PSAnKicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMjgsRk9MTE9XXzI4X2luX3J1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDI5NzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRGdWxsU3RvcEtleXdvcmRfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDI5LEZPTExPV18yOV9pbl9ydWxlQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQyOTkxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzFfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM2MzoxOiBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVF1YWxpZmllZE5hbWU9IHJ1bGVRdWFsaWZpZWROYW1lIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZVF1YWxpZmllZE5hbWUgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM2NDoyOiAoaXZfcnVsZVF1YWxpZmllZE5hbWU9IHJ1bGVRdWFsaWZpZWROYW1lIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzNjU6MjogaXZfcnVsZVF1YWxpZmllZE5hbWU9IHJ1bGVRdWFsaWZpZWROYW1lIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVF1YWxpZmllZE5hbWVfaW5fZW50cnlSdWxlUXVhbGlmaWVkTmFtZTMwMzQpOworICAgICAgICAgICAgaXZfcnVsZVF1YWxpZmllZE5hbWU9cnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVRdWFsaWZpZWROYW1lLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVRdWFsaWZpZWROYW1lMzA0NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVRdWFsaWZpZWROYW1lIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVRdWFsaWZpZWROYW1lIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM3MjoxOiBydWxlUXVhbGlmaWVkTmFtZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVRdWFsaWZpZWROYW1lKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHRoaXNfVmFsaWRJRF8wID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHRoaXNfVmFsaWRJRF8yID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM3NToyODogKCAodGhpc19WYWxpZElEXzA9IHJ1bGVWYWxpZElEICggKCAoICcuJyApPT5rdz0gJy4nICkgdGhpc19WYWxpZElEXzI9IHJ1bGVWYWxpZElEICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzc2OjE6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgKCAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzc2OjE6ICh0aGlzX1ZhbGlkSURfMD0gcnVsZVZhbGlkSUQgKCAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzc3OjU6IHRoaXNfVmFsaWRJRF8wPSBydWxlVmFsaWRJRCAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVZhbGlkSURfaW5fcnVsZVF1YWxpZmllZE5hbWUzMDkyKTsKKyAgICAgICAgICAgIHRoaXNfVmFsaWRJRF8wPXJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQljdXJyZW50Lm1lcmdlKHRoaXNfVmFsaWRJRF8wKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM4NzoxOiAoICggKCAnLicgKT0+a3c9ICcuJyApIHRoaXNfVmFsaWRJRF8yPSBydWxlVmFsaWRJRCApKgorICAgICAgICAgICAgbG9vcDIxOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQyMT0yOworICAgICAgICAgICAgICAgIGludCBMQTIxXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMjFfMD09MjgpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEyMV8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyMV8yPT1SVUxFX0lEKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIxXzMgPSBpbnB1dC5MQSgzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDFfSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDIxPTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQyMSkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTM4NzoyOiAoICggJy4nICk9Pmt3PSAnLicgKSB0aGlzX1ZhbGlkSURfMj0gcnVsZVZhbGlkSUQKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjEzODc6MjogKCAoICcuJyApPT5rdz0gJy4nICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxMzg3OjM6ICggJy4nICk9Pmt3PSAnLicKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMjgsRk9MTE9XXzI4X2luX3J1bGVRdWFsaWZpZWROYW1lMzEyMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAJICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0RnVsbFN0b3BLZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkuZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSgpKTsgCisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX3J1bGVRdWFsaWZpZWROYW1lMzE0Myk7CisgICAgICAgICAgICAJICAgIHRoaXNfVmFsaWRJRF8yPXJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCWN1cnJlbnQubWVyZ2UodGhpc19WYWxpZElEXzIpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVF1YWxpZmllZE5hbWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVmFsaWRJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0MTQ6MTogZW50cnlSdWxlVmFsaWRJRCByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVWYWxpZElEPSBydWxlVmFsaWRJRCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVWYWxpZElEID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0MTU6MjogKGl2X3J1bGVWYWxpZElEPSBydWxlVmFsaWRJRCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDE2OjI6IGl2X3J1bGVWYWxpZElEPSBydWxlVmFsaWRJRCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFZhbGlkSURSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVWYWxpZElEX2luX2VudHJ5UnVsZVZhbGlkSUQzMTkxKTsKKyAgICAgICAgICAgIGl2X3J1bGVWYWxpZElEPXJ1bGVWYWxpZElEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlVmFsaWRJRC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlVmFsaWRJRDMyMDIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlVmFsaWRJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVmFsaWRJRCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0MjM6MTogcnVsZVZhbGlkSUQgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogdGhpc19JRF8wPSBSVUxFX0lEIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlVmFsaWRJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4gdGhpc19JRF8wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDI2OjI4OiAodGhpc19JRF8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQyNzo1OiB0aGlzX0lEXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfSURfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlVmFsaWRJRDMyNDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJY3VycmVudC5tZXJnZSh0aGlzX0lEXzApOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUodGhpc19JRF8wLCBncmFtbWFyQWNjZXNzLmdldFZhbGlkSURBY2Nlc3MoKS5nZXRJRFRlcm1pbmFsUnVsZUNhbGwoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVZhbGlkSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlVFJBTlNMQVRBQkxFSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDQyOjE6IGVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZVRSQU5TTEFUQUJMRUlEKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZVRSQU5TTEFUQUJMRUlEID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NDM6MjogKGl2X3J1bGVUUkFOU0xBVEFCTEVJRD0gcnVsZVRSQU5TTEFUQUJMRUlEIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NDQ6MjogaXZfcnVsZVRSQU5TTEFUQUJMRUlEPSBydWxlVFJBTlNMQVRBQkxFSUQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVRSQU5TTEFUQUJMRUlEX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEMzI4Nik7CisgICAgICAgICAgICBpdl9ydWxlVFJBTlNMQVRBQkxFSUQ9cnVsZVRSQU5TTEFUQUJMRUlEKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlVFJBTlNMQVRBQkxFSUQuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVRSQU5TTEFUQUJMRUlEMzI5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVUUkFOU0xBVEFCTEVJRCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlVFJBTlNMQVRBQkxFSUQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDUxOjE6IHJ1bGVUUkFOU0xBVEFCTEVJRCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiB0aGlzX0lEXzA9IFJVTEVfSUQgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVUUkFOU0xBVEFCTEVJRCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4gdGhpc19JRF8wPW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDU0OjI4OiAodGhpc19JRF8wPSBSVUxFX0lEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ1NTo1OiB0aGlzX0lEXzA9IFJVTEVfSUQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHRoaXNfSURfMD0oVG9rZW4pbWF0Y2goaW5wdXQsUlVMRV9JRCxGT0xMT1dfUlVMRV9JRF9pbl9ydWxlVFJBTlNMQVRBQkxFSUQzMzM2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAJCWN1cnJlbnQubWVyZ2UodGhpc19JRF8wKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKHRoaXNfSURfMCwgZ3JhbW1hckFjY2Vzcy5nZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldElEVGVybWluYWxSdWxlQ2FsbCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlVFJBTlNMQVRBQkxFSUQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDcwOjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NzE6MjogKGl2X3J1bGVYQW5ub3RhdGlvbj0gcnVsZVhBbm5vdGF0aW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0NzI6MjogaXZfcnVsZVhBbm5vdGF0aW9uPSBydWxlWEFubm90YXRpb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uMzM4MCk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb249cnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb24zMzkwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0Nzk6MTogcnVsZVhBbm5vdGF0aW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCkgb3RoZXJsdl8xPSAnQCcgKCAoIHJ1bGVRdWFsaWZpZWROYW1lICkgKSAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPyApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIFRva2VuIG90aGVybHZfMT1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzM9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl81PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOD1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50VmFsdWVQYWlyc182XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdmFsdWVfN18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MjoyODogKCAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0ODM6MTogKCAoKSBvdGhlcmx2XzE9ICdAJyAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApICggKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApICggKCAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSAob3RoZXJsdl81PSAnLCcgKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKSogKSB8ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApICk/IG90aGVybHZfOD0gJyknICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MzoxOiAoICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8gKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDgzOjI6ICgpIG90aGVybHZfMT0gJ0AnICggKCBydWxlUXVhbGlmaWVkTmFtZSApICkgKCAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScgKT8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ4MzoyOiAoKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNDg0OjU6IAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gZm9yY2VDcmVhdGVNb2RlbEVsZW1lbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbkFjdGlvbl8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3RoZXJsdl8xPShUb2tlbiltYXRjaChpbnB1dCwzMCxGT0xMT1dfMzBfaW5fcnVsZVhBbm5vdGF0aW9uMzQzNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tZXJjaWFsQXRLZXl3b3JkXzEoKSk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTQ5MzoxOiAoICggcnVsZVF1YWxpZmllZE5hbWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0OTQ6MTogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0OTQ6MTogKCBydWxlUXVhbGlmaWVkTmFtZSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE0OTU6MzogcnVsZVF1YWxpZmllZE5hbWUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRBbm5vdGF0aW9uVHlwZUp2bUFubm90YXRpb25UeXBlQ3Jvc3NSZWZlcmVuY2VfMl8wKCkpOyAKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVRdWFsaWZpZWROYW1lX2luX3J1bGVYQW5ub3RhdGlvbjM0NTkpOworICAgICAgICAgICAgcnVsZVF1YWxpZmllZE5hbWUoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUwODoyOiAoICggKCAnKCcgKT0+b3RoZXJsdl8zPSAnKCcgKSAoICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkgfCAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKSApPyBvdGhlcmx2Xzg9ICcpJyApPworICAgICAgICAgICAgaW50IGFsdDI0PTI7CisgICAgICAgICAgICBpbnQgTEEyNF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMjRfMD09MzEpICYmIChzeW5wcmVkMl9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkpIHsKKyAgICAgICAgICAgICAgICBhbHQyND0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQyNCkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUwODozOiAoICggJygnICk9Pm90aGVybHZfMz0gJygnICkgKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8gb3RoZXJsdl84PSAnKScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MDg6MzogKCAoICcoJyApPT5vdGhlcmx2XzM9ICcoJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUwODo0OiAoICcoJyApPT5vdGhlcmx2XzM9ICcoJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMz0oVG9rZW4pbWF0Y2goaW5wdXQsMzEsRk9MTE9XXzMxX2luX3J1bGVYQW5ub3RhdGlvbjM0ODApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMywgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MTM6MjogKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApIChvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKSApKiApIHwgKCAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApICkgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDIzPTM7CisgICAgICAgICAgICAgICAgICAgIGFsdDIzID0gZGZhMjMucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTEzOjM6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTEzOjM6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MTM6NDogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkgKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUxMzo0OiAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUxMzo1OiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzRfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUxOToxOiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MjA6MzogbHZfZWxlbWVudFZhbHVlUGFpcnNfNF8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uQWNjZXNzKCkuZ2V0RWxlbWVudFZhbHVlUGFpcnNYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJQYXJzZXJSdWxlQ2FsbF8zXzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9pbl9ydWxlWEFubm90YXRpb24zNTI0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50VmFsdWVQYWlyc180XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImVsZW1lbnRWYWx1ZVBhaXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9lbGVtZW50VmFsdWVQYWlyc180XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1MzY6MjogKG90aGVybHZfNT0gJywnICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+IChsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDIyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDIyPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTIyXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTIyXzA9PTMyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDIyPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTUzNjo0OiBvdGhlcmx2XzU9ICcsJyAoICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAobHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl81PShUb2tlbiltYXRjaChpbnB1dCwzMixGT0xMT1dfMzJfaW5fcnVsZVhBbm5vdGF0aW9uMzUzNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfM18xXzBfMV8wKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1NDA6MTogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU0MDoyOiAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1NDY6MTogKGx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1NDc6MzogbHZfZWxlbWVudFZhbHVlUGFpcnNfNl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRFbGVtZW50VmFsdWVQYWlyc1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclBhcnNlclJ1bGVDYWxsXzNfMV8wXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJfaW5fcnVsZVhBbm5vdGF0aW9uMzU3OCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50VmFsdWVQYWlyc182XzA9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25SdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRWYWx1ZVBhaXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRWYWx1ZVBhaXJzXzZfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AyMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTY0OjY6ICggKGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU2NDo2OiAoIChsdl92YWx1ZV83XzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU2NToxOiAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTU2NToxOiAobHZfdmFsdWVfN18wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTY2OjM6IGx2X3ZhbHVlXzdfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRWYWx1ZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RQYXJzZXJSdWxlQ2FsbF8zXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0X2luX3J1bGVYQW5ub3RhdGlvbjM2MDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx2X3ZhbHVlXzdfMD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJInZhbHVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl92YWx1ZV83XzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfOD0oVG9rZW4pbWF0Y2goaW5wdXQsMzMsRk9MTE9XXzMzX2luX3J1bGVYQW5ub3RhdGlvbjM2MjIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOCwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1OTQ6MTogZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNTk1OjI6IChpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE1OTY6MjogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcj0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIzNjYwKTsKKyAgICAgICAgICAgIGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXI9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIzNjcwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYwMzoxOiBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIEVPYmplY3QgbHZfdmFsdWVfMl8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYwNjoyODogKCAoICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjA3OjE6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjA3OjE6ICggKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKSAoIChsdl92YWx1ZV8yXzA9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjA3OjI6ICggKCAoICggKCBydWxlVmFsaWRJRCApICkgJz0nICkgKT0+ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApICkgKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MDc6MjogKCAoICggKCAoIHJ1bGVWYWxpZElEICkgKSAnPScgKSApPT4gKCAoICggcnVsZVZhbGlkSUQgKSApIG90aGVybHZfMT0gJz0nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjA3OjM6ICggKCAoICggcnVsZVZhbGlkSUQgKSApICc9JyApICk9PiAoICggKCBydWxlVmFsaWRJRCApICkgb3RoZXJsdl8xPSAnPScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjEyOjU6ICggKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MTI6NjogKCAoIHJ1bGVWYWxpZElEICkgKSBvdGhlcmx2XzE9ICc9JworICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjEyOjY6ICggKCBydWxlVmFsaWRJRCApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYxMzoxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYxMzoxOiAoIHJ1bGVWYWxpZElEICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYxNDozOiBydWxlVmFsaWRJRAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJSdWxlKCkpOworICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0RWxlbWVudEp2bU9wZXJhdGlvbkNyb3NzUmVmZXJlbmNlXzBfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVZhbGlkSURfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjM3NDApOworICAgICAgICAgICAgcnVsZVZhbGlkSUQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMzQsRk9MTE9XXzM0X2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIzNzUyKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduS2V5d29yZF8wXzBfMSgpKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MzE6MzogKCAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2MzI6MTogKGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTYzMjoxOiAobHZfdmFsdWVfMl8wPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjMzOjM6IGx2X3ZhbHVlXzJfMD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkuZ2V0VmFsdWVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjM3NzUpOworICAgICAgICAgICAgbHZfdmFsdWVfMl8wPXJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpKTsKKyAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgICAgICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgCQlsdl92YWx1ZV8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgIAkJIlhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIik7CisgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjU3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q9IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0IEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjU4OjI6IChpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY1OToyOiBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdF9pbl9lbnRyeVJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0MzgxMSk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdD1ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDM4MjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NjY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdCgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfOT1udWxsOworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzNfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9lbGVtZW50c181XzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzEwXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjY5OjI4OiAoICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8ICh0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/ICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NzA6MTogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NzA6MTogKCAoICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkgKCAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKiApPyBvdGhlcmx2XzY9ICddJyApIHwgKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKSApCisgICAgICAgICAgICBpbnQgYWx0Mjk9MjsKKyAgICAgICAgICAgIGFsdDI5ID0gZGZhMjkucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDI5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjcwOjI6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NzA6MjogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2NzA6MzogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjcwOjM6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjcwOjQ6ICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3Mzo1OiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjczOjY6ICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjczOjY6ICgpCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY3NDo1OiAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEFjdGlvbl8wXzBfMF8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG90aGVybHZfMT0oVG9rZW4pbWF0Y2goaW5wdXQsMzUsRk9MTE9XXzM1X2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0Mzg4Nik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl8xLCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDM2LEZPTExPV18zNl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDM4OTgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0TGVmdFNxdWFyZUJyYWNrZXRLZXl3b3JkXzBfMF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY4NzozOiAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQyNj0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEyNl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoKExBMjZfMD49UlVMRV9JRCAmJiBMQTI2XzA8PVJVTEVfREVDSU1BTCl8fExBMjZfMD09MTR8fExBMjZfMD09MTZ8fChMQTI2XzA+PTMwICYmIExBMjZfMDw9MzEpfHwoTEEyNl8wPj0zNSAmJiBMQTI2XzA8PTM2KXx8TEEyNl8wPT00M3x8KExBMjZfMD49NTkgJiYgTEEyNl8wPD02MCl8fExBMjZfMD09NjR8fExBMjZfMD09NzJ8fExBMjZfMD09NzR8fChMQTI2XzA+PTc4ICYmIExBMjZfMDw9ODApfHwoTEEyNl8wPj04MyAmJiBMQTI2XzA8PTk0KXx8TEEyNl8wPT05NikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyNj0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjg3OjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTY4Nzo0OiAoIChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE2ODg6MTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjg4OjE6IChsdl9lbGVtZW50c18zXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNjg5OjM6IGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QzOTIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9lbGVtZW50c18zXzA9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJlbGVtZW50cyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfM18wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MDU6MjogKG90aGVybHZfND0gJywnICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AyNToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyNT0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyNV8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyNV8wPT0zMikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyNT0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MDU6NDogb3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBvdGhlcmx2XzQ9KFRva2VuKW1hdGNoKGlucHV0LDMyLEZPTExPV18zMl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDM5MzUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRDb21tYUtleXdvcmRfMF8xXzFfMCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzA5OjE6ICggKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzEwOjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MTA6MTogKGx2X2VsZW1lbnRzXzVfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTcxMTozOiBsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDM5NTYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfNV8wLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBicmVhayBsb29wMjU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzY9KFRva2VuKW1hdGNoKGlucHV0LDM3LEZPTExPV18zN19pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDM5NzIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfNiwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3MzI6NjogKHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICggKCkgKG90aGVybHZfOT0gJywnICggKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSsgKT8gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczMjo2OiAodGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKCAoKSAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKyApPyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTczMzo1OiB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdDQwMDIpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc0MToxOiAoICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQyOD0yOworICAgICAgICAgICAgICAgICAgICBpbnQgTEEyOF8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyOF8wPT0zMikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQyOD0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MjgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzQxOjI6ICgpIChvdGhlcmx2Xzk9ICcsJyAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc0MToyOiAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc0Mjo1OiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kQWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc0NzoyOiAob3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbnQyNz0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AyNzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbHQyNz0yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEEyN18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEEyN18wPT0zMikgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQyNz0xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDI3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NDc6NDogb3RoZXJsdl85PSAnLCcgKCAobHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgb3RoZXJsdl85PShUb2tlbiltYXRjaChpbnB1dCwzMixGT0xMT1dfMzJfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3Q0MDI0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfOSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzFfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc1MToxOiAoIChsdl9lbGVtZW50c18xMF8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NTI6MTogKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NTI6MTogKGx2X2VsZW1lbnRzXzEwXzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3NTM6MzogbHZfZWxlbWVudHNfMTBfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8xXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0NDA0NSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBsdl9lbGVtZW50c18xMF8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkiZWxlbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfZWxlbWVudHNfMTBfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKCBjbnQyNyA+PSAxICkgYnJlYWsgbG9vcDI3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFYXJseUV4aXRFeGNlcHRpb24gZWVlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVhcmx5RXhpdEV4Y2VwdGlvbigyNywgaW5wdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVlZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnQyNysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzc3OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3Nzg6MjogKGl2X3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZT0gcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3Nzk6MjogaXZfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlPSBydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNDA4Nik7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU9cnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU0MDk2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3ODY6MTogcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgVG9rZW4gb3RoZXJsdl8xPW51bGw7CisgICAgICAgIFRva2VuIG90aGVybHZfMj1udWxsOworICAgICAgICBUb2tlbiBvdGhlcmx2XzQ9bnVsbDsKKyAgICAgICAgVG9rZW4gb3RoZXJsdl82PW51bGw7CisgICAgICAgIEVPYmplY3QgbHZfZWxlbWVudHNfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X2VsZW1lbnRzXzVfMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzcgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzg5OjI4OiAoICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkwOjE6ICggKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKSB8IHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc5MDoxOiAoICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkgfCB0aGlzX1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uXzc9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICBpbnQgYWx0MzI9MjsKKyAgICAgICAgICAgIGFsdDMyID0gZGZhMzIucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMyKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkwOjI6ICggKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3OTA6MjogKCAoICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKSApICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8gb3RoZXJsdl82PSAnXScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE3OTA6MzogKCAoICggKCkgJyMnICdbJyApICk9PiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkgKSAoICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKSAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqICk/IG90aGVybHZfNj0gJ10nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkwOjM6ICggKCAoICgpICcjJyAnWycgKSApPT4gKCAoKSBvdGhlcmx2XzE9ICcjJyBvdGhlcmx2XzI9ICdbJyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkwOjQ6ICggKCAoKSAnIycgJ1snICkgKT0+ICggKCkgb3RoZXJsdl8xPSAnIycgb3RoZXJsdl8yPSAnWycgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc5Mzo1OiAoICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkzOjY6ICgpIG90aGVybHZfMT0gJyMnIG90aGVybHZfMj0gJ1snCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxNzkzOjY6ICgpCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTc5NDo1OiAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxBY3Rpb25fMF8wXzBfMCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzE9KFRva2VuKW1hdGNoKGlucHV0LDM1LEZPTExPV18zNV9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU0MTYxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzEsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXROdW1iZXJTaWduS2V5d29yZF8wXzBfMF8xKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvdGhlcmx2XzI9KFRva2VuKW1hdGNoKGlucHV0LDM2LEZPTExPV18zNl9pbl9ydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWU0MTczKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRMZWZ0U3F1YXJlQnJhY2tldEtleXdvcmRfMF8wXzBfMigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODA3OjM6ICggKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSogKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDMxPTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTMxXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoICgoTEEzMV8wPj1SVUxFX0lEICYmIExBMzFfMDw9UlVMRV9ERUNJTUFMKXx8TEEzMV8wPT0xNHx8TEEzMV8wPT0xNnx8KExBMzFfMD49MzAgJiYgTEEzMV8wPD0zMSl8fChMQTMxXzA+PTM1ICYmIExBMzFfMDw9MzYpfHxMQTMxXzA9PTQzfHwoTEEzMV8wPj01OSAmJiBMQTMxXzA8PTYwKXx8TEEzMV8wPT02NHx8TEEzMV8wPT03Mnx8TEEzMV8wPT03NHx8KExBMzFfMD49NzggJiYgTEEzMV8wPD04MCl8fChMQTMxXzA+PTgzICYmIExBMzFfMDw9OTQpfHxMQTMxXzA9PTk2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMxPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MDc6NDogKCAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApIChvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODA3OjQ6ICggKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgwODoxOiAobHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MDg6MTogKGx2X2VsZW1lbnRzXzNfMD0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MDk6MzogbHZfZWxlbWVudHNfM18wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRFbGVtZW50c1hBbm5vdGF0aW9uT3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMF8xXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNDE5Nyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHZfZWxlbWVudHNfM18wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlhZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlsdl9lbGVtZW50c18zXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgyNToyOiAob3RoZXJsdl80PSAnLCcgKCAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcDMwOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsdDMwPTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBMQTMwXzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTMwXzA9PTMyKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDMwPTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0MzApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgyNTo0OiBvdGhlcmx2XzQ9ICcsJyAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIG90aGVybHZfND0oVG9rZW4pbWF0Y2goaW5wdXQsMzIsRk9MTE9XXzMyX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTQyMTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl80LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0Q29tbWFLZXl3b3JkXzBfMV8xXzAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgyOToxOiAoIChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTgzMDoxOiAobHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODMwOjE6IChsdl9lbGVtZW50c181XzA9IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4MzE6MzogbHZfZWxlbWVudHNfNV8wPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpLmdldEVsZW1lbnRzWEFubm90YXRpb25PckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wXzFfMV8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX3J1bGVYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZTQyMzEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgbHZfZWxlbWVudHNfNV8wPXJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAJCWFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJImVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X2VsZW1lbnRzXzVfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFubm90YXRpb25PckV4cHJlc3Npb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDMwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJsdl82PShUb2tlbiltYXRjaChpbnB1dCwzNyxGT0xMT1dfMzdfaW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNDI0Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAJbmV3TGVhZk5vZGUob3RoZXJsdl82LCBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlQWNjZXNzKCkuZ2V0UmlnaHRTcXVhcmVCcmFja2V0S2V5d29yZF8wXzIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NTM6NTogdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83PSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlNDI3Nik7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfWEFubm90YXRpb25PckV4cHJlc3Npb25fNz1ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbl83OyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25FbGVtZW50VmFsdWUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODY5OjE6IGVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzA6MjogKGl2X3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbj0gcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4NzE6MjogaXZfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uPSBydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uNDMxMSk7CisgICAgICAgICAgICBpdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb249cnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFubm90YXRpb25PckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFubm90YXRpb25PckV4cHJlc3Npb240MzIxKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4Nzg6MTogcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hBbm5vdGF0aW9uXzA9IHJ1bGVYQW5ub3RhdGlvbiB8IHRoaXNfWEV4cHJlc3Npb25fMT0gcnVsZVhFeHByZXNzaW9uICkgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IHJ1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbm5vdGF0aW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YRXhwcmVzc2lvbl8xID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg4MToyODogKCAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTg4MjoxOiAodGhpc19YQW5ub3RhdGlvbl8wPSBydWxlWEFubm90YXRpb24gfCB0aGlzX1hFeHByZXNzaW9uXzE9IHJ1bGVYRXhwcmVzc2lvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4ODI6MTogKHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uIHwgdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24gKQorICAgICAgICAgICAgaW50IGFsdDMzPTI7CisgICAgICAgICAgICBpbnQgTEEzM18wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgIGlmICggKExBMzNfMD09MzApICkgeworICAgICAgICAgICAgICAgIGFsdDMzPTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICggKChMQTMzXzA+PVJVTEVfSUQgJiYgTEEzM18wPD1SVUxFX0RFQ0lNQUwpfHxMQTMzXzA9PTE0fHxMQTMzXzA9PTE2fHxMQTMzXzA9PTMxfHwoTEEzM18wPj0zNSAmJiBMQTMzXzA8PTM2KXx8TEEzM18wPT00M3x8KExBMzNfMD49NTkgJiYgTEEzM18wPD02MCl8fExBMzNfMD09NjR8fExBMzNfMD09NzJ8fExBMzNfMD09NzR8fChMQTMzXzA+PTc4ICYmIExBMzNfMDw9ODApfHwoTEEzM18wPj04MyAmJiBMQTMzXzA8PTk0KXx8TEEzM18wPT05NikgKSB7CisgICAgICAgICAgICAgICAgYWx0MzM9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzMsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDMzKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxODgzOjU6IHRoaXNfWEFubm90YXRpb25fMD0gcnVsZVhBbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFubm90YXRpb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbm5vdGF0aW9uX2luX3J1bGVYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbjQzNjgpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hBbm5vdGF0aW9uXzA9cnVsZVhBbm5vdGF0aW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFubm90YXRpb25fMDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE4OTM6NTogdGhpc19YRXhwcmVzc2lvbl8xPSBydWxlWEV4cHJlc3Npb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEV4cHJlc3Npb25faW5fcnVsZVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uNDM5NSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfWEV4cHJlc3Npb25fMT1ydWxlWEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YRXhwcmVzc2lvbl8xOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFubm90YXRpb25PckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTA5OjE6IGVudHJ5UnVsZVhFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYRXhwcmVzc2lvbj0gcnVsZVhFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MTA6MjogKGl2X3J1bGVYRXhwcmVzc2lvbj0gcnVsZVhFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MTE6MjogaXZfcnVsZVhFeHByZXNzaW9uPSBydWxlWEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhFeHByZXNzaW9uNDQzMCk7CisgICAgICAgICAgICBpdl9ydWxlWEV4cHJlc3Npb249cnVsZVhFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEV4cHJlc3Npb240NDQwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5MTg6MTogcnVsZVhFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IHRoaXNfWEFzc2lnbm1lbnRfMD0gcnVsZVhBc3NpZ25tZW50IDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgdGhpc19YQXNzaWdubWVudF8wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkyMToyODogKHRoaXNfWEFzc2lnbm1lbnRfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkyMzo1OiB0aGlzX1hBc3NpZ25tZW50XzA9IHJ1bGVYQXNzaWdubWVudAorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQXNzaWdubWVudFBhcnNlclJ1bGVDYWxsKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBc3NpZ25tZW50X2luX3J1bGVYRXhwcmVzc2lvbjQ0ODYpOworICAgICAgICAgICAgdGhpc19YQXNzaWdubWVudF8wPXJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFzc2lnbm1lbnRfMDsgCisgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBc3NpZ25tZW50IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTkzOToxOiBlbnRyeVJ1bGVYQXNzaWdubWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEFzc2lnbm1lbnQ9IHJ1bGVYQXNzaWdubWVudCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhBc3NpZ25tZW50KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYQXNzaWdubWVudCA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTQwOjI6IChpdl9ydWxlWEFzc2lnbm1lbnQ9IHJ1bGVYQXNzaWdubWVudCBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTQxOjI6IGl2X3J1bGVYQXNzaWdubWVudD0gcnVsZVhBc3NpZ25tZW50IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9lbnRyeVJ1bGVYQXNzaWdubWVudDQ1MjApOworICAgICAgICAgICAgaXZfcnVsZVhBc3NpZ25tZW50PXJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBc3NpZ25tZW50OyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhBc3NpZ25tZW50NDUzMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYQXNzaWdubWVudCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFzc2lnbm1lbnQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTQ4OjE6IHJ1bGVYQXNzaWdubWVudCByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFzc2lnbm1lbnQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdmFsdWVfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWE9yRXhwcmVzc2lvbl80ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF83XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTUxOjI4OiAoICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTUyOjE6ICggKCAoKSAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApIHJ1bGVPcFNpbmdsZUFzc2lnbiAoIChsdl92YWx1ZV8zXzA9IHJ1bGVYQXNzaWdubWVudCApICkgKSB8ICh0aGlzX1hPckV4cHJlc3Npb25fND0gcnVsZVhPckV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApPyApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1MjoxOiAoICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkgfCAodGhpc19YT3JFeHByZXNzaW9uXzQ9IHJ1bGVYT3JFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkgKT8gKSApCisgICAgICAgICAgICBpbnQgYWx0MzU9MjsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSBSVUxFX0lEOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzE9PTM0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM1XzE9PUVPRnx8KExBMzVfMT49UlVMRV9JRCAmJiBMQTM1XzE8PVJVTEVfREVDSU1BTCl8fChMQTM1XzE+PTE0ICYmIExBMzVfMTw9MTYpfHwoTEEzNV8xPj0yOCAmJiBMQTM1XzE8PTI5KXx8KExBMzVfMT49MzEgJiYgTEEzNV8xPD0zMyl8fChMQTM1XzE+PTM1ICYmIExBMzVfMTw9NjkpfHwoTEEzNV8xPj03MSAmJiBMQTM1XzE8PTk3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzUsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDgzOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzI9PUVPRnx8KExBMzVfMj49UlVMRV9JRCAmJiBMQTM1XzI8PVJVTEVfREVDSU1BTCl8fChMQTM1XzI+PTE0ICYmIExBMzVfMjw9MTYpfHwoTEEzNV8yPj0yOCAmJiBMQTM1XzI8PTI5KXx8KExBMzVfMj49MzEgJiYgTEEzNV8yPD0zMyl8fChMQTM1XzI+PTM1ICYmIExBMzVfMjw9NjkpfHwoTEEzNV8yPj03MSAmJiBMQTM1XzI8PTk3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzNV8yPT0zNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzUsIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzM9PUVPRnx8KExBMzVfMz49UlVMRV9JRCAmJiBMQTM1XzM8PVJVTEVfREVDSU1BTCl8fChMQTM1XzM+PTE0ICYmIExBMzVfMzw9MTYpfHwoTEEzNV8zPj0yOCAmJiBMQTM1XzM8PTI5KXx8KExBMzVfMz49MzEgJiYgTEEzNV8zPD0zMyl8fChMQTM1XzM+PTM1ICYmIExBMzVfMzw9NjkpfHwoTEEzNV8zPj03MSAmJiBMQTM1XzM8PTk3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzNV8zPT0zNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzUsIDMsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE2OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzQ9PTM0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgYWx0MzU9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTM1XzQ9PUVPRnx8KExBMzVfND49UlVMRV9JRCAmJiBMQTM1XzQ8PVJVTEVfREVDSU1BTCl8fChMQTM1XzQ+PTE0ICYmIExBMzVfNDw9MTYpfHwoTEEzNV80Pj0yOCAmJiBMQTM1XzQ8PTI5KXx8KExBMzVfND49MzEgJiYgTEEzNV80PD0zMyl8fChMQTM1XzQ+PTM1ICYmIExBMzVfNDw9NjkpfHwoTEEzNV80Pj03MSAmJiBMQTM1XzQ8PTk3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzUsIDQsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDg1OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgTEEzNV81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICBpZiAoIChMQTM1XzU9PUVPRnx8KExBMzVfNT49UlVMRV9JRCAmJiBMQTM1XzU8PVJVTEVfREVDSU1BTCl8fChMQTM1XzU+PTE0ICYmIExBMzVfNTw9MTYpfHwoTEEzNV81Pj0yOCAmJiBMQTM1XzU8PTI5KXx8KExBMzVfNT49MzEgJiYgTEEzNV81PD0zMyl8fChMQTM1XzU+PTM1ICYmIExBMzVfNTw9NjkpfHwoTEEzNV81Pj03MSAmJiBMQTM1XzU8PTk3KSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEEzNV81PT0zNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDM1PTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgMzUsIDUsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfU1RSSU5HOgorICAgICAgICAgICAgY2FzZSBSVUxFX0hFWDoKKyAgICAgICAgICAgIGNhc2UgUlVMRV9JTlQ6CisgICAgICAgICAgICBjYXNlIFJVTEVfREVDSU1BTDoKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICBjYXNlIDMxOgorICAgICAgICAgICAgY2FzZSAzNToKKyAgICAgICAgICAgIGNhc2UgMzY6CisgICAgICAgICAgICBjYXNlIDQzOgorICAgICAgICAgICAgY2FzZSA1OToKKyAgICAgICAgICAgIGNhc2UgNjA6CisgICAgICAgICAgICBjYXNlIDY0OgorICAgICAgICAgICAgY2FzZSA3MjoKKyAgICAgICAgICAgIGNhc2UgNzQ6CisgICAgICAgICAgICBjYXNlIDc4OgorICAgICAgICAgICAgY2FzZSA3OToKKyAgICAgICAgICAgIGNhc2UgODA6CisgICAgICAgICAgICBjYXNlIDg2OgorICAgICAgICAgICAgY2FzZSA4NzoKKyAgICAgICAgICAgIGNhc2UgODg6CisgICAgICAgICAgICBjYXNlIDg5OgorICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIGNhc2UgOTE6CisgICAgICAgICAgICBjYXNlIDkyOgorICAgICAgICAgICAgY2FzZSA5MzoKKyAgICAgICAgICAgIGNhc2UgOTQ6CisgICAgICAgICAgICBjYXNlIDk2OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzNT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzNSwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNSkgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1MjoyOiAoICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTUyOjI6ICggKCkgKCAoIHJ1bGVGZWF0dXJlQ2FsbElEICkgKSBydWxlT3BTaW5nbGVBc3NpZ24gKCAobHZfdmFsdWVfM18wPSBydWxlWEFzc2lnbm1lbnQgKSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTUyOjM6ICgpICggKCBydWxlRmVhdHVyZUNhbGxJRCApICkgcnVsZU9wU2luZ2xlQXNzaWduICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1MjozOiAoKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NTM6NTogCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBY3Rpb25fMF8wKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1ODoyOiAoICggcnVsZUZlYXR1cmVDYWxsSUQgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk1OToxOiAoIHJ1bGVGZWF0dXJlQ2FsbElEICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5NTk6MTogKCBydWxlRmVhdHVyZUNhbGxJRCApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MTk2MDozOiBydWxlRmVhdHVyZUNhbGxJRAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8wXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlRmVhdHVyZUNhbGxJRF9pbl9ydWxlWEFzc2lnbm1lbnQ0NTg4KTsKKyAgICAgICAgICAgICAgICAgICAgcnVsZUZlYXR1cmVDYWxsSUQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0T3BTaW5nbGVBc3NpZ25QYXJzZXJSdWxlQ2FsbF8wXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BTaW5nbGVBc3NpZ25faW5fcnVsZVhBc3NpZ25tZW50NDYwNCk7CisgICAgICAgICAgICAgICAgICAgIHJ1bGVPcFNpbmdsZUFzc2lnbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTgxOjE6ICggKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODI6MTogKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjE5ODI6MTogKGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoxOTgzOjM6IGx2X3ZhbHVlXzNfMD0gcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFZhbHVlWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8wXzNfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFzc2lnbm1lbnRfaW5fcnVsZVhBc3NpZ25tZW50NDYyNCk7CisgICAgICAgICAgICAgICAgICAgIGx2X3ZhbHVlXzNfMD1ydWxlWEFzc2lnbm1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJ2YWx1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCWx2X3ZhbHVlXzNfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSJYQXNzaWdubWVudCIpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMDA6NjogKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMDA6NjogKHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDAxOjU6IHRoaXNfWE9yRXhwcmVzc2lvbl80PSBydWxlWE9yRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WE9yRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3JFeHByZXNzaW9uX2luX3J1bGVYQXNzaWdubWVudDQ2NTQpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hPckV4cHJlc3Npb25fND1ydWxlWE9yRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hPckV4cHJlc3Npb25fNDsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAwOToxOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfN18wPSBydWxlWEFzc2lnbm1lbnQgKSApICk/CisgICAgICAgICAgICAgICAgICAgIGludCBhbHQzND0yOworICAgICAgICAgICAgICAgICAgICBhbHQzNCA9IGRmYTM0LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAwOToyOiAoICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMDk6MjogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDA5OjM6ICggKCAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpQXNzaWduICkgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxNDo2OiAoICgpICggKCBydWxlT3BNdWx0aUFzc2lnbiApICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxNDo3OiAoKSAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxNDo3OiAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAxNTo1OiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAyMDoyOiAoICggcnVsZU9wTXVsdGlBc3NpZ24gKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDIxOjE6ICggcnVsZU9wTXVsdGlBc3NpZ24gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMjE6MTogKCBydWxlT3BNdWx0aUFzc2lnbiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDIyOjM6IHJ1bGVPcE11bHRpQXNzaWduCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wTXVsdGlBc3NpZ25faW5fcnVsZVhBc3NpZ25tZW50NDcwNyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZU9wTXVsdGlBc3NpZ24oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDM1OjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMzY6MTogKGx2X3JpZ2h0T3BlcmFuZF83XzA9IHJ1bGVYQXNzaWdubWVudCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjAzNjoxOiAobHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwMzc6MzogbHZfcmlnaHRPcGVyYW5kXzdfMD0gcnVsZVhBc3NpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEFzc2lnbm1lbnRQYXJzZXJSdWxlQ2FsbF8xXzFfMV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQXNzaWdubWVudF9pbl9ydWxlWEFzc2lnbm1lbnQ0NzMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdl9yaWdodE9wZXJhbmRfN18wPXJ1bGVYQXNzaWdubWVudCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnRGb3JQYXJlbnQoZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzdfMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJIlhBc3NpZ25tZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhBc3NpZ25tZW50IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wU2luZ2xlQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA2MToxOiBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbiByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcFNpbmdsZUFzc2lnbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDYyOjI6IChpdl9ydWxlT3BTaW5nbGVBc3NpZ249IHJ1bGVPcFNpbmdsZUFzc2lnbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDYzOjI6IGl2X3J1bGVPcFNpbmdsZUFzc2lnbj0gcnVsZU9wU2luZ2xlQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcFNpbmdsZUFzc2lnbl9pbl9lbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbjQ3NzApOworICAgICAgICAgICAgaXZfcnVsZU9wU2luZ2xlQXNzaWduPXJ1bGVPcFNpbmdsZUFzc2lnbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU9wU2luZ2xlQXNzaWduLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFNpbmdsZUFzc2lnbjQ3ODEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BTaW5nbGVBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wU2luZ2xlQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA3MDoxOiBydWxlT3BTaW5nbGVBc3NpZ24gcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDoga3c9ICc9JyA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wU2luZ2xlQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA3MzoyODogKGt3PSAnPScgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMDc1OjI6IGt3PSAnPScKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfMzRfaW5fcnVsZU9wU2luZ2xlQXNzaWduNDgxOCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcFNpbmdsZUFzc2lnbkFjY2VzcygpLmdldEVxdWFsc1NpZ25LZXl3b3JkKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcFNpbmdsZUFzc2lnbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA4ODoxOiBlbnRyeVJ1bGVPcE11bHRpQXNzaWduIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE11bHRpQXNzaWduKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wTXVsdGlBc3NpZ24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA4OToyOiAoaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIwOTA6MjogaXZfcnVsZU9wTXVsdGlBc3NpZ249IHJ1bGVPcE11bHRpQXNzaWduIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wTXVsdGlBc3NpZ25faW5fZW50cnlSdWxlT3BNdWx0aUFzc2lnbjQ4NTgpOworICAgICAgICAgICAgaXZfcnVsZU9wTXVsdGlBc3NpZ249cnVsZU9wTXVsdGlBc3NpZ24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE11bHRpQXNzaWduLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE11bHRpQXNzaWduNDg2OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE11bHRpQXNzaWduIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE11bHRpQXNzaWduIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjA5NzoxOiBydWxlT3BNdWx0aUFzc2lnbiByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICcrPScgfCBrdz0gJy09JyB8IGt3PSAnKj0nIHwga3c9ICcvPScgfCBrdz0gJyU9JyB8IChrdz0gJzwnIGt3PSAnPCcga3c9ICc9JyApIHwgKGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScgKSApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BNdWx0aUFzc2lnbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudCA9IG5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCk7CisKKyAgICAgICAgVG9rZW4ga3c9bnVsbDsKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMDA6Mjg6ICggKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMDE6MTogKGt3PSAnKz0nIHwga3c9ICctPScgfCBrdz0gJyo9JyB8IGt3PSAnLz0nIHwga3c9ICclPScgfCAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKSB8IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTAxOjE6IChrdz0gJys9JyB8IGt3PSAnLT0nIHwga3c9ICcqPScgfCBrdz0gJy89JyB8IGt3PSAnJT0nIHwgKGt3PSAnPCcga3c9ICc8JyBrdz0gJz0nICkgfCAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApICkKKyAgICAgICAgICAgIGludCBhbHQzNz03OworICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICBjYXNlIDM4OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzNz0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDM3PTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mzc9MzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzNz00OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDM3PTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0Mzc9NjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQzNz03OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCAzNywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQzNykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEwMjoyOiBrdz0gJys9JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwzOCxGT0xMT1dfMzhfaW5fcnVsZU9wTXVsdGlBc3NpZ240OTA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRQbHVzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTA5OjI6IGt3PSAnLT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDM5LEZPTExPV18zOV9pbl9ydWxlT3BNdWx0aUFzc2lnbjQ5MjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEh5cGhlbk1pbnVzRXF1YWxzU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMTY6Mjoga3c9ICcqPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDAsRk9MTE9XXzQwX2luX3J1bGVPcE11bHRpQXNzaWduNDk0NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0QXN0ZXJpc2tFcXVhbHNTaWduS2V5d29yZF8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEyMzoyOiBrdz0gJy89JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MSxGT0xMT1dfNDFfaW5fcnVsZU9wTXVsdGlBc3NpZ240OTY0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBc3NpZ25BY2Nlc3MoKS5nZXRTb2xpZHVzRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMzA6Mjoga3c9ICclPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDIsRk9MTE9XXzQyX2luX3J1bGVPcE11bHRpQXNzaWduNDk4Myk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0UGVyY2VudFNpZ25FcXVhbHNTaWduS2V5d29yZF80KCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEzNjo2OiAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjEzNjo2OiAoa3c9ICc8JyBrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxMzc6Mjoga3c9ICc8JyBrdz0gJzwnIGt3PSAnPScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzQzX2luX3J1bGVPcE11bHRpQXNzaWduNTAwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzQzX2luX3J1bGVPcE11bHRpQXNzaWduNTAxNik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0TGVzc1RoYW5TaWduS2V5d29yZF81XzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMzQsRk9MTE9XXzM0X2luX3J1bGVPcE11bHRpQXNzaWduNTAyOSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfNV8yKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE1NTo2OiAoa3c9ICc+JyAoa3c9ICc+JyApPyBrdz0gJz49JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTU1OjY6IChrdz0gJz4nIChrdz0gJz4nICk/IGt3PSAnPj0nICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTU2OjI6IGt3PSAnPicgKGt3PSAnPicgKT8ga3c9ICc+PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVPcE11bHRpQXNzaWduNTA1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNjE6MTogKGt3PSAnPicgKT8KKyAgICAgICAgICAgICAgICAgICAgaW50IGFsdDM2PTI7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM2XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTM2XzA9PTQ0KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM2PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzNikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxNjI6Mjoga3c9ICc+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVPcE11bHRpQXNzaWduNTA2NCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF82XzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ1LEZPTExPV180NV9pbl9ydWxlT3BNdWx0aUFzc2lnbjUwNzkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzZfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGlBc3NpZ24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxODE6MTogZW50cnlSdWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE9yRXhwcmVzc2lvbj0gcnVsZVhPckV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYT3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYT3JFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxODI6MjogKGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTgzOjI6IGl2X3J1bGVYT3JFeHByZXNzaW9uPSBydWxlWE9yRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3JFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhPckV4cHJlc3Npb241MTIwKTsKKyAgICAgICAgICAgIGl2X3J1bGVYT3JFeHByZXNzaW9uPXJ1bGVYT3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWE9yRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYT3JFeHByZXNzaW9uNTEzMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3JFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYT3JFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE5MDoxOiBydWxlWE9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQW5kRXhwcmVzc2lvbl8wPSBydWxlWEFuZEV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE9yRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hBbmRFeHByZXNzaW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfcmlnaHRPcGVyYW5kXzNfMCA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOTM6Mjg6ICggKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIxOTQ6MTogKHRoaXNfWEFuZEV4cHJlc3Npb25fMD0gcnVsZVhBbmRFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICk9PiAoICgpICggKCBydWxlT3BPciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMTk0OjE6ICh0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjE5NTo1OiB0aGlzX1hBbmRFeHByZXNzaW9uXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFuZEV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbmRFeHByZXNzaW9uX2luX3J1bGVYT3JFeHByZXNzaW9uNTE3Nyk7CisgICAgICAgICAgICB0aGlzX1hBbmRFeHByZXNzaW9uXzA9cnVsZVhBbmRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YQW5kRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwMzoxOiAoICggKCAoICgpICggKCBydWxlT3BPciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3IgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wMzg6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDM4PTI7CisgICAgICAgICAgICAgICAgaW50IExBMzhfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEEzOF8wPT00NikgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTM4XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkOV9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQzOD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQzOCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwMzoyOiAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwMzoyOiAoICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjAzOjM6ICggKCAoKSAoICggcnVsZU9wT3IgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjA4OjY6ICggKCkgKCAoIHJ1bGVPcE9yICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwODo3OiAoKSAoICggcnVsZU9wT3IgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjA4Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIwOTo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIxNDoyOiAoICggcnVsZU9wT3IgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIxNToxOiAoIHJ1bGVPcE9yICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMTU6MTogKCBydWxlT3BPciApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIxNjozOiBydWxlT3BPcgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCQkJaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE9yX2luX3J1bGVYT3JFeHByZXNzaW9uNTIzMCk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcE9yKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIyOTo0OiAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIzMDoxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBbmRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyMzA6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQW5kRXhwcmVzc2lvbiApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjIzMTozOiBsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFuZEV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQW5kRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYQW5kRXhwcmVzc2lvbl9pbl9ydWxlWE9yRXhwcmVzc2lvbjUyNTMpOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQW5kRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYQW5kRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wMzg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BPciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNTU6MTogZW50cnlSdWxlT3BPciByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE9yPSBydWxlT3BPciBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BPcigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcE9yID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNTY6MjogKGl2X3J1bGVPcE9yPSBydWxlT3BPciBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjU3OjI6IGl2X3J1bGVPcE9yPSBydWxlT3BPciBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wT3JSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE9yX2luX2VudHJ5UnVsZU9wT3I1MjkyKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcE9yPXJ1bGVPcE9yKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BPci5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BPcjUzMDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BPciIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BPciIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyNjQ6MTogcnVsZU9wT3IgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDoga3c9ICd8fCcgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVPcE9yKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI2NzoyODogKGt3PSAnfHwnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjI2OToyOiBrdz0gJ3x8JworICAgICAgICAgICAgeworICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ2LEZPTExPV180Nl9pbl9ydWxlT3BPcjUzNDApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPckFjY2VzcygpLmdldFZlcnRpY2FsTGluZVZlcnRpY2FsTGluZUtleXdvcmQoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wT3IiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEFuZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjgyOjE6IGVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQW5kRXhwcmVzc2lvbj0gcnVsZVhBbmRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFuZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhBbmRFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyODM6MjogKGl2X3J1bGVYQW5kRXhwcmVzc2lvbj0gcnVsZVhBbmRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyODQ6MjogaXZfcnVsZVhBbmRFeHByZXNzaW9uPSBydWxlWEFuZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBbmRFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhBbmRFeHByZXNzaW9uNTM3OSk7CisgICAgICAgICAgICBpdl9ydWxlWEFuZEV4cHJlc3Npb249cnVsZVhBbmRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEFuZEV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFuZEV4cHJlc3Npb241Mzg5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhBbmRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQW5kRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTE6MTogcnVsZVhBbmRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhBbmRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMjk0OjI4OiAoICh0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTU6MTogKHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTU6MTogKHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIyOTY6NTogdGhpc19YRXF1YWxpdHlFeHByZXNzaW9uXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQW5kICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhFcXVhbGl0eUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhFcXVhbGl0eUV4cHJlc3Npb25faW5fcnVsZVhBbmRFeHByZXNzaW9uNTQzNik7CisgICAgICAgICAgICB0aGlzX1hFcXVhbGl0eUV4cHJlc3Npb25fMD1ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEVxdWFsaXR5RXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMwNDoxOiAoICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDM5OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQzOT0yOworICAgICAgICAgICAgICAgIGludCBMQTM5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBMzlfMD09NDcpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEEzOV8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEwX0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDM5PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDM5KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA0OjI6ICggKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMwNDoyOiAoICggKCAoKSAoICggcnVsZU9wQW5kICkgKSApICk9PiAoICgpICggKCBydWxlT3BBbmQgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMDQ6MzogKCAoICgpICggKCBydWxlT3BBbmQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFuZCApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMwOTo2OiAoICgpICggKCBydWxlT3BBbmQgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA5Ojc6ICgpICggKCBydWxlT3BBbmQgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzA5Ojc6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMxMDo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMTU6MjogKCAoIHJ1bGVPcEFuZCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzE2OjE6ICggcnVsZU9wQW5kICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMTY6MTogKCBydWxlT3BBbmQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMTc6MzogcnVsZU9wQW5kCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBbmRfaW5fcnVsZVhBbmRFeHByZXNzaW9uNTQ4OSk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcEFuZCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMzA6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMzMToxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjMzMToxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzMzI6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWEVxdWFsaXR5RXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uX2luX3J1bGVYQW5kRXhwcmVzc2lvbjU1MTIpOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYRXF1YWxpdHlFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3AzOTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFuZEV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzU2OjE6IGVudHJ5UnVsZU9wQW5kIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wQW5kPSBydWxlT3BBbmQgRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGVudHJ5UnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wQW5kID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNTc6MjogKGl2X3J1bGVPcEFuZD0gcnVsZU9wQW5kIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzNTg6MjogaXZfcnVsZU9wQW5kPSBydWxlT3BBbmQgRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRPcEFuZFJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQW5kX2luX2VudHJ5UnVsZU9wQW5kNTU1MSk7CisgICAgICAgICAgICBpdl9ydWxlT3BBbmQ9cnVsZU9wQW5kKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BBbmQuZ2V0VGV4dCgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZU9wQW5kNTU2Mik7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcEFuZCIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BBbmQiCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzY1OjE6IHJ1bGVPcEFuZCByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiBrdz0gJyYmJyA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wQW5kKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM2ODoyODogKGt3PSAnJiYnICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM3MDoyOiBrdz0gJyYmJworICAgICAgICAgICAgeworICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ3LEZPTExPV180N19pbl9ydWxlT3BBbmQ1NTk5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQW5kQWNjZXNzKCkuZ2V0QW1wZXJzYW5kQW1wZXJzYW5kS2V5d29yZCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BBbmQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzODM6MTogZW50cnlSdWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbj0gcnVsZVhFcXVhbGl0eUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzODQ6MjogKGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzg1OjI6IGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPSBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhFcXVhbGl0eUV4cHJlc3Npb241NjM4KTsKKyAgICAgICAgICAgIGl2X3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uPXJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uNTY0OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYRXF1YWxpdHlFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM5MjoxOiBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzk1OjI4OiAoICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyMzk2OjE6ICh0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjM5NjoxOiAodGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjIzOTc6NTogdGhpc19YUmVsYXRpb25hbEV4cHJlc3Npb25fMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uX2luX3J1bGVYRXF1YWxpdHlFeHByZXNzaW9uNTY5NSk7CisgICAgICAgICAgICB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wPXJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hSZWxhdGlvbmFsRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQwNToxOiAoICggKCAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDQwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ0MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgNDg6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDBfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNDk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDBfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDBfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNTE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDBfNSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxMV9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0MCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQwNToyOiAoICggKCAoKSAoICggcnVsZU9wRXF1YWxpdHkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MDU6MjogKCAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQwNTozOiAoICggKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKSApICk9PiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQxMDo2OiAoICgpICggKCBydWxlT3BFcXVhbGl0eSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MTA6NzogKCkgKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQxMDo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MTE6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MTY6MjogKCAoIHJ1bGVPcEVxdWFsaXR5ICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MTc6MTogKCBydWxlT3BFcXVhbGl0eSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDE3OjE6ICggcnVsZU9wRXF1YWxpdHkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MTg6MzogcnVsZU9wRXF1YWxpdHkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BFcXVhbGl0eV9pbl9ydWxlWEVxdWFsaXR5RXhwcmVzc2lvbjU3NDgpOworICAgICAgICAgICAgCSAgICBydWxlT3BFcXVhbGl0eSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzE6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDMyOjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzI6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0MzM6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhSZWxhdGlvbmFsRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb25faW5fcnVsZVhFcXVhbGl0eUV4cHJlc3Npb241NzcxKTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhSZWxhdGlvbmFsRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhFcXVhbGl0eUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NTc6MTogZW50cnlSdWxlT3BFcXVhbGl0eSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BFcXVhbGl0eSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcEVxdWFsaXR5ID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NTg6MjogKGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDU5OjI6IGl2X3J1bGVPcEVxdWFsaXR5PSBydWxlT3BFcXVhbGl0eSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcEVxdWFsaXR5X2luX2VudHJ5UnVsZU9wRXF1YWxpdHk1ODEwKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEVxdWFsaXR5PXJ1bGVPcEVxdWFsaXR5KCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BFcXVhbGl0eS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BFcXVhbGl0eTU4MjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BFcXVhbGl0eSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BFcXVhbGl0eSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NjY6MTogcnVsZU9wRXF1YWxpdHkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnPT0nIHwga3c9ICchPScgfCBrdz0gJz09PScgfCBrdz0gJyE9PScgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wRXF1YWxpdHkoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDY5OjI4OiAoIChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDcwOjE6IChrdz0gJz09JyB8IGt3PSAnIT0nIHwga3c9ICc9PT0nIHwga3c9ICchPT0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjQ3MDoxOiAoa3c9ICc9PScgfCBrdz0gJyE9JyB8IGt3PSAnPT09JyB8IGt3PSAnIT09JyApCisgICAgICAgICAgICBpbnQgYWx0NDE9NDsKKyAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgY2FzZSA0ODoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDE9MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0MT0yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNTA6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQxPTM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA1MToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NDE9NDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDEsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAoYWx0NDEpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI0NzE6Mjoga3c9ICc9PScKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDgsRk9MTE9XXzQ4X2luX3J1bGVPcEVxdWFsaXR5NTg1OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEVxdWFsaXR5QWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDc4OjI6IGt3PSAnIT0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ5LEZPTExPV180OV9pbl9ydWxlT3BFcXVhbGl0eTU4NzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0VxdWFsc1NpZ25LZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDg1OjI6IGt3PSAnPT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1MCxGT0xMT1dfNTBfaW5fcnVsZU9wRXF1YWxpdHk1ODk3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFcXVhbHNTaWduRXF1YWxzU2lnbkVxdWFsc1NpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNDkyOjI6IGt3PSAnIT09JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1MSxGT0xMT1dfNTFfaW5fcnVsZU9wRXF1YWxpdHk1OTE2KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wRXF1YWxpdHlBY2Nlc3MoKS5nZXRFeGNsYW1hdGlvbk1hcmtFcXVhbHNTaWduRXF1YWxzU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wRXF1YWxpdHkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUwNToxOiBlbnRyeVJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj0gcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MDY6MjogKGl2X3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb249IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUwNzoyOiBpdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uPSBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjU5NTYpOworICAgICAgICAgICAgaXZfcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbj1ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjU5NjYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE0OjE6IHJ1bGVYUmVsYXRpb25hbEV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgRU9iamVjdCB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3R5cGVfM18wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF82XzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTE3OjI4OiAoICh0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICggKCAoICggKCAoKSAnaW5zdGFuY2VvZicgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApIHwgKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MTg6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MTg6MTogKHRoaXNfWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uXzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKCAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkgfCAoICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MTk6NTogdGhpc19YT3RoZXJPcGVyYXRvckV4cHJlc3Npb25fMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl9pbl9ydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uNjAxMyk7CisgICAgICAgICAgICB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hPdGhlck9wZXJhdG9yRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUyNzoxOiAoICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSB8ICggKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkgKSApICkqCisgICAgICAgICAgICBsb29wNDI6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQyPTM7CisgICAgICAgICAgICAgICAgc3dpdGNoICggaW5wdXQuTEEoMSkgKSB7CisgICAgICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0NDoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml8zID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1MjoKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml80ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEyX0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0NToKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Ml81ID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDEzX0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQyPTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQyKSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTI3OjI6ICggKCAoICggKCkgJ2luc3RhbmNlb2YnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnaW5zdGFuY2VvZicgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUyNzoyOiAoICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTI3OjM6ICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTI3OjM6ICggKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1Mjc6NDogKCAoICgpICdpbnN0YW5jZW9mJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2luc3RhbmNlb2YnICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1Mjk6NTogKCAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJyApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUyOTo2OiAoKSBvdGhlcmx2XzI9ICdpbnN0YW5jZW9mJworICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjUyOTo2OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1MzA6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNTIsRk9MTE9XXzUyX2luX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb242MDQ5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgICAgIAluZXdMZWFmTm9kZShvdGhlcmx2XzIsIGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0SW5zdGFuY2VvZktleXdvcmRfMV8wXzBfMF8xKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1Mzk6MzogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NDA6MTogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTQwOjE6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NDE6MzogbHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRUeXBlSnZtVHlwZVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzFfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVR5cGVSZWZlcmVuY2VfaW5fcnVsZVhSZWxhdGlvbmFsRXhwcmVzc2lvbjYwNzIpOworICAgICAgICAgICAgCSAgICBsdl90eXBlXzNfMD1ydWxlSnZtVHlwZVJlZmVyZW5jZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJ0eXBlIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfdHlwZV8zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiSnZtVHlwZVJlZmVyZW5jZSIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKyAgICAgICAgICAgIAljYXNlIDIgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NTg6NjogKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NTg6NjogKCAoICggKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQ29tcGFyZSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTU4Ojc6ICggKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NTg6NzogKCAoICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NTg6ODogKCAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApICk9PiAoICgpICggKCBydWxlT3BDb21wYXJlICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTYzOjY6ICggKCkgKCAoIHJ1bGVPcENvbXBhcmUgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTYzOjc6ICgpICggKCBydWxlT3BDb21wYXJlICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjU2Mzo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NjQ6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTY5OjI6ICggKCBydWxlT3BDb21wYXJlICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NzA6MTogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1NzA6MTogKCBydWxlT3BDb21wYXJlICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTcxOjM6IHJ1bGVPcENvbXBhcmUKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BDb21wYXJlX2luX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb242MTMzKTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wQ29tcGFyZSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODQ6NDogKCAobHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNTg1OjE6IChsdl9yaWdodE9wZXJhbmRfNl8wPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODU6MTogKGx2X3JpZ2h0T3BlcmFuZF82XzA9IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI1ODY6MzogbHZfcmlnaHRPcGVyYW5kXzZfMD0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UmlnaHRPcGVyYW5kWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX2luX3J1bGVYUmVsYXRpb25hbEV4cHJlc3Npb242MTU2KTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzZfMD1ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF82XzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWFJlbGF0aW9uYWxFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZU9wQ29tcGFyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MTA6MTogZW50cnlSdWxlT3BDb21wYXJlIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wQ29tcGFyZSA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjExOjI6IChpdl9ydWxlT3BDb21wYXJlPSBydWxlT3BDb21wYXJlIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MTI6MjogaXZfcnVsZU9wQ29tcGFyZT0gcnVsZU9wQ29tcGFyZSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQ29tcGFyZV9pbl9lbnRyeVJ1bGVPcENvbXBhcmU2MTk2KTsKKyAgICAgICAgICAgIGl2X3J1bGVPcENvbXBhcmU9cnVsZU9wQ29tcGFyZSgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZU9wQ29tcGFyZS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BDb21wYXJlNjIwNyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcENvbXBhcmUiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZU9wQ29tcGFyZSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MTk6MTogcnVsZU9wQ29tcGFyZSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICc+PScgfCAoa3c9ICc8JyBrdz0gJz0nICkgfCBrdz0gJz4nIHwga3c9ICc8JyApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BDb21wYXJlKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYyMjoyODogKCAoa3c9ICc+PScgfCAoa3c9ICc8JyBrdz0gJz0nICkgfCBrdz0gJz4nIHwga3c9ICc8JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYyMzoxOiAoa3c9ICc+PScgfCAoa3c9ICc8JyBrdz0gJz0nICkgfCBrdz0gJz4nIHwga3c9ICc8JyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MjM6MTogKGt3PSAnPj0nIHwgKGt3PSAnPCcga3c9ICc9JyApIHwga3c9ICc+JyB8IGt3PSAnPCcgKQorICAgICAgICAgICAgaW50IGFsdDQzPTQ7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgNDU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDQzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IExBNDNfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0M18yPT1FT0Z8fChMQTQzXzI+PVJVTEVfSUQgJiYgTEE0M18yPD1SVUxFX0RFQ0lNQUwpfHxMQTQzXzI9PTE0fHxMQTQzXzI9PTE2fHxMQTQzXzI9PTMxfHwoTEE0M18yPj0zNSAmJiBMQTQzXzI8PTM2KXx8TEE0M18yPT00M3x8KExBNDNfMj49NTkgJiYgTEE0M18yPD02MCl8fExBNDNfMj09NjR8fExBNDNfMj09NzJ8fExBNDNfMj09NzR8fChMQTQzXzI+PTc4ICYmIExBNDNfMjw9ODApfHwoTEE0M18yPj04MyAmJiBMQTQzXzI8PTk0KXx8TEE0M18yPT05NikgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0M18yPT0zNCkgKSB7CisgICAgICAgICAgICAgICAgICAgIGFsdDQzPTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDMsIDIsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ0Mz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0MywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ0MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjYyNDoyOiBrdz0gJz49JworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0NSxGT0xMT1dfNDVfaW5fcnVsZU9wQ29tcGFyZTYyNDUpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduRXF1YWxzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MzA6NjogKGt3PSAnPCcga3c9ICc9JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjMwOjY6IChrdz0gJzwnIGt3PSAnPScgKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2MzE6Mjoga3c9ICc8JyBrdz0gJz0nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQzLEZPTExPV180M19pbl9ydWxlT3BDb21wYXJlNjI2NSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzFfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCwzNCxGT0xMT1dfMzRfaW5fcnVsZU9wQ29tcGFyZTYyNzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BDb21wYXJlQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbktleXdvcmRfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY0NDoyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ0LEZPTExPV180NF9pbl9ydWxlT3BDb21wYXJlNjI5OCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzIoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA0IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjUxOjI6IGt3PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDMsRk9MTE9XXzQzX2luX3J1bGVPcENvbXBhcmU2MzE3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wQ29tcGFyZUFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wQ29tcGFyZSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjY0OjE6IGVudHJ5UnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPSBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY2NToyOiAoaXZfcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbj0gcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjY2OjI6IGl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb249IHJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25faW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNjM1Nyk7CisgICAgICAgICAgICBpdl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uPXJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNjM2Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2NzM6MTogcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjc2OjI4OiAoICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjc3OjE6ICh0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY3NzoxOiAodGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2Nzg6NTogdGhpc19YQWRkaXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbl9pbl9ydWxlWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uNjQxNCk7CisgICAgICAgICAgICB0aGlzX1hBZGRpdGl2ZUV4cHJlc3Npb25fMD1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWEFkZGl0aXZlRXhwcmVzc2lvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY4NjoxOiAoICggKCAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApPT4gKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiApICkgKSoKKyAgICAgICAgICAgIGxvb3A0NDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQgYWx0NDQ9MjsKKyAgICAgICAgICAgICAgICBhbHQ0NCA9IGRmYTQ0LnByZWRpY3QoaW5wdXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDQpIHsKKyAgICAgICAgICAgIAljYXNlIDEgOgorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI2ODY6MjogKCAoICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICk9PiAoICgpICggKCBydWxlT3BPdGhlciApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY4NjoyOiAoICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjg2OjM6ICggKCAoKSAoICggcnVsZU9wT3RoZXIgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjkxOjY6ICggKCkgKCAoIHJ1bGVPcE90aGVyICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY5MTo3OiAoKSAoICggcnVsZU9wT3RoZXIgKSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjkxOjc6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY5Mjo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgIAkgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjk3OjI6ICggKCBydWxlT3BPdGhlciApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjk4OjE6ICggcnVsZU9wT3RoZXIgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjY5ODoxOiAoIHJ1bGVPcE90aGVyICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNjk5OjM6IHJ1bGVPcE90aGVyCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMV8wXzBfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE90aGVyX2luX3J1bGVYT3RoZXJPcGVyYXRvckV4cHJlc3Npb242NDY3KTsKKyAgICAgICAgICAgIAkgICAgcnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgCSAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICAJICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzEyOjQ6ICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MTM6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3MTM6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzE0OjM6IGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYQWRkaXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbjY0OTApOworICAgICAgICAgICAgCSAgICBsdl9yaWdodE9wZXJhbmRfM18wPXJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJc2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQljdXJyZW50LCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJInJpZ2h0T3BlcmFuZCIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3JpZ2h0T3BlcmFuZF8zXzAsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQkiWEFkZGl0aXZlRXhwcmVzc2lvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjczODoxOiBlbnRyeVJ1bGVPcE90aGVyIHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcE90aGVyKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wT3RoZXIgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjczOToyOiAoaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3NDA6MjogaXZfcnVsZU9wT3RoZXI9IHJ1bGVPcE90aGVyIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlclJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wT3RoZXJfaW5fZW50cnlSdWxlT3BPdGhlcjY1MjkpOworICAgICAgICAgICAgaXZfcnVsZU9wT3RoZXI9cnVsZU9wT3RoZXIoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcE90aGVyLmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcE90aGVyNjU0MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcE90aGVyIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc0NzoxOiBydWxlT3BPdGhlciByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKSA7CisgICAgcHVibGljIGZpbmFsIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gcnVsZU9wT3RoZXIoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzUwOjI4OiAoIChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc1MToxOiAoa3c9ICctPicgfCBrdz0gJy4uPCcgfCAoa3c9ICc+JyBrdz0gJy4uJyApIHwga3c9ICcuLicgfCBrdz0gJz0+JyB8IChrdz0gJz4nICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKSApIHwgKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKSB8IGt3PSAnPD4nIHwga3c9ICc/OicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzUxOjE6IChrdz0gJy0+JyB8IGt3PSAnLi48JyB8IChrdz0gJz4nIGt3PSAnLi4nICkgfCBrdz0gJy4uJyB8IGt3PSAnPT4nIHwgKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkgfCAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApIHwga3c9ICc8PicgfCBrdz0gJz86JyApCisgICAgICAgICAgICBpbnQgYWx0NDc9OTsKKyAgICAgICAgICAgIGFsdDQ3ID0gZGZhNDcucHJlZGljdChpbnB1dCk7CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ3KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzUyOjI6IGt3PSAnLT4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDUzLEZPTExPV181M19pbl9ydWxlT3BPdGhlcjY1NzgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEh5cGhlbk1pbnVzR3JlYXRlclRoYW5TaWduS2V5d29yZF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc1OToyOiBrdz0gJy4uPCcKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTQsRk9MTE9XXzU0X2luX3J1bGVPcE90aGVyNjU5Nyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcExlc3NUaGFuU2lnbktleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3NjU6NjogKGt3PSAnPicga3c9ICcuLicgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc2NTo2OiAoa3c9ICc+JyBrdz0gJy4uJyApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc2NjoyOiBrdz0gJz4nIGt3PSAnLi4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ0LEZPTExPV180NF9pbl9ydWxlT3BPdGhlcjY2MTcpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfMl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU1LEZPTExPV181NV9pbl9ydWxlT3BPdGhlcjY2MzApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEZ1bGxTdG9wRnVsbFN0b3BLZXl3b3JkXzJfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3Nzk6Mjoga3c9ICcuLicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTUsRk9MTE9XXzU1X2luX3J1bGVPcE90aGVyNjY1MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RnVsbFN0b3BGdWxsU3RvcEtleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3ODY6Mjoga3c9ICc9PicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTYsRk9MTE9XXzU2X2luX3J1bGVPcE90aGVyNjY2OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0RXF1YWxzU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDYgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3OTI6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI3OTI6NjogKGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzkzOjI6IGt3PSAnPicgKCAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApIHwga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQ0LEZPTExPV180NF9pbl9ydWxlT3BPdGhlcjY2ODkpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldEdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNV8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzk4OjE6ICggKCAoICggJz4nICc+JyApICk9PiAoa3c9ICc+JyBrdz0gJz4nICkgKSB8IGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICBpbnQgYWx0NDU9MjsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDVfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKExBNDVfMD09NDQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExBNDVfMSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChMQTQ1XzE9PUVPRnx8KExBNDVfMT49UlVMRV9JRCAmJiBMQTQ1XzE8PVJVTEVfREVDSU1BTCl8fExBNDVfMT09MTR8fExBNDVfMT09MTZ8fExBNDVfMT09MzF8fChMQTQ1XzE+PTM1ICYmIExBNDVfMTw9MzYpfHxMQTQ1XzE9PTQzfHwoTEE0NV8xPj01OSAmJiBMQTQ1XzE8PTYwKXx8TEE0NV8xPT02NHx8TEE0NV8xPT03Mnx8TEE0NV8xPT03NHx8KExBNDVfMT49NzggJiYgTEE0NV8xPD04MCl8fChMQTQ1XzE+PTgzICYmIExBNDVfMTw9OTQpfHxMQTQ1XzE9PTk2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0NT0yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ1XzE9PTQ0KSAmJiAoc3lucHJlZDE1X0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ1PTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDQ1LCAxLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDUsIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc5ODoyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjc5ODoyOiAoICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyNzk4OjM6ICggKCAnPicgJz4nICkgKT0+IChrdz0gJz4nIGt3PSAnPicgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MDI6NTogKGt3PSAnPicga3c9ICc+JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODAzOjI6IGt3PSAnPicga3c9ICc+JworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVPcE90aGVyNjcyMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNDQsRk9MTE9XXzQ0X2luX3J1bGVPcE90aGVyNjczMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0R3JlYXRlclRoYW5TaWduS2V5d29yZF81XzFfMF8wXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgxNjoyOiBrdz0gJz4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0NCxGT0xMT1dfNDRfaW5fcnVsZU9wT3RoZXI2NzU0KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRHcmVhdGVyVGhhblNpZ25LZXl3b3JkXzVfMV8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDcgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MjI6NjogKGt3PSAnPCcgKCAoICggKCAnPCcgJzwnICkgKT0+IChrdz0gJzwnIGt3PSAnPCcgKSApIHwga3c9ICc8JyB8IGt3PSAnPT4nICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgyMjo2OiAoa3c9ICc8JyAoICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkgfCBrdz0gJzwnIHwga3c9ICc9PicgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgyMzoyOiBrdz0gJzwnICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQzLEZPTExPV180M19pbl9ydWxlT3BPdGhlcjY3NzYpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8wKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODI4OjE6ICggKCAoICggJzwnICc8JyApICk9PiAoa3c9ICc8JyBrdz0gJzwnICkgKSB8IGt3PSAnPCcgfCBrdz0gJz0+JyApCisgICAgICAgICAgICAgICAgICAgIGludCBhbHQ0Nj0zOworICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Nl8wID0gaW5wdXQuTEEoMSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoTEE0Nl8wPT00MykgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTEE0Nl8xID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxNl9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDY9MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAodHJ1ZSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDY9MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDYsIDEsIGlucHV0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ2XzA9PTU2KSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDQ2PTM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA0NiwgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoYWx0NDYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODI4OjI6ICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODI4OjI6ICggKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4Mjg6MzogKCAoICc8JyAnPCcgKSApPT4gKGt3PSAnPCcga3c9ICc8JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjgzMjo1OiAoa3c9ICc8JyBrdz0gJzwnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4MzM6Mjoga3c9ICc8JyBrdz0gJzwnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MyxGT0xMT1dfNDNfaW5fcnVsZU9wT3RoZXI2ODA3KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw0MyxGT0xMT1dfNDNfaW5fcnVsZU9wT3RoZXI2ODIwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRMZXNzVGhhblNpZ25LZXl3b3JkXzZfMV8wXzBfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODQ2OjI6IGt3PSAnPCcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDQzLEZPTExPV180M19pbl9ydWxlT3BPdGhlcjY4NDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbktleXdvcmRfNl8xXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODUzOjI6IGt3PSAnPT4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1NixGT0xMT1dfNTZfaW5fcnVsZU9wT3RoZXI2ODYwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wT3RoZXJBY2Nlc3MoKS5nZXRFcXVhbHNTaWduR3JlYXRlclRoYW5TaWduS2V5d29yZF82XzFfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA4IDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODYwOjI6IGt3PSAnPD4nCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDU3LEZPTExPV181N19pbl9ydWxlT3BPdGhlcjY4ODEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BPdGhlckFjY2VzcygpLmdldExlc3NUaGFuU2lnbkdyZWF0ZXJUaGFuU2lnbktleXdvcmRfNygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDkgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4Njc6Mjoga3c9ICc/OicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTgsRk9MTE9XXzU4X2luX3J1bGVPcE90aGVyNjkwMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE90aGVyQWNjZXNzKCkuZ2V0UXVlc3Rpb25NYXJrQ29sb25LZXl3b3JkXzgoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVPcE90aGVyIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgImVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODgwOjE6IGVudHJ5UnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb249IHJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiA9IG51bGw7CisKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODgxOjI6IChpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg4MjoyOiBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj0gcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbl9pbl9lbnRyeVJ1bGVYQWRkaXRpdmVFeHByZXNzaW9uNjk0MCk7CisgICAgICAgICAgICBpdl9ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbj1ydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgY3VycmVudCA9aXZfcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbjY5NTApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI4ODk6MTogcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWEFkZGl0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBsdl9yaWdodE9wZXJhbmRfM18wID0gbnVsbDsKKworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjg5MjoyODogKCAodGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICggKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODkzOjE6ICh0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODkzOjE6ICh0aGlzX1hNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25fMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKCAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkgKSogKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyODk0OjU6IHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoICggKCAoICgpICggKCBydWxlT3BBZGQgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25QYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb242OTk3KTsKKyAgICAgICAgICAgIHRoaXNfWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbl8wPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gdGhpc19YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTAyOjE6ICggKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApICkqCisgICAgICAgICAgICBsb29wNDg6CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50IGFsdDQ4PTI7CisgICAgICAgICAgICAgICAgaW50IExBNDhfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICAgICAgaWYgKCAoTEE0OF8wPT01OSkgKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBMQTQ4XzIgPSBpbnB1dC5MQSgyKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzeW5wcmVkMTdfSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMKCkpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWx0NDg9MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChMQTQ4XzA9PTYwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNDhfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxN19JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ0OD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ0OCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkwMjoyOiAoICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MDI6MjogKCAoICggKCkgKCAoIHJ1bGVPcEFkZCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wQWRkICkgKSApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTAyOjM6ICggKCAoKSAoICggcnVsZU9wQWRkICkgKSApICk9PiAoICgpICggKCBydWxlT3BBZGQgKSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MDc6NjogKCAoKSAoICggcnVsZU9wQWRkICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkwNzo3OiAoKSAoICggcnVsZU9wQWRkICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkwNzo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MDg6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MTM6MjogKCAoIHJ1bGVPcEFkZCApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTE0OjE6ICggcnVsZU9wQWRkICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MTQ6MTogKCBydWxlT3BBZGQgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MTU6MzogcnVsZU9wQWRkCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0RmVhdHVyZUp2bUlkZW50aWZpYWJsZUVsZW1lbnRDcm9zc1JlZmVyZW5jZV8xXzBfMF8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wQWRkX2luX3J1bGVYQWRkaXRpdmVFeHByZXNzaW9uNzA1MCk7CisgICAgICAgICAgICAJICAgIHJ1bGVPcEFkZCgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5Mjg6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyOToxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MjkyOToxOiAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5MzA6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24KKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSaWdodE9wZXJhbmRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25faW5fcnVsZVhBZGRpdGl2ZUV4cHJlc3Npb243MDczKTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkicmlnaHRPcGVyYW5kIiwKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJbHZfcmlnaHRPcGVyYW5kXzNfMCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCSJYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIik7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisKKworICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIGJyZWFrOworCisgICAgICAgICAgICAJZGVmYXVsdCA6CisgICAgICAgICAgICAJICAgIGJyZWFrIGxvb3A0ODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IHdoaWxlICh0cnVlKTsKKworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlWEFkZGl0aXZlRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcEFkZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NTQ6MTogZW50cnlSdWxlT3BBZGQgcmV0dXJucyBbU3RyaW5nIGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBpdl9ydWxlT3BBZGQgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk1NToyOiAoaXZfcnVsZU9wQWRkPSBydWxlT3BBZGQgRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk1NjoyOiBpdl9ydWxlT3BBZGQ9IHJ1bGVPcEFkZCBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wQWRkUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BBZGRfaW5fZW50cnlSdWxlT3BBZGQ3MTEyKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcEFkZD1ydWxlT3BBZGQoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcEFkZC5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BBZGQ3MTIzKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZU9wQWRkIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcEFkZCIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NjM6MTogcnVsZU9wQWRkIHJldHVybnMgW0FudGxyRGF0YXR5cGVSdWxlVG9rZW4gY3VycmVudD1uZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpXSA6IChrdz0gJysnIHwga3c9ICctJyApIDsKKyAgICBwdWJsaWMgZmluYWwgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBydWxlT3BBZGQoKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQgPSBuZXcgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbigpOworCisgICAgICAgIFRva2VuIGt3PW51bGw7CisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY2OjI4OiAoIChrdz0gJysnIHwga3c9ICctJyApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk2NzoxOiAoa3c9ICcrJyB8IGt3PSAnLScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY3OjE6IChrdz0gJysnIHwga3c9ICctJyApCisgICAgICAgICAgICBpbnQgYWx0NDk9MjsKKyAgICAgICAgICAgIGludCBMQTQ5XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgaWYgKCAoTEE0OV8wPT01OSkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDk9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoTEE0OV8wPT02MCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NDk9MjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5iYWNrdHJhY2tpbmc+MCkge3N0YXRlLmZhaWxlZD10cnVlOyByZXR1cm4gY3VycmVudDt9CisgICAgICAgICAgICAgICAgTm9WaWFibGVBbHRFeGNlcHRpb24gbnZhZSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBOb1ZpYWJsZUFsdEV4Y2VwdGlvbigiIiwgNDksIDAsIGlucHV0KTsKKworICAgICAgICAgICAgICAgIHRocm93IG52YWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzd2l0Y2ggKGFsdDQ5KSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTY4OjI6IGt3PSAnKycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNTksRk9MTE9XXzU5X2luX3J1bGVPcEFkZDcxNjEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BBZGRBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5NzU6Mjoga3c9ICctJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2MCxGT0xMT1dfNjBfaW5fcnVsZU9wQWRkNzE4MCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcEFkZEFjY2VzcygpLmdldEh5cGhlbk1pbnVzS2V5d29yZF8xKCkpOyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGxlYXZlUnVsZSgpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJydWxlT3BBZGQiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5ODg6MTogZW50cnlSdWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiBpdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbj0gcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjI5ODk6MjogKGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzoyOTkwOjI6IGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPSBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb243MjIwKTsKKyAgICAgICAgICAgIGl2X3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uPXJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uNzIzMCk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6Mjk5NzoxOiBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiByZXR1cm5zIFtFT2JqZWN0IGN1cnJlbnQ9bnVsbF0gOiAodGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X3JpZ2h0T3BlcmFuZF8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDAwOjI4OiAoICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDAxOjE6ICh0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICggKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApICggKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkqICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAwMToxOiAodGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMDI6NTogdGhpc19YVW5hcnlPcGVyYXRpb25fMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzAoKSk7IAorICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX3J1bGVYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uNzI3Nyk7CisgICAgICAgICAgICB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wPXJ1bGVYVW5hcnlPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hVbmFyeU9wZXJhdGlvbl8wOyAKKyAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxMDoxOiAoICggKCAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApPT4gKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKSAoIChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApKgorICAgICAgICAgICAgbG9vcDUwOgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1MD0yOworICAgICAgICAgICAgICAgIHN3aXRjaCAoIGlucHV0LkxBKDEpICkgeworICAgICAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfMiA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOF9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfMyA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOF9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjI6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfNCA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOF9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNjM6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IExBNTBfNSA9IGlucHV0LkxBKDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN5bnByZWQxOF9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0woKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbHQ1MD0xOworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3dpdGNoIChhbHQ1MCkgeworICAgICAgICAgICAgCWNhc2UgMSA6CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxMDoyOiAoICggKCAoKSAoICggcnVsZU9wTXVsdGkgKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICkgKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMTA6MjogKCAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKSApCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxMDozOiAoICggKCkgKCAoIHJ1bGVPcE11bHRpICkgKSApICk9PiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxNTo2OiAoICgpICggKCBydWxlT3BNdWx0aSApICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMTU6NzogKCkgKCAoIHJ1bGVPcE11bHRpICkgKQorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzAxNTo3OiAoKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMTY6NTogCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudEFuZFNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGN1cnJlbnQpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMjE6MjogKCAoIHJ1bGVPcE11bHRpICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMjI6MTogKCBydWxlT3BNdWx0aSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDIyOjE6ICggcnVsZU9wTXVsdGkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMjM6MzogcnVsZU9wTXVsdGkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgIAkJCWlmIChjdXJyZW50PT1udWxsKSB7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgICAgIGN1cnJlbnQgPSBjcmVhdGVNb2RlbEVsZW1lbnQoZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAJICAgICAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgIAkgICAgICAgCisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRGZWF0dXJlSnZtSWRlbnRpZmlhYmxlRWxlbWVudENyb3NzUmVmZXJlbmNlXzFfMF8wXzFfMCgpKTsgCisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlT3BNdWx0aV9pbl9ydWxlWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbjczMzApOworICAgICAgICAgICAgCSAgICBydWxlT3BNdWx0aSgpOworCisgICAgICAgICAgICAJICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIAkgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMzY6NDogKCAobHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDM3OjE6IChsdl9yaWdodE9wZXJhbmRfM18wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMzc6MTogKGx2X3JpZ2h0T3BlcmFuZF8zXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwMzg6MzogbHZfcmlnaHRPcGVyYW5kXzNfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbgorICAgICAgICAgICAgCSAgICB7CisgICAgICAgICAgICAJICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgCSAgICAgICAKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFJpZ2h0T3BlcmFuZFhVbmFyeU9wZXJhdGlvblBhcnNlclJ1bGVDYWxsXzFfMV8wKCkpOyAKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisgICAgICAgICAgICAJICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYVW5hcnlPcGVyYXRpb25faW5fcnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb243MzUzKTsKKyAgICAgICAgICAgIAkgICAgbHZfcmlnaHRPcGVyYW5kXzNfMD1ydWxlWFVuYXJ5T3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSk7CisgICAgICAgICAgICAJICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCSJyaWdodE9wZXJhbmQiLAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgCQlsdl9yaWdodE9wZXJhbmRfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIlhVbmFyeU9wZXJhdGlvbiIpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorCisKKyAgICAgICAgICAgIAkgICAgfQorICAgICAgICAgICAgCSAgICBicmVhazsKKworICAgICAgICAgICAgCWRlZmF1bHQgOgorICAgICAgICAgICAgCSAgICBicmVhayBsb29wNTA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlT3BNdWx0aSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNjI6MTogZW50cnlSdWxlT3BNdWx0aSByZXR1cm5zIFtTdHJpbmcgY3VycmVudD1udWxsXSA6IGl2X3J1bGVPcE11bHRpPSBydWxlT3BNdWx0aSBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZW50cnlSdWxlT3BNdWx0aSgpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBBbnRsckRhdGF0eXBlUnVsZVRva2VuIGl2X3J1bGVPcE11bHRpID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNjM6MjogKGl2X3J1bGVPcE11bHRpPSBydWxlT3BNdWx0aSBFT0YgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDY0OjI6IGl2X3J1bGVPcE11bHRpPSBydWxlT3BNdWx0aSBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlSdWxlKCkpOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVPcE11bHRpX2luX2VudHJ5UnVsZU9wTXVsdGk3MzkyKTsKKyAgICAgICAgICAgIGl2X3J1bGVPcE11bHRpPXJ1bGVPcE11bHRpKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlT3BNdWx0aS5nZXRUZXh0KCk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlT3BNdWx0aTc0MDMpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlT3BNdWx0aSIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJydWxlT3BNdWx0aSIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNzE6MTogcnVsZU9wTXVsdGkgcmV0dXJucyBbQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50PW5ldyBBbnRsckRhdGF0eXBlUnVsZVRva2VuKCldIDogKGt3PSAnKicgfCBrdz0gJyoqJyB8IGt3PSAnLycgfCBrdz0gJyUnICkgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVPcE11bHRpKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA3NDoyODogKCAoa3c9ICcqJyB8IGt3PSAnKionIHwga3c9ICcvJyB8IGt3PSAnJScgKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwNzU6MTogKGt3PSAnKicgfCBrdz0gJyoqJyB8IGt3PSAnLycgfCBrdz0gJyUnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzA3NToxOiAoa3c9ICcqJyB8IGt3PSAnKionIHwga3c9ICcvJyB8IGt3PSAnJScgKQorICAgICAgICAgICAgaW50IGFsdDUxPTQ7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgMjk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDUxPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NTE9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDYyOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1MT0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNjM6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDUxPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUxLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGFsdDUxKSB7CisgICAgICAgICAgICAgICAgY2FzZSAxIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDc2OjI6IGt3PSAnKicKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsMjksRk9MTE9XXzI5X2luX3J1bGVPcE11bHRpNzQ0MSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0QXN0ZXJpc2tLZXl3b3JkXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDgzOjI6IGt3PSAnKionCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDYxLEZPTExPV182MV9pbl9ydWxlT3BNdWx0aTc0NjApOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BNdWx0aUFjY2VzcygpLmdldEFzdGVyaXNrQXN0ZXJpc2tLZXl3b3JkXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMDkwOjI6IGt3PSAnLycKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBrdz0oVG9rZW4pbWF0Y2goaW5wdXQsNjIsRk9MTE9XXzYyX2luX3J1bGVPcE11bHRpNzQ3OSk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudC5tZXJnZShrdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdMZWFmTm9kZShrdywgZ3JhbW1hckFjY2Vzcy5nZXRPcE11bHRpQWNjZXNzKCkuZ2V0U29saWR1c0tleXdvcmRfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDQgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMwOTc6Mjoga3c9ICclJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2MyxGT0xMT1dfNjNfaW5fcnVsZU9wTXVsdGk3NDk4KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wTXVsdGlBY2Nlc3MoKS5nZXRQZXJjZW50U2lnbktleXdvcmRfMygpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wTXVsdGkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzExMDoxOiBlbnRyeVJ1bGVYVW5hcnlPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj0gcnVsZVhVbmFyeU9wZXJhdGlvbiBFT0YgOworICAgIHB1YmxpYyBmaW5hbCBFT2JqZWN0IGVudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMTE6MjogKGl2X3J1bGVYVW5hcnlPcGVyYXRpb249IHJ1bGVYVW5hcnlPcGVyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzExMjoyOiBpdl9ydWxlWFVuYXJ5T3BlcmF0aW9uPSBydWxlWFVuYXJ5T3BlcmF0aW9uIEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbjc1MzgpOworICAgICAgICAgICAgaXZfcnVsZVhVbmFyeU9wZXJhdGlvbj1ydWxlWFVuYXJ5T3BlcmF0aW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWFVuYXJ5T3BlcmF0aW9uOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdGNoKGlucHV0LEVPRixGT0xMT1dfRU9GX2luX2VudHJ5UnVsZVhVbmFyeU9wZXJhdGlvbjc1NDgpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFVuYXJ5T3BlcmF0aW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYVW5hcnlPcGVyYXRpb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTE5OjE6IHJ1bGVYVW5hcnlPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBydWxlWFVuYXJ5T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IGx2X29wZXJhbmRfMl8wID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMyA9IG51bGw7CisKKworICAgICAgICAgZW50ZXJSdWxlKCk7IAorICAgICAgICAgICAgCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMjI6Mjg6ICggKCAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkgfCB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiApICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMzoxOiAoICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSB8IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMzoxOiAoICggKCkgKCAoIHJ1bGVPcFVuYXJ5ICkgKSAoIChsdl9vcGVyYW5kXzJfMD0gcnVsZVhVbmFyeU9wZXJhdGlvbiApICkgKSB8IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMz0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uICkKKyAgICAgICAgICAgIGludCBhbHQ1Mj0yOworICAgICAgICAgICAgaW50IExBNTJfMCA9IGlucHV0LkxBKDEpOworCisgICAgICAgICAgICBpZiAoICgoTEE1Ml8wPj01OSAmJiBMQTUyXzA8PTYwKXx8TEE1Ml8wPT02NCkgKSB7CisgICAgICAgICAgICAgICAgYWx0NTI9MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAoKExBNTJfMD49UlVMRV9JRCAmJiBMQTUyXzA8PVJVTEVfREVDSU1BTCl8fExBNTJfMD09MTR8fExBNTJfMD09MTZ8fExBNTJfMD09MzF8fChMQTUyXzA+PTM1ICYmIExBNTJfMDw9MzYpfHxMQTUyXzA9PTQzfHxMQTUyXzA9PTcyfHxMQTUyXzA9PTc0fHwoTEE1Ml8wPj03OCAmJiBMQTUyXzA8PTgwKXx8KExBNTJfMD49ODMgJiYgTEE1Ml8wPD05NCl8fExBNTJfMD09OTYpICkgeworICAgICAgICAgICAgICAgIGFsdDUyPTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYmFja3RyYWNraW5nPjApIHtzdGF0ZS5mYWlsZWQ9dHJ1ZTsgcmV0dXJuIGN1cnJlbnQ7fQorICAgICAgICAgICAgICAgIE5vVmlhYmxlQWx0RXhjZXB0aW9uIG52YWUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgTm9WaWFibGVBbHRFeGNlcHRpb24oIiIsIDUyLCAwLCBpbnB1dCk7CisKKyAgICAgICAgICAgICAgICB0aHJvdyBudmFlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChhbHQ1MikgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMzoyOiAoICgpICggKCBydWxlT3BVbmFyeSApICkgKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMjM6MjogKCAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMzozOiAoKSAoICggcnVsZU9wVW5hcnkgKSApICggKGx2X29wZXJhbmRfMl8wPSBydWxlWFVuYXJ5T3BlcmF0aW9uICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEyMzozOiAoKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxMjQ6NTogCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmb3JjZUNyZWF0ZU1vZGVsRWxlbWVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldFhVbmFyeU9wZXJhdGlvbkFjdGlvbl8wXzAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTI5OjI6ICggKCBydWxlT3BVbmFyeSApICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTMwOjE6ICggcnVsZU9wVW5hcnkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzEzMDoxOiAoIHJ1bGVPcFVuYXJ5ICkKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTMxOjM6IHJ1bGVPcFVuYXJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAJCQlpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldEZlYXR1cmVKdm1JZGVudGlmaWFibGVFbGVtZW50Q3Jvc3NSZWZlcmVuY2VfMF8xXzAoKSk7IAorICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wVW5hcnlfaW5fcnVsZVhVbmFyeU9wZXJhdGlvbjc2MDYpOworICAgICAgICAgICAgICAgICAgICBydWxlT3BVbmFyeSgpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNDQ6MjogKCAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKSApCisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE0NToxOiAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE0NToxOiAobHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24gKQorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxNDY6MzogbHZfb3BlcmFuZF8yXzA9IHJ1bGVYVW5hcnlPcGVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpLmdldE9wZXJhbmRYVW5hcnlPcGVyYXRpb25QYXJzZXJSdWxlQ2FsbF8wXzJfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFVuYXJ5T3BlcmF0aW9uX2luX3J1bGVYVW5hcnlPcGVyYXRpb243NjI3KTsKKyAgICAgICAgICAgICAgICAgICAgbHZfb3BlcmFuZF8yXzA9cnVsZVhVbmFyeU9wZXJhdGlvbigpOworCisgICAgICAgICAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgaWYgKGN1cnJlbnQ9PW51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAJICAgICAgICAgICAgY3VycmVudCA9IGNyZWF0ZU1vZGVsRWxlbWVudEZvclBhcmVudChncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXNldCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJY3VycmVudCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCSJvcGVyYW5kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJbHZfb3BlcmFuZF8yXzAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkiWFVuYXJ5T3BlcmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgCSAgICAgICAgYWZ0ZXJQYXJzZXJPckVudW1SdWxlQ2FsbCgpOworICAgICAgICAgICAgICAgICAgICAgIAkgICAgCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE2NDo1OiB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9IHJ1bGVYQ2FzdGVkRXhwcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblBhcnNlclJ1bGVDYWxsXzEoKSk7IAorICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWENhc3RlZEV4cHJlc3Npb25faW5fcnVsZVhVbmFyeU9wZXJhdGlvbjc2NTYpOworICAgICAgICAgICAgICAgICAgICB0aGlzX1hDYXN0ZWRFeHByZXNzaW9uXzM9cnVsZVhDYXN0ZWRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWENhc3RlZEV4cHJlc3Npb25fMzsgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZVhVbmFyeU9wZXJhdGlvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVPcFVuYXJ5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE4MDoxOiBlbnRyeVJ1bGVPcFVuYXJ5IHJldHVybnMgW1N0cmluZyBjdXJyZW50PW51bGxdIDogaXZfcnVsZU9wVW5hcnk9IHJ1bGVPcFVuYXJ5IEVPRiA7CisgICAgcHVibGljIGZpbmFsIFN0cmluZyBlbnRyeVJ1bGVPcFVuYXJ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEFudGxyRGF0YXR5cGVSdWxlVG9rZW4gaXZfcnVsZU9wVW5hcnkgPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE4MToyOiAoaXZfcnVsZU9wVW5hcnk9IHJ1bGVPcFVuYXJ5IEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMxODI6MjogaXZfcnVsZU9wVW5hcnk9IHJ1bGVPcFVuYXJ5IEVPRgorICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeVJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZU9wVW5hcnlfaW5fZW50cnlSdWxlT3BVbmFyeTc2OTIpOworICAgICAgICAgICAgaXZfcnVsZU9wVW5hcnk9cnVsZU9wVW5hcnkoKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVPcFVuYXJ5LmdldFRleHQoKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVPcFVuYXJ5NzcwMyk7IGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICAgCisgICAgICAgICAgICBjYXRjaCAoUmVjb2duaXRpb25FeGNlcHRpb24gcmUpIHsgCisgICAgICAgICAgICAgICAgcmVjb3ZlcihpbnB1dCxyZSk7IAorICAgICAgICAgICAgICAgIGFwcGVuZFNraXBwZWRUb2tlbnMoKTsKKyAgICAgICAgICAgIH0gCisgICAgICAgIGZpbmFsbHkgeworICAgICAgICB9CisgICAgICAgIHJldHVybiBjdXJyZW50OworICAgIH0KKyAgICAvLyAkQU5UTFIgZW5kICJlbnRyeVJ1bGVPcFVuYXJ5IgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVPcFVuYXJ5IgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE4OToxOiBydWxlT3BVbmFyeSByZXR1cm5zIFtBbnRsckRhdGF0eXBlUnVsZVRva2VuIGN1cnJlbnQ9bmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKV0gOiAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkgOworICAgIHB1YmxpYyBmaW5hbCBBbnRsckRhdGF0eXBlUnVsZVRva2VuIHJ1bGVPcFVuYXJ5KCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQW50bHJEYXRhdHlwZVJ1bGVUb2tlbiBjdXJyZW50ID0gbmV3IEFudGxyRGF0YXR5cGVSdWxlVG9rZW4oKTsKKworICAgICAgICBUb2tlbiBrdz1udWxsOworCisgICAgICAgICBlbnRlclJ1bGUoKTsgCisgICAgICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5MjoyODogKCAoa3c9ICchJyB8IGt3PSAnLScgfCBrdz0gJysnICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTkzOjE6IChrdz0gJyEnIHwga3c9ICctJyB8IGt3PSAnKycgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMTkzOjE6IChrdz0gJyEnIHwga3c9ICctJyB8IGt3PSAnKycgKQorICAgICAgICAgICAgaW50IGFsdDUzPTM7CisgICAgICAgICAgICBzd2l0Y2ggKCBpbnB1dC5MQSgxKSApIHsKKyAgICAgICAgICAgIGNhc2UgNjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFsdDUzPTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2MDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWx0NTM9MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHQ1Mz0zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmJhY2t0cmFja2luZz4wKSB7c3RhdGUuZmFpbGVkPXRydWU7IHJldHVybiBjdXJyZW50O30KKyAgICAgICAgICAgICAgICBOb1ZpYWJsZUFsdEV4Y2VwdGlvbiBudmFlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IE5vVmlhYmxlQWx0RXhjZXB0aW9uKCIiLCA1MywgMCwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgdGhyb3cgbnZhZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChhbHQ1MykgeworICAgICAgICAgICAgICAgIGNhc2UgMSA6CisgICAgICAgICAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzE5NDoyOiBrdz0gJyEnCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAga3c9KFRva2VuKW1hdGNoKGlucHV0LDY0LEZPTExPV182NF9pbl9ydWxlT3BVbmFyeTc3NDEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQubWVyZ2Uoa3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3TGVhZk5vZGUoa3csIGdyYW1tYXJBY2Nlc3MuZ2V0T3BVbmFyeUFjY2VzcygpLmdldEV4Y2xhbWF0aW9uTWFya0tleXdvcmRfMCgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMDE6Mjoga3c9ICctJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw2MCxGT0xMT1dfNjBfaW5fcnVsZU9wVW5hcnk3NzYwKTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRIeXBoZW5NaW51c0tleXdvcmRfMSgpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDMgOgorICAgICAgICAgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMDg6Mjoga3c9ICcrJworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGt3PShUb2tlbiltYXRjaChpbnB1dCw1OSxGT0xMT1dfNTlfaW5fcnVsZU9wVW5hcnk3Nzc5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lm1lcmdlKGt3KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0xlYWZOb2RlKGt3LCBncmFtbWFyQWNjZXNzLmdldE9wVW5hcnlBY2Nlc3MoKS5nZXRQbHVzU2lnbktleXdvcmRfMigpKTsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBsZWF2ZVJ1bGUoKTsgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAicnVsZU9wVW5hcnkiCisKKworICAgIC8vICRBTlRMUiBzdGFydCAiZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24iCisgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjIxOjE6IGVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6IGl2X3J1bGVYQ2FzdGVkRXhwcmVzc2lvbj0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb24oKSB0aHJvd3MgUmVjb2duaXRpb25FeGNlcHRpb24geworICAgICAgICBFT2JqZWN0IGN1cnJlbnQgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uID0gbnVsbDsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMjI6MjogKGl2X3J1bGVYQ2FzdGVkRXhwcmVzc2lvbj0gcnVsZVhDYXN0ZWRFeHByZXNzaW9uIEVPRiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMjM6MjogaXZfcnVsZVhDYXN0ZWRFeHByZXNzaW9uPSBydWxlWENhc3RlZEV4cHJlc3Npb24gRU9GCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSk7IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhDYXN0ZWRFeHByZXNzaW9uX2luX2VudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uNzgxOSk7CisgICAgICAgICAgICBpdl9ydWxlWENhc3RlZEV4cHJlc3Npb249cnVsZVhDYXN0ZWRFeHByZXNzaW9uKCk7CisKKyAgICAgICAgICAgIHN0YXRlLl9mc3AtLTsKKyAgICAgICAgICAgIGlmIChzdGF0ZS5mYWlsZWQpIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICBjdXJyZW50ID1pdl9ydWxlWENhc3RlZEV4cHJlc3Npb247IAorICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0Y2goaW5wdXQsRU9GLEZPTExPV19FT0ZfaW5fZW50cnlSdWxlWENhc3RlZEV4cHJlc3Npb243ODI5KTsgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgImVudHJ5UnVsZVhDYXN0ZWRFeHByZXNzaW9uIgorCisKKyAgICAvLyAkQU5UTFIgc3RhcnQgInJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMzA6MTogcnVsZVhDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgW0VPYmplY3QgY3VycmVudD1udWxsXSA6ICh0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhDYXN0ZWRFeHByZXNzaW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBUb2tlbiBvdGhlcmx2XzI9bnVsbDsKKyAgICAgICAgRU9iamVjdCB0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzAgPSBudWxsOworCisgICAgICAgIEVPYmplY3QgbHZfdHlwZV8zXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjMzOjI4OiAoICh0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA9IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiAoICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkgKSogKSApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMzQ6MTogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMzQ6MTogKHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD0gcnVsZVhQb3N0Zml4T3BlcmF0aW9uICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKiApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyMzU6NTogdGhpc19YUG9zdGZpeE9wZXJhdGlvbl8wPSBydWxlWFBvc3RmaXhPcGVyYXRpb24gKCAoICggKCAoKSAnYXMnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnYXMnICkgKSAoIChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKSApICkqCisgICAgICAgICAgICB7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uUGFyc2VyUnVsZUNhbGxfMCgpKTsgCisgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHB1c2hGb2xsb3coRk9MTE9XX3J1bGVYUG9zdGZpeE9wZXJhdGlvbl9pbl9ydWxlWENhc3RlZEV4cHJlc3Npb243ODc2KTsKKyAgICAgICAgICAgIHRoaXNfWFBvc3RmaXhPcGVyYXRpb25fMD1ydWxlWFBvc3RmaXhPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzX1hQb3N0Zml4T3BlcmF0aW9uXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjQzOjE6ICggKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkgKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKSApKgorICAgICAgICAgICAgbG9vcDU0OgorICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludCBhbHQ1ND0yOworICAgICAgICAgICAgICAgIGludCBMQTU0XzAgPSBpbnB1dC5MQSgxKTsKKworICAgICAgICAgICAgICAgIGlmICggKExBNTRfMD09NjUpICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgTEE1NF8yID0gaW5wdXQuTEEoMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3lucHJlZDE5X0ludGVybmFsQXV0aG9yaXphdGlvbkRTTCgpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsdDU0PTE7CisgICAgICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGFsdDU0KSB7CisgICAgICAgICAgICAJY2FzZSAxIDoKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjQzOjI6ICggKCAoICgpICdhcycgKSApPT4gKCAoKSBvdGhlcmx2XzI9ICdhcycgKSApICggKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNDM6MjogKCAoICggKCkgJ2FzJyApICk9PiAoICgpIG90aGVybHZfMj0gJ2FzJyApICkKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjQzOjM6ICggKCAoKSAnYXMnICkgKT0+ICggKCkgb3RoZXJsdl8yPSAnYXMnICkKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNDU6NTogKCAoKSBvdGhlcmx2XzI9ICdhcycgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNDU6NjogKCkgb3RoZXJsdl8yPSAnYXMnCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjQ1OjY6ICgpCisgICAgICAgICAgICAJICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI0Njo1OiAKKyAgICAgICAgICAgIAkgICAgeworICAgICAgICAgICAgCSAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKworICAgICAgICAgICAgCSAgICAgICAgICAgICAgY3VycmVudCA9IGZvcmNlQ3JlYXRlTW9kZWxFbGVtZW50QW5kU2V0KAorICAgICAgICAgICAgCSAgICAgICAgICAgICAgICAgIGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCksCisgICAgICAgICAgICAJICAgICAgICAgICAgICAgICAgY3VycmVudCk7CisgICAgICAgICAgICAJICAgICAgICAgIAorICAgICAgICAgICAgCSAgICB9CisKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIG90aGVybHZfMj0oVG9rZW4pbWF0Y2goaW5wdXQsNjUsRk9MTE9XXzY1X2luX3J1bGVYQ2FzdGVkRXhwcmVzc2lvbjc5MTEpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAgICAgCW5ld0xlYWZOb2RlKG90aGVybHZfMiwgZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldEFzS2V5d29yZF8xXzBfMF8xKCkpOworICAgICAgICAgICAgCSAgICAgICAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNTU6MzogKCAobHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlICkgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNTY6MTogKGx2X3R5cGVfM18wPSBydWxlSnZtVHlwZVJlZmVyZW5jZSApCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjU2OjE6IChsdl90eXBlXzNfMD0gcnVsZUp2bVR5cGVSZWZlcmVuY2UgKQorICAgICAgICAgICAgCSAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyNTc6MzogbHZfdHlwZV8zXzA9IHJ1bGVKdm1UeXBlUmVmZXJlbmNlCisgICAgICAgICAgICAJICAgIHsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAJICAgICAgIAorICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIG5ld0NvbXBvc2l0ZU5vZGUoZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFR5cGVKdm1UeXBlUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMV8xXzAoKSk7IAorICAgICAgICAgICAgCSAgICAgIAkgICAgCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZUp2bVR5cGVSZWZlcmVuY2VfaW5fcnVsZVhDYXN0ZWRFeHByZXNzaW9uNzkzNCk7CisgICAgICAgICAgICAJICAgIGx2X3R5cGVfM18wPXJ1bGVKdm1UeXBlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgICAgIAkgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgCSAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIAkgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBpZiAoY3VycmVudD09bnVsbCkgeworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgICAgICBjdXJyZW50ID0gY3JlYXRlTW9kZWxFbGVtZW50Rm9yUGFyZW50KGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkpOworICAgICAgICAgICAgCSAgICAgIAkgICAgICAgIH0KKyAgICAgICAgICAgIAkgICAgICAgICAgICAgCQlzZXQoCisgICAgICAgICAgICAJICAgICAgICAgICAgIAkJCWN1cnJlbnQsIAorICAgICAgICAgICAgCSAgICAgICAgICAgICAJCQkidHlwZSIsCisgICAgICAgICAgICAJICAgICAgICAgICAgICAJCWx2X3R5cGVfM18wLCAKKyAgICAgICAgICAgIAkgICAgICAgICAgICAgIAkJIkp2bVR5cGVSZWZlcmVuY2UiKTsKKyAgICAgICAgICAgIAkgICAgICAJICAgICAgICBhZnRlclBhcnNlck9yRW51bVJ1bGVDYWxsKCk7CisgICAgICAgICAgICAJICAgICAgCSAgICAKKyAgICAgICAgICAgIAkgICAgfQorCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKworCisgICAgICAgICAgICAJICAgIH0KKyAgICAgICAgICAgIAkgICAgYnJlYWs7CisKKyAgICAgICAgICAgIAlkZWZhdWx0IDoKKyAgICAgICAgICAgIAkgICAgYnJlYWsgbG9vcDU0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpOworCisKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbGVhdmVSdWxlKCk7IAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICAKKyAgICAgICAgICAgIGNhdGNoIChSZWNvZ25pdGlvbkV4Y2VwdGlvbiByZSkgeyAKKyAgICAgICAgICAgICAgICByZWNvdmVyKGlucHV0LHJlKTsgCisgICAgICAgICAgICAgICAgYXBwZW5kU2tpcHBlZFRva2VucygpOworICAgICAgICAgICAgfSAKKyAgICAgICAgZmluYWxseSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnJlbnQ7CisgICAgfQorICAgIC8vICRBTlRMUiBlbmQgInJ1bGVYQ2FzdGVkRXhwcmVzc2lvbiIKKworCisgICAgLy8gJEFOVExSIHN0YXJ0ICJlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbiIKKyAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyODE6MTogZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogaXZfcnVsZVhQb3N0Zml4T3BlcmF0aW9uPSBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GIDsKKyAgICBwdWJsaWMgZmluYWwgRU9iamVjdCBlbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbigpIHRocm93cyBSZWNvZ25pdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEVPYmplY3QgY3VycmVudCA9IG51bGw7CisKKyAgICAgICAgRU9iamVjdCBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb24gPSBudWxsOworCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI4MjoyOiAoaXZfcnVsZVhQb3N0Zml4T3BlcmF0aW9uPSBydWxlWFBvc3RmaXhPcGVyYXRpb24gRU9GICkKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI4MzoyOiBpdl9ydWxlWFBvc3RmaXhPcGVyYXRpb249IHJ1bGVYUG9zdGZpeE9wZXJhdGlvbiBFT0YKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgbmV3Q29tcG9zaXRlTm9kZShncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpKTsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdXNoRm9sbG93KEZPTExPV19ydWxlWFBvc3RmaXhPcGVyYXRpb25faW5fZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb243OTcyKTsKKyAgICAgICAgICAgIGl2X3J1bGVYUG9zdGZpeE9wZXJhdGlvbj1ydWxlWFBvc3RmaXhPcGVyYXRpb24oKTsKKworICAgICAgICAgICAgc3RhdGUuX2ZzcC0tOworICAgICAgICAgICAgaWYgKHN0YXRlLmZhaWxlZCkgcmV0dXJuIGN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoIHN0YXRlLmJhY2t0cmFja2luZz09MCApIHsKKyAgICAgICAgICAgICAgIGN1cnJlbnQgPWl2X3J1bGVYUG9zdGZpeE9wZXJhdGlvbjsgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXRjaChpbnB1dCxFT0YsRk9MTE9XX0VPRl9pbl9lbnRyeVJ1bGVYUG9zdGZpeE9wZXJhdGlvbjc5ODIpOyBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgIAorICAgICAgICAgICAgY2F0Y2ggKFJlY29nbml0aW9uRXhjZXB0aW9uIHJlKSB7IAorICAgICAgICAgICAgICAgIHJlY292ZXIoaW5wdXQscmUpOyAKKyAgICAgICAgICAgICAgICBhcHBlbmRTa2lwcGVkVG9rZW5zKCk7CisgICAgICAgICAgICB9IAorICAgICAgICBmaW5hbGx5IHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9CisgICAgLy8gJEFOVExSIGVuZCAiZW50cnlSdWxlWFBvc3RmaXhPcGVyYXRpb24iCisKKworICAgIC8vICRBTlRMUiBzdGFydCAicnVsZVhQb3N0Zml4T3BlcmF0aW9uIgorICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI5MDoxOiBydWxlWFBvc3RmaXhPcGVyYXRpb24gcmV0dXJucyBbRU9iamVjdCBjdXJyZW50PW51bGxdIDogKHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzA9IHJ1bGVYTWVtYmVyRmVhdHVyZUNhbGwgKCAoICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT0+ICggKCkgKCAoIHJ1bGVPcFBvc3RmaXggKSApICkgKT8gKSA7CisgICAgcHVibGljIGZpbmFsIEVPYmplY3QgcnVsZVhQb3N0Zml4T3BlcmF0aW9uKCkgdGhyb3dzIFJlY29nbml0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgRU9iamVjdCBjdXJyZW50ID0gbnVsbDsKKworICAgICAgICBFT2JqZWN0IHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzAgPSBudWxsOworCisKKyAgICAgICAgIGVudGVyUnVsZSgpOyAKKyAgICAgICAgICAgIAorICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjkzOjI4OiAoICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkgKQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMjk0OjE6ICh0aGlzX1hNZW1iZXJGZWF0dXJlQ2FsbF8wPSBydWxlWE1lbWJlckZlYXR1cmVDYWxsICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIC4uL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9wYXJzZXIvYW50bHIvaW50ZXJuYWwvSW50ZXJuYWxBdXRob3JpemF0aW9uRFNMLmc6MzI5NDoxOiAodGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPyApCisgICAgICAgICAgICAvLyAuLi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvcGFyc2VyL2FudGxyL2ludGVybmFsL0ludGVybmFsQXV0aG9yaXphdGlvbkRTTC5nOjMyOTU6NTogdGhpc19YTWVtYmVyRmVhdHVyZUNhbGxfMD0gcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCAoICggKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPT4gKCAoKSAoICggcnVsZU9wUG9zdGZpeCApICkgKSApPworICAgICAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzdGF0ZS5iYWNrdHJhY2tpbmc9PTAgKSB7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wb3NpdGVOb2RlKGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxQYXJzZXJSdWxlQ2FsbF8wKCkpOyAKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVzaEZvbGxvdyhGT0xMT1dfcnVsZVhNZW1iZXJGZWF0dXJlQ2FsbF9pbl9ydWxlWFBvc3RmaXhPcGVyYXRpb244MDI5KTsKKyAgICAgICAgICAgIHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzA9cnVsZVhNZW1iZXJGZWF0dXJlQ2FsbCgpOworCisgICAgICAgICAgICBzdGF0ZS5fZnNwLS07CisgICAgICAgICAgICBpZiAoc3RhdGUuZmFpbGVkKSByZXR1cm4gY3VycmVudDsKKyAgICAgICAgICAgIGlmICggc3RhdGUuYmFja3RyYWNraW5nPT0wICkgeworICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHRoaXNfWE1lbWJlckZlYXR1cmVDYWxsXzA7IAorICAgICAgICAgICAgICAgICAgICAgIGFmdGVyUGFyc2VyT3JFbnVtUnVsZUNhbGwoKTsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gLi4vb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3BhcnNlci9hbnRsci9pbnRlcm5hbC9JbnRlcm5hbEF1dGhvcml6YXRpb25EU0wuZzozMzAzOjE6ICggKCAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk9PiAoICgpICggKCBydWxlT3BQb3N0Zml4ICkgKSApICk/CisgICAgICAgICAgICBpbnQgYWx0NTU9MjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zZXJpYWxpemVyL0F1dGhvcml6YXRpb25EU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3NlcmlhbGl6ZXIvQXV0aG9yaXphdGlvbkRTTFNlbWFudGljU2VxdWVuY2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiMzQzNAotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zZXJpYWxpemVyL0F1dGhvcml6YXRpb25EU0xTZW1hbnRpY1NlcXVlbmNlci5qYXZhCkBAIC0wLDAgKzEsMTY5NCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2VyaWFsaXplcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTEltcG9ydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuT1NCUFR5cGVzUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25Nb2RlbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvblBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCZWFuOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmVhbkF0dHJpYnV0ZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJlYW5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwQWxsVXNlclRhc2tzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFByb2Nlc3M7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2s7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG87CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9BdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVEdG9SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHk7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlBdHRyaWJ1dGU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVFbnRpdHlSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy5Kdm1Gb3JtYWxQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bUlubmVyVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtTG93ZXJCb3VuZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVR5cGVQYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVVwcGVyQm91bmQ7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLkp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb21tb24udHlwZXMuVHlwZXNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYWNjZXB0b3IuSVNlbWFudGljU2VxdWVuY2VBY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFjY2VwdG9yLlNlcXVlbmNlRmVlZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuZGlhZ25vc3RpYy5JU2VtYW50aWNTZXF1ZW5jZXJEaWFnbm9zdGljUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5kaWFnbm9zdGljLklTZXJpYWxpemF0aW9uRGlhZ25vc3RpYy5BY2NlcHRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5HZW5lcmljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklTZW1hbnRpY05vZGVQcm92aWRlci5JTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVNlbWFudGljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklUcmFuc2llbnRWYWx1ZVNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5zZXF1ZW5jZXIuSVRyYW5zaWVudFZhbHVlU2VydmljZS5WYWx1ZVRyYW5zaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQXNzaWdubWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQmFzaWNGb3JMb29wRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQmluYXJ5T3BlcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhCbG9ja0V4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEJvb2xlYW5MaXRlcmFsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhDYXNlUGFydDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2FzdGVkRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YQ2F0Y2hDbGF1c2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENsb3N1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWENvbnN0cnVjdG9yQ2FsbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YRG9XaGlsZUV4cHJlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWEZlYXR1cmVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhGb3JMb29wRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YSWZFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhJbnN0YW5jZU9mRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTGlzdExpdGVyYWw7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWE1lbWJlckZlYXR1cmVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhOdWxsTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YTnVtYmVyTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YUG9zdGZpeE9wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YUmV0dXJuRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU2V0TGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3RyaW5nTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3dpdGNoRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YU3luY2hyb25pemVkRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVGhyb3dFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLlhUeXBlTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YVW5hcnlPcGVyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFZhcmlhYmxlRGVjbGFyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuWFdoaWxlRXhwcmVzc2lvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5YYmFzZVBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuc2VyaWFsaXplci5YYmFzZVdpdGhBbm5vdGF0aW9uc1NlbWFudGljU2VxdWVuY2VyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy54QW5ub3RhdGlvbnMuWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnhBbm5vdGF0aW9ucy5YQW5ub3RhdGlvbnNQYWNrYWdlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlhGdW5jdGlvblR5cGVSZWY7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueHR5cGUuWEltcG9ydERlY2xhcmF0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlhJbXBvcnRTZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lnh0eXBlLlh0eXBlUGFja2FnZTsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFNlbWFudGljU2VxdWVuY2VyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNTZW1hbnRpY1NlcXVlbmNlciB7CisKKwlASW5qZWN0CisJcHJpdmF0ZSBBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworCQorCXB1YmxpYyB2b2lkIGNyZWF0ZVNlcXVlbmNlKEVPYmplY3QgY29udGV4dCwgRU9iamVjdCBzZW1hbnRpY09iamVjdCkgeworCQlpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkFVVEhPUklaQVRJT05fTU9ERUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25Nb2RlbFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9BdXRob3JpemF0aW9uTW9kZWwoY29udGV4dCwgKEF1dGhvcml6YXRpb25Nb2RlbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuQVVUSE9SSVpBVElPTl9QQUNLQUdFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uUGFja2FnZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9BdXRob3JpemF0aW9uUGFja2FnZShjb250ZXh0LCAoQXV0aG9yaXphdGlvblBhY2thZ2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUm9sZShjb250ZXh0LCAoUm9sZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9CRUFOOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRWxlbWVudFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Sb2xlQmVhbihjb250ZXh0LCAoUm9sZUJlYW4pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9BVFRSSUJVVEU6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Sb2xlQmVhbkF0dHJpYnV0ZShjb250ZXh0LCAoUm9sZUJlYW5BdHRyaWJ1dGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkVBTl9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuRmVhdHVyZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Sb2xlQmVhblJlZmVyZW5jZShjb250ZXh0LCAoUm9sZUJlYW5SZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfQkxJUF9BTExfVVNFUl9UQVNLUzoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUm9sZUJsaXBBbGxVc2VyVGFza3MoY29udGV4dCwgKFJvbGVCbGlwQWxsVXNlclRhc2tzKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfUFJPQ0VTUzoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBQcm9jZXNzUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JvbGVCbGlwUHJvY2Vzcyhjb250ZXh0LCAoUm9sZUJsaXBQcm9jZXNzKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0JMSVBfVVNFUl9UQVNLOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmxpcFVzZXJUYXNrUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JvbGVCbGlwVXNlclRhc2soY29udGV4dCwgKFJvbGVCbGlwVXNlclRhc2spIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JvbGVEdG8oY29udGV4dCwgKFJvbGVEdG8pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRFRPX0FUVFJJQlVURToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvRmVhdHVyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Sb2xlRHRvQXR0cmlidXRlKGNvbnRleHQsIChSb2xlRHRvQXR0cmlidXRlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5ST0xFX0RUT19SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9GZWF0dXJlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9SZWZlcmVuY2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUm9sZUR0b1JlZmVyZW5jZShjb250ZXh0LCAoUm9sZUR0b1JlZmVyZW5jZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFk6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbGVtZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfUm9sZUVudGl0eShjb250ZXh0LCAoUm9sZUVudGl0eSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuUk9MRV9FTlRJVFlfQVRUUklCVVRFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlGZWF0dXJlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1JvbGVFbnRpdHlBdHRyaWJ1dGUoY29udGV4dCwgKFJvbGVFbnRpdHlBdHRyaWJ1dGUpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLlJPTEVfRU5USVRZX1JFRkVSRU5DRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUZlYXR1cmVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Sb2xlRW50aXR5UmVmZXJlbmNlKGNvbnRleHQsIChSb2xlRW50aXR5UmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gT1NCUFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBPU0JQVHlwZXNQYWNrYWdlLkxJTVBPUlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfQXV0aG9yaXphdGlvbkltcG9ydChjb250ZXh0LCAoTEltcG9ydCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IFR5cGVzUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0ZPUk1BTF9QQVJBTUVURVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfRnVsbEp2bUZvcm1hbFBhcmFtZXRlcihjb250ZXh0LCAoSnZtRm9ybWFsUGFyYW1ldGVyKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtRm9ybWFsUGFyYW1ldGVyKGNvbnRleHQsIChKdm1Gb3JtYWxQYXJhbWV0ZXIpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fR0VORVJJQ19BUlJBWV9UWVBFX1JFRkVSRU5DRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1UeXBlUmVmZXJlbmNlKGNvbnRleHQsIChKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX0lOTkVSX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1Jbm5lclR5cGVSZWZlcmVuY2VPdXRlckFjdGlvbl8xXzRfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRKdm1HZW5lcmljQXJyYXlUeXBlUmVmZXJlbmNlQ29tcG9uZW50VHlwZUFjdGlvbl8wXzFfMF8wKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UoY29udGV4dCwgKEp2bUlubmVyVHlwZVJlZmVyZW5jZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9MT1dFUl9CT1VORDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZEFuZGVkUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bUxvd2VyQm91bmRBbmRlZChjb250ZXh0LCAoSnZtTG93ZXJCb3VuZCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtTG93ZXJCb3VuZFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1Mb3dlckJvdW5kKGNvbnRleHQsIChKdm1Mb3dlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1BBUkFNRVRFUklaRURfVFlQRV9SRUZFUkVOQ0U6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUlubmVyVHlwZVJlZmVyZW5jZU91dGVyQWN0aW9uXzFfNF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldEp2bUdlbmVyaWNBcnJheVR5cGVSZWZlcmVuY2VDb21wb25lbnRUeXBlQWN0aW9uXzBfMV8wXzAoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFR5cGVzUGFja2FnZS5KVk1fVFlQRV9QQVJBTUVURVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bVR5cGVQYXJhbWV0ZXJSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfSnZtVHlwZVBhcmFtZXRlcihjb250ZXh0LCAoSnZtVHlwZVBhcmFtZXRlcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgVHlwZXNQYWNrYWdlLkpWTV9VUFBFUl9CT1VORDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVVwcGVyQm91bmRBbmRlZChjb250ZXh0LCAoSnZtVXBwZXJCb3VuZCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9Kdm1VcHBlckJvdW5kKGNvbnRleHQsIChKdm1VcHBlckJvdW5kKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBUeXBlc1BhY2thZ2UuSlZNX1dJTERDQVJEX1RZUEVfUkVGRVJFTkNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX0p2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZShjb250ZXh0LCAoSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWEFubm90YXRpb25zUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBYQW5ub3RhdGlvbnNQYWNrYWdlLlhBTk5PVEFUSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uKGNvbnRleHQsIChYQW5ub3RhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWEFubm90YXRpb25zUGFja2FnZS5YQU5OT1RBVElPTl9FTEVNRU5UX1ZBTFVFX1BBSVI6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpclJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXIoY29udGV4dCwgKFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCX0KKwkJZWxzZSBpZihzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IFhiYXNlUGFja2FnZS5lSU5TVEFOQ0UpIHN3aXRjaChzZW1hbnRpY09iamVjdC5lQ2xhc3MoKS5nZXRDbGFzc2lmaWVySUQoKSkgeworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEFTU0lHTk1FTlQ6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQXNzaWdubWVudF9YTWVtYmVyRmVhdHVyZUNhbGwoY29udGV4dCwgKFhBc3NpZ25tZW50KSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEJBU0lDX0ZPUl9MT09QX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQmFzaWNGb3JMb29wRXhwcmVzc2lvbihjb250ZXh0LCAoWEJhc2ljRm9yTG9vcEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQklOQVJZX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBZGRpdGl2ZUV4cHJlc3Npb25fWEFuZEV4cHJlc3Npb25fWEFzc2lnbm1lbnRfWEVxdWFsaXR5RXhwcmVzc2lvbl9YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uX1hPckV4cHJlc3Npb25fWE90aGVyT3BlcmF0b3JFeHByZXNzaW9uX1hSZWxhdGlvbmFsRXhwcmVzc2lvbihjb250ZXh0LCAoWEJpbmFyeU9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCTE9DS19FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhCbG9ja0V4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQmxvY2tFeHByZXNzaW9uKGNvbnRleHQsIChYQmxvY2tFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YRXhwcmVzc2lvbkluQ2xvc3VyZShjb250ZXh0LCAoWEJsb2NrRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhCT09MRUFOX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEJvb2xlYW5MaXRlcmFsKGNvbnRleHQsIChYQm9vbGVhbkxpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FTRV9QQVJUOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzZVBhcnRSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENhc2VQYXJ0KGNvbnRleHQsIChYQ2FzZVBhcnQpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FTVEVEX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ2FzdGVkRXhwcmVzc2lvbihjb250ZXh0LCAoWENhc3RlZEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0FUQ0hfQ0xBVVNFOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2F0Y2hDbGF1c2VSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWENhdGNoQ2xhdXNlKGNvbnRleHQsIChYQ2F0Y2hDbGF1c2UpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YQ0xPU1VSRToKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2xvc3VyZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hDbG9zdXJlKGNvbnRleHQsIChYQ2xvc3VyZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFNob3J0Q2xvc3VyZVJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU2hvcnRDbG9zdXJlKGNvbnRleHQsIChYQ2xvc3VyZSkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhDT05TVFJVQ1RPUl9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YQ29uc3RydWN0b3JDYWxsKGNvbnRleHQsIChYQ29uc3RydWN0b3JDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWERPX1dISUxFX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WERvV2hpbGVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWERvV2hpbGVFeHByZXNzaW9uKGNvbnRleHQsIChYRG9XaGlsZUV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YRkVBVFVSRV9DQUxMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hGZWF0dXJlQ2FsbChjb250ZXh0LCAoWEZlYXR1cmVDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWEZPUl9MT09QX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZvckxvb3BFeHByZXNzaW9uKGNvbnRleHQsIChYRm9yTG9vcEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YSUZfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYSWZFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWElmRXhwcmVzc2lvbihjb250ZXh0LCAoWElmRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhJTlNUQU5DRV9PRl9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFJlbGF0aW9uYWxFeHByZXNzaW9uKGNvbnRleHQsIChYSW5zdGFuY2VPZkV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTElTVF9MSVRFUkFMOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlX1hMaXN0TGl0ZXJhbChjb250ZXh0LCAoWExpc3RMaXRlcmFsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpc3RMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWExpc3RMaXRlcmFsKGNvbnRleHQsIChYTGlzdExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YTUVNQkVSX0ZFQVRVUkVfQ0FMTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hNZW1iZXJGZWF0dXJlQ2FsbChjb250ZXh0LCAoWE1lbWJlckZlYXR1cmVDYWxsKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWE5VTExfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTnVsbExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YTnVsbExpdGVyYWwoY29udGV4dCwgKFhOdWxsTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhOVU1CRVJfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTnVtYmVyTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hOdW1iZXJMaXRlcmFsKGNvbnRleHQsIChYTnVtYmVyTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhQT1NURklYX09QRVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hQb3N0Zml4T3BlcmF0aW9uKGNvbnRleHQsIChYUG9zdGZpeE9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhSRVRVUk5fRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJldHVybkV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFVuYXJ5T3BlcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hSZXR1cm5FeHByZXNzaW9uKGNvbnRleHQsIChYUmV0dXJuRXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhTRVRfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ29sbGVjdGlvbkxpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTZXRMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU2V0TGl0ZXJhbChjb250ZXh0LCAoWFNldExpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1RSSU5HX0xJVEVSQUw6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WExpdGVyYWxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTdHJpbmdMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3RyaW5nTGl0ZXJhbChjb250ZXh0LCAoWFN0cmluZ0xpdGVyYWwpIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1dJVENIX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTd2l0Y2hFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3dpdGNoRXhwcmVzc2lvbihjb250ZXh0LCAoWFN3aXRjaEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YU1lOQ0hST05JWkVEX0VYUFJFU1NJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YU3luY2hyb25pemVkRXhwcmVzc2lvbihjb250ZXh0LCAoWFN5bmNocm9uaXplZEV4cHJlc3Npb24pIHNlbWFudGljT2JqZWN0KTsgCisJCQkJCXJldHVybjsgCisJCQkJfQorCQkJCWVsc2UgYnJlYWs7CisJCQljYXNlIFhiYXNlUGFja2FnZS5YVEhST1dfRVhQUkVTU0lPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFRocm93RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFRocm93RXhwcmVzc2lvbihjb250ZXh0LCAoWFRocm93RXhwcmVzc2lvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhUUllfQ0FUQ0hfRklOQUxMWV9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24oY29udGV4dCwgKFhUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJY2FzZSBYYmFzZVBhY2thZ2UuWFRZUEVfTElURVJBTDoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0WExpc3RMaXRlcmFsRWxlbWVudHNBY3Rpb25fMV8xXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFhDYXN0ZWRFeHByZXNzaW9uVGFyZ2V0QWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTGl0ZXJhbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WEFzc2lnbm1lbnRBc3NpZ25hYmxlQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhNZW1iZXJGZWF0dXJlQ2FsbE1lbWJlckNhbGxUYXJnZXRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpLmdldFhQb3N0Zml4T3BlcmF0aW9uT3BlcmFuZEFjdGlvbl8xXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQcmltYXJ5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhJbnN0YW5jZU9mRXhwcmVzc2lvbkV4cHJlc3Npb25BY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFR5cGVMaXRlcmFsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVHlwZUxpdGVyYWwoY29udGV4dCwgKFhUeXBlTGl0ZXJhbCkgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhVTkFSWV9PUEVSQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFkZGl0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFuZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEFjY2VzcygpLmdldFhMaXN0TGl0ZXJhbEVsZW1lbnRzQWN0aW9uXzFfMV8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRSdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEFzc2lnbm1lbnRBY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQ2FzdGVkRXhwcmVzc2lvblRhcmdldEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXF1YWxpdHlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpLmdldFhBc3NpZ25tZW50QXNzaWduYWJsZUFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYTWVtYmVyRmVhdHVyZUNhbGxNZW1iZXJDYWxsVGFyZ2V0QWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRYUG9zdGZpeE9wZXJhdGlvbk9wZXJhbmRBY3Rpb25fMV8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYSW5zdGFuY2VPZkV4cHJlc3Npb25FeHByZXNzaW9uQWN0aW9uXzFfMF8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YVW5hcnlPcGVyYXRpb24oY29udGV4dCwgKFhVbmFyeU9wZXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhWQVJJQUJMRV9ERUNMQVJBVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhWYXJpYWJsZURlY2xhcmF0aW9uUnVsZSgpKSB7CisJCQkJCXNlcXVlbmNlX1hWYXJpYWJsZURlY2xhcmF0aW9uKGNvbnRleHQsIChYVmFyaWFibGVEZWNsYXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWGJhc2VQYWNrYWdlLlhXSElMRV9FWFBSRVNTSU9OOgorCQkJCWlmKGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQWRkaXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKS5nZXRYTGlzdExpdGVyYWxFbGVtZW50c0FjdGlvbl8xXzFfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50UnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhBc3NpZ25tZW50QWNjZXNzKCkuZ2V0WEJpbmFyeU9wZXJhdGlvbkxlZnRPcGVyYW5kQWN0aW9uXzFfMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhDYXN0ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WENhc3RlZEV4cHJlc3Npb25UYXJnZXRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhFcXVhbGl0eUV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRYQXNzaWdubWVudEFzc2lnbmFibGVBY3Rpb25fMV8wXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCkuZ2V0WE1lbWJlckZlYXR1cmVDYWxsTWVtYmVyQ2FsbFRhcmdldEFjdGlvbl8xXzFfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8wXzBfMCgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPckV4cHJlc3Npb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpLmdldFhCaW5hcnlPcGVyYXRpb25MZWZ0T3BlcmFuZEFjdGlvbl8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhQb3N0Zml4T3BlcmF0aW9uQWNjZXNzKCkuZ2V0WFBvc3RmaXhPcGVyYXRpb25PcGVyYW5kQWN0aW9uXzFfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFByaW1hcnlFeHByZXNzaW9uUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhSZWxhdGlvbmFsRXhwcmVzc2lvblJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRYQmluYXJ5T3BlcmF0aW9uTGVmdE9wZXJhbmRBY3Rpb25fMV8xXzBfMF8wKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkuZ2V0WEluc3RhbmNlT2ZFeHByZXNzaW9uRXhwcmVzc2lvbkFjdGlvbl8xXzBfMF8wXzAoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRYVW5hcnlPcGVyYXRpb25SdWxlKCkgfHwKKwkJCQkgICBjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WFdoaWxlRXhwcmVzc2lvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YV2hpbGVFeHByZXNzaW9uKGNvbnRleHQsIChYV2hpbGVFeHByZXNzaW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQllbHNlIGlmKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldEVQYWNrYWdlKCkgPT0gWHR5cGVQYWNrYWdlLmVJTlNUQU5DRSkgc3dpdGNoKHNlbWFudGljT2JqZWN0LmVDbGFzcygpLmdldENsYXNzaWZpZXJJRCgpKSB7CisJCQljYXNlIFh0eXBlUGFja2FnZS5YRlVOQ1RJT05fVFlQRV9SRUY6CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZVJ1bGUoKSB8fAorCQkJCSAgIGNvbnRleHQgPT0gZ3JhbW1hckFjY2Vzcy5nZXRKdm1UeXBlUmVmZXJlbmNlUnVsZSgpIHx8CisJCQkJICAgY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhGdW5jdGlvblR5cGVSZWZSdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEZ1bmN0aW9uVHlwZVJlZihjb250ZXh0LCAoWEZ1bmN0aW9uVHlwZVJlZikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhJTVBPUlRfREVDTEFSQVRJT046CisJCQkJaWYoY29udGV4dCA9PSBncmFtbWFyQWNjZXNzLmdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSkgeworCQkJCQlzZXF1ZW5jZV9YSW1wb3J0RGVjbGFyYXRpb24oY29udGV4dCwgKFhJbXBvcnREZWNsYXJhdGlvbikgc2VtYW50aWNPYmplY3QpOyAKKwkJCQkJcmV0dXJuOyAKKwkJCQl9CisJCQkJZWxzZSBicmVhazsKKwkJCWNhc2UgWHR5cGVQYWNrYWdlLlhJTVBPUlRfU0VDVElPTjoKKwkJCQlpZihjb250ZXh0ID09IGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydFNlY3Rpb25SdWxlKCkpIHsKKwkJCQkJc2VxdWVuY2VfWEltcG9ydFNlY3Rpb24oY29udGV4dCwgKFhJbXBvcnRTZWN0aW9uKSBzZW1hbnRpY09iamVjdCk7IAorCQkJCQlyZXR1cm47IAorCQkJCX0KKwkJCQllbHNlIGJyZWFrOworCQkJfQorCQlpZiAoZXJyb3JBY2NlcHRvciAhPSBudWxsKSBlcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlSW52YWxpZENvbnRleHRPclR5cGVEaWFnbm9zdGljKHNlbWFudGljT2JqZWN0LCBjb250ZXh0KSk7CisJfQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGltcG9ydGVkTmFtZXNwYWNlPUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQXV0aG9yaXphdGlvbkltcG9ydChFT2JqZWN0IGNvbnRleHQsIExJbXBvcnQgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgT1NCUFR5cGVzUGFja2FnZS5MaXRlcmFscy5MSU1QT1JUX19JTVBPUlRFRF9OQU1FU1BBQ0UpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRJbXBvcnRlZE5hbWVzcGFjZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wKCksIHNlbWFudGljT2JqZWN0LmdldEltcG9ydGVkTmFtZXNwYWNlKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIHBja2c9QXV0aG9yaXphdGlvblBhY2thZ2UKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9BdXRob3JpemF0aW9uTW9kZWwoRU9iamVjdCBjb250ZXh0LCBBdXRob3JpemF0aW9uTW9kZWwgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuQVVUSE9SSVpBVElPTl9NT0RFTF9fUENLRykgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5BVVRIT1JJWkFUSU9OX01PREVMX19QQ0tHKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRBdXRob3JpemF0aW9uTW9kZWxBY2Nlc3MoKS5nZXRQY2tnQXV0aG9yaXphdGlvblBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wKCksIHNlbWFudGljT2JqZWN0LmdldFBja2coKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9UXVhbGlmaWVkTmFtZSBpbXBvcnRzKz1BdXRob3JpemF0aW9uSW1wb3J0KiByb2xlcys9Um9sZSopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfQXV0aG9yaXphdGlvblBhY2thZ2UoRU9iamVjdCBjb250ZXh0LCBBdXRob3JpemF0aW9uUGFja2FnZSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGJlYW5BdHRyaUNvbD1bTEJlYW5BdHRyaWJ1dGV8SURdIGJlYW5BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1JvbGVCZWFuQXR0cmlidXRlKEVPYmplY3QgY29udGV4dCwgUm9sZUJlYW5BdHRyaWJ1dGUgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CRUFOX0ZFQVRVUkVfX0JFQU5fQVRUUklfQ09MKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTl9GRUFUVVJFX19CRUFOX0FUVFJJX0NPTCkpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTl9BVFRSSUJVVEVfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTl9BVFRSSUJVVEVfX0JFQU5fQVRUUklfVU5BVVRIT1JJWkVEKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpLmdldEJlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldEJlYW5BdHRyaUNvbCgpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFJvbGVCZWFuQXR0cmlidXRlQWNjZXNzKCkuZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChiZWFuQXR0cmlDb2w9W0xCZWFuUmVmZXJlbmNlfElEXSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlQmVhblJlZmVyZW5jZShFT2JqZWN0IGNvbnRleHQsIFJvbGVCZWFuUmVmZXJlbmNlIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkVBTl9GRUFUVVJFX19CRUFOX0FUVFJJX0NPTCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0JFQU5fRkVBVFVSRV9fQkVBTl9BVFRSSV9DT0wpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0JFQU5fUkVGRVJFTkNFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0JFQU5fUkVGRVJFTkNFX19CRUFOX0FUVFJJX1VOQVVUSE9SSVpFRCkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJlYW5SZWZlcmVuY2VBY2Nlc3MoKS5nZXRCZWFuQXR0cmlDb2xMQmVhblJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpLCBzZW1hbnRpY09iamVjdC5nZXRCZWFuQXR0cmlDb2woKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldEJlYW5BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCksIHNlbWFudGljT2JqZWN0LmdldEJlYW5BdHRyaVVuYXV0aG9yaXplZCgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoYmVhblJlZj1bTEJlYW58SURdIGJlYW5BdXRob3JpemVkKz1Sb2xlRW51bSsgYmVhbkZlYXR1cmVzKz1Sb2xlQmVhbkZlYXR1cmUqKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1JvbGVCZWFuKEVPYmplY3QgY29udGV4dCwgUm9sZUJlYW4gc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIGF1dGhvcml6ZWQ9Um9sZUJsaXBVc2VyVGFza0VudW0KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlQmxpcEFsbFVzZXJUYXNrcyhFT2JqZWN0IGNvbnRleHQsIFJvbGVCbGlwQWxsVXNlclRhc2tzIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkxJUF9BTExfVVNFUl9UQVNLU19fQVVUSE9SSVpFRCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0JMSVBfQUxMX1VTRVJfVEFTS1NfX0FVVEhPUklaRUQpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkuZ2V0QXV0aG9yaXplZFJvbGVCbGlwVXNlclRhc2tFbnVtRW51bVJ1bGVDYWxsXzNfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRBdXRob3JpemVkKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChwcm9jZXNzPVtCbGlwfElEXSBwcm9jZXNzU3RhcnRBdXRob3JpemVkPVJvbGVCbGlwUHJvY2Vzc0VudW0/IGFsbFVzZXJUYXNrcz1Sb2xlQmxpcEFsbFVzZXJUYXNrcz8gdXNlclRhc2tzKz1Sb2xlQmxpcFVzZXJUYXNrKikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlQmxpcFByb2Nlc3MoRU9iamVjdCBjb250ZXh0LCBSb2xlQmxpcFByb2Nlc3Mgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgICh1c2VyVGFzaz1bQmxpcFVzZXJUYXNrfFF1YWxpZmllZE5hbWVdIGF1dGhvcml6ZWQ9Um9sZUJsaXBVc2VyVGFza0VudW0pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUm9sZUJsaXBVc2VyVGFzayhFT2JqZWN0IGNvbnRleHQsIFJvbGVCbGlwVXNlclRhc2sgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CTElQX1VTRVJfVEFTS19fVVNFUl9UQVNLKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkxJUF9VU0VSX1RBU0tfX1VTRVJfVEFTSykpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfQkxJUF9VU0VSX1RBU0tfX0FVVEhPUklaRUQpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CTElQX1VTRVJfVEFTS19fQVVUSE9SSVpFRCkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldFVzZXJUYXNrQmxpcFVzZXJUYXNrUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldFVzZXJUYXNrKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpLmdldEF1dGhvcml6ZWRSb2xlQmxpcFVzZXJUYXNrRW51bUVudW1SdWxlQ2FsbF8zXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0QXV0aG9yaXplZCgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZHRvQXR0cmlDb2w9W0xEdG9BdHRyaWJ1dGV8SURdIGR0b0F0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW0pCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUm9sZUR0b0F0dHJpYnV0ZShFT2JqZWN0IGNvbnRleHQsIFJvbGVEdG9BdHRyaWJ1dGUgc2VtYW50aWNPYmplY3QpIHsKKwkJaWYoZXJyb3JBY2NlcHRvciAhPSBudWxsKSB7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9EVE9fRkVBVFVSRV9fRFRPX0FUVFJJX0NPTCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0RUT19GRUFUVVJFX19EVE9fQVRUUklfQ09MKSk7CisJCQlpZih0cmFuc2llbnRWYWx1ZXMuaXNWYWx1ZVRyYW5zaWVudChzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9EVE9fQVRUUklCVVRFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRFRPX0FUVFJJQlVURV9fRFRPX0FUVFJJX1VOQVVUSE9SSVpFRCkpOworCQl9CisJCUlOb2Rlc0ZvckVPYmplY3RQcm92aWRlciBub2RlcyA9IGNyZWF0ZU5vZGVQcm92aWRlcihzZW1hbnRpY09iamVjdCk7CisJCVNlcXVlbmNlRmVlZGVyIGZlZWRlciA9IGNyZWF0ZVNlcXVlbmNlckZlZWRlcihzZW1hbnRpY09iamVjdCwgbm9kZXMpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpLmdldER0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpLCBzZW1hbnRpY09iamVjdC5nZXREdG9BdHRyaUNvbCgpKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXREdG9BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wKCksIHNlbWFudGljT2JqZWN0LmdldER0b0F0dHJpVW5hdXRob3JpemVkKCkpOworCQlmZWVkZXIuZmluaXNoKCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChkdG9BdHRyaUNvbD1bTER0b1JlZmVyZW5jZXxJRF0gZHRvQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlRHRvUmVmZXJlbmNlKEVPYmplY3QgY29udGV4dCwgUm9sZUR0b1JlZmVyZW5jZSBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0RUT19GRUFUVVJFX19EVE9fQVRUUklfQ09MKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRFRPX0ZFQVRVUkVfX0RUT19BVFRSSV9DT0wpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0RUT19SRUZFUkVOQ0VfX0RUT19BVFRSSV9VTkFVVEhPUklaRUQpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9EVE9fUkVGRVJFTkNFX19EVE9fQVRUUklfVU5BVVRIT1JJWkVEKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkuZ2V0RHRvQXR0cmlDb2xMRHRvUmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldER0b0F0dHJpQ29sKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldER0b0F0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWQoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGR0b1JlZj1bTER0b3xJRF0gZHRvQXV0aG9yaXplZCs9Um9sZUVudW0rIGR0b0ZlYXR1cmVzKz1Sb2xlRHRvRmVhdHVyZSopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUm9sZUR0byhFT2JqZWN0IGNvbnRleHQsIFJvbGVEdG8gc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorCQorCQorCS8qKgorCSAqIENvbnN0cmFpbnQ6CisJICogICAgIChlbnRpdHlBdHRyaUNvbD1bTEVudGl0eUF0dHJpYnV0ZXxJRF0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bSkKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlRW50aXR5QXR0cmlidXRlKEVPYmplY3QgY29udGV4dCwgUm9sZUVudGl0eUF0dHJpYnV0ZSBzZW1hbnRpY09iamVjdCkgeworCQlpZihlcnJvckFjY2VwdG9yICE9IG51bGwpIHsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0VOVElUWV9GRUFUVVJFX19FTlRJVFlfQVRUUklfQ09MKSA9PSBWYWx1ZVRyYW5zaWVudC5ZRVMpCisJCQkJZXJyb3JBY2NlcHRvci5hY2NlcHQoZGlhZ25vc3RpY1Byb3ZpZGVyLmNyZWF0ZUZlYXR1cmVWYWx1ZU1pc3Npbmcoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wpKTsKKwkJCWlmKHRyYW5zaWVudFZhbHVlcy5pc1ZhbHVlVHJhbnNpZW50KHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0VOVElUWV9BVFRSSUJVVEVfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9FTlRJVFlfQVRUUklCVVRFX19FTlRJVFlfQVRUUklfVU5BVVRIT1JJWkVEKSk7CisJCX0KKwkJSU5vZGVzRm9yRU9iamVjdFByb3ZpZGVyIG5vZGVzID0gY3JlYXRlTm9kZVByb3ZpZGVyKHNlbWFudGljT2JqZWN0KTsKKwkJU2VxdWVuY2VGZWVkZXIgZmVlZGVyID0gY3JlYXRlU2VxdWVuY2VyRmVlZGVyKHNlbWFudGljT2JqZWN0LCBub2Rlcyk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlDb2xMRW50aXR5QXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCksIHNlbWFudGljT2JqZWN0LmdldEVudGl0eUF0dHJpQ29sKCkpOworCQlmZWVkZXIuYWNjZXB0KGdyYW1tYXJBY2Nlc3MuZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZUFjY2VzcygpLmdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSwgc2VtYW50aWNPYmplY3QuZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWQoKSk7CisJCWZlZWRlci5maW5pc2goKTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKGVudGl0eUF0dHJpQ29sPVtMRW50aXR5UmVmZXJlbmNlfElEXSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtKQorCSAqLworCXByb3RlY3RlZCB2b2lkIHNlcXVlbmNlX1JvbGVFbnRpdHlSZWZlcmVuY2UoRU9iamVjdCBjb250ZXh0LCBSb2xlRW50aXR5UmVmZXJlbmNlIHNlbWFudGljT2JqZWN0KSB7CisJCWlmKGVycm9yQWNjZXB0b3IgIT0gbnVsbCkgeworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRU5USVRZX0ZFQVRVUkVfX0VOVElUWV9BVFRSSV9DT0wpID09IFZhbHVlVHJhbnNpZW50LllFUykKKwkJCQllcnJvckFjY2VwdG9yLmFjY2VwdChkaWFnbm9zdGljUHJvdmlkZXIuY3JlYXRlRmVhdHVyZVZhbHVlTWlzc2luZyhzZW1hbnRpY09iamVjdCwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9FTlRJVFlfRkVBVFVSRV9fRU5USVRZX0FUVFJJX0NPTCkpOworCQkJaWYodHJhbnNpZW50VmFsdWVzLmlzVmFsdWVUcmFuc2llbnQoc2VtYW50aWNPYmplY3QsIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLkxpdGVyYWxzLlJPTEVfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZX0FUVFJJX1VOQVVUSE9SSVpFRCkgPT0gVmFsdWVUcmFuc2llbnQuWUVTKQorCQkJCWVycm9yQWNjZXB0b3IuYWNjZXB0KGRpYWdub3N0aWNQcm92aWRlci5jcmVhdGVGZWF0dXJlVmFsdWVNaXNzaW5nKHNlbWFudGljT2JqZWN0LCBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWV9BVFRSSV9VTkFVVEhPUklaRUQpKTsKKwkJfQorCQlJTm9kZXNGb3JFT2JqZWN0UHJvdmlkZXIgbm9kZXMgPSBjcmVhdGVOb2RlUHJvdmlkZXIoc2VtYW50aWNPYmplY3QpOworCQlTZXF1ZW5jZUZlZWRlciBmZWVkZXIgPSBjcmVhdGVTZXF1ZW5jZXJGZWVkZXIoc2VtYW50aWNPYmplY3QsIG5vZGVzKTsKKwkJZmVlZGVyLmFjY2VwdChncmFtbWFyQWNjZXNzLmdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRFbnRpdHlBdHRyaUNvbExFbnRpdHlSZWZlcmVuY2VJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEoKSwgc2VtYW50aWNPYmplY3QuZ2V0RW50aXR5QXR0cmlDb2woKSk7CisJCWZlZWRlci5hY2NlcHQoZ3JhbW1hckFjY2Vzcy5nZXRSb2xlRW50aXR5UmVmZXJlbmNlQWNjZXNzKCkuZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpLCBzZW1hbnRpY09iamVjdC5nZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZCgpKTsKKwkJZmVlZGVyLmZpbmlzaCgpOworCX0KKwkKKwkKKwkvKioKKwkgKiBDb25zdHJhaW50OgorCSAqICAgICAoZW50aXR5UmVmPVtMRW50aXR5fElEXSBlbnRpdHlBdXRob3JpemVkKz1Sb2xlRW51bSsgZW50aXR5RmVhdHVyZXMrPVJvbGVFbnRpdHlGZWF0dXJlKikKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBzZXF1ZW5jZV9Sb2xlRW50aXR5KEVPYmplY3QgY29udGV4dCwgUm9sZUVudGl0eSBzZW1hbnRpY09iamVjdCkgeworCQlnZW5lcmljU2VxdWVuY2VyLmNyZWF0ZVNlcXVlbmNlKGNvbnRleHQsIHNlbWFudGljT2JqZWN0KTsKKwl9CisJCisJCisJLyoqCisJICogQ29uc3RyYWludDoKKwkgKiAgICAgKG5hbWU9VFJBTlNMQVRBQkxFSUQgcm9sZUVsZW1lbnRzKz1Sb2xlRWxlbWVudCopCisJICovCisJcHJvdGVjdGVkIHZvaWQgc2VxdWVuY2VfUm9sZShFT2JqZWN0IGNvbnRleHQsIFJvbGUgc2VtYW50aWNPYmplY3QpIHsKKwkJZ2VuZXJpY1NlcXVlbmNlci5jcmVhdGVTZXF1ZW5jZShjb250ZXh0LCBzZW1hbnRpY09iamVjdCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3NlcmlhbGl6ZXIvQXV0aG9yaXphdGlvbkRTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3NlcmlhbGl6ZXIvQXV0aG9yaXphdGlvbkRTTFN5bnRhY3RpY1NlcXVlbmNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNmYyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvc2VyaWFsaXplci9BdXRob3JpemF0aW9uRFNMU3ludGFjdGljU2VxdWVuY2VyLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcmlhbGl6ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LklHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LlJ1bGVDYWxsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5vZGVtb2RlbC5JTm9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLkdyYW1tYXJBbGlhcy5BYnN0cmFjdEVsZW1lbnRBbGlhczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLkdyYW1tYXJBbGlhcy5Hcm91cEFsaWFzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuYW5hbHlzaXMuR3JhbW1hckFsaWFzLlRva2VuQWxpYXM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2VyaWFsaXplci5hbmFseXNpcy5JU3ludGFjdGljU2VxdWVuY2VyUERBUHJvdmlkZXIuSVN5bk5hdmlnYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLmFuYWx5c2lzLklTeW50YWN0aWNTZXF1ZW5jZXJQREFQcm92aWRlci5JU3luVHJhbnNpdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJpYWxpemVyLnNlcXVlbmNlci5BYnN0cmFjdFN5bnRhY3RpY1NlcXVlbmNlcjsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFN5bnRhY3RpY1NlcXVlbmNlciBleHRlbmRzIEFic3RyYWN0U3ludGFjdGljU2VxdWVuY2VyIHsKKworCXByb3RlY3RlZCBBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xOworCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRBbGlhcyBtYXRjaF9YSW1wb3J0RGVjbGFyYXRpb25fU2VtaWNvbG9uS2V5d29yZF8yX3E7CisJcHJvdGVjdGVkIEFic3RyYWN0RWxlbWVudEFsaWFzIG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfYTsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RFbGVtZW50QWxpYXMgbWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wOworCQorCUBJbmplY3QKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KElHcmFtbWFyQWNjZXNzIGFjY2VzcykgeworCQlncmFtbWFyQWNjZXNzID0gKEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzKSBhY2Nlc3M7CisJCW1hdGNoX1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xID0gbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wKCkpLCBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WEFubm90YXRpb25BY2Nlc3MoKS5nZXRSaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzIoKSkpOworCQltYXRjaF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3EgPSBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8yXzEoKSk7CisJCW1hdGNoX1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3EgPSBuZXcgVG9rZW5BbGlhcyhmYWxzZSwgdHJ1ZSwgZ3JhbW1hckFjY2Vzcy5nZXRYRXhwcmVzc2lvbkluQ2xvc3VyZUFjY2VzcygpLmdldFNlbWljb2xvbktleXdvcmRfMV8xKCkpOworCQltYXRjaF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xID0gbmV3IEdyb3VwQWxpYXMoZmFsc2UsIHRydWUsIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzAoKSksIG5ldyBUb2tlbkFsaWFzKGZhbHNlLCBmYWxzZSwgZ3JhbW1hckFjY2Vzcy5nZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yKCkpKTsKKwkJbWF0Y2hfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xID0gbmV3IFRva2VuQWxpYXMoZmFsc2UsIHRydWUsIGdyYW1tYXJBY2Nlc3MuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCkuZ2V0U2VtaWNvbG9uS2V5d29yZF8yKCkpOworCQltYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2EgPSBuZXcgVG9rZW5BbGlhcyh0cnVlLCB0cnVlLCBncmFtbWFyQWNjZXNzLmdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldExlZnRQYXJlbnRoZXNpc0tleXdvcmRfMCgpKTsKKwkJbWF0Y2hfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9wID0gbmV3IFRva2VuQWxpYXModHJ1ZSwgZmFsc2UsIGdyYW1tYXJBY2Nlc3MuZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkuZ2V0TGVmdFBhcmVudGhlc2lzS2V5d29yZF8wKCkpOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwcm90ZWN0ZWQgU3RyaW5nIGdldFVuYXNzaWduZWRSdWxlQ2FsbFRva2VuKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBJTm9kZSBub2RlKSB7CisJCWlmKHJ1bGVDYWxsLmdldFJ1bGUoKSA9PSBncmFtbWFyQWNjZXNzLmdldEFycmF5QnJhY2tldHNSdWxlKCkpCisJCQlyZXR1cm4gZ2V0QXJyYXlCcmFja2V0c1Rva2VuKHNlbWFudGljT2JqZWN0LCBydWxlQ2FsbCwgbm9kZSk7CisJCWVsc2UgaWYocnVsZUNhbGwuZ2V0UnVsZSgpID09IGdyYW1tYXJBY2Nlc3MuZ2V0T3BTaW5nbGVBc3NpZ25SdWxlKCkpCisJCQlyZXR1cm4gZ2V0T3BTaW5nbGVBc3NpZ25Ub2tlbihzZW1hbnRpY09iamVjdCwgcnVsZUNhbGwsIG5vZGUpOworCQlyZXR1cm4gIiI7CisJfQorCQorCS8qKgorCSAqIEFycmF5QnJhY2tldHMgOgorCSAqIAknWycgJ10nCisJICogOworCSAqLworCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJyYXlCcmFja2V0c1Rva2VuKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIFJ1bGVDYWxsIHJ1bGVDYWxsLCBJTm9kZSBub2RlKSB7CisJCWlmIChub2RlICE9IG51bGwpCisJCQlyZXR1cm4gZ2V0VG9rZW5UZXh0KG5vZGUpOworCQlyZXR1cm4gIltdIjsKKwl9CisJCisJLyoqCisJICogT3BTaW5nbGVBc3NpZ246CisJICogCSc9JworCSAqIDsKKwkgKi8KKwlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wU2luZ2xlQXNzaWduVG9rZW4oRU9iamVjdCBzZW1hbnRpY09iamVjdCwgUnVsZUNhbGwgcnVsZUNhbGwsIElOb2RlIG5vZGUpIHsKKwkJaWYgKG5vZGUgIT0gbnVsbCkKKwkJCXJldHVybiBnZXRUb2tlblRleHQobm9kZSk7CisJCXJldHVybiAiPSI7CisJfQorCQorCUBPdmVycmlkZQorCXByb3RlY3RlZCB2b2lkIGVtaXRVbmFzc2lnbmVkVG9rZW5zKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5UcmFuc2l0aW9uIHRyYW5zaXRpb24sIElOb2RlIGZyb21Ob2RlLCBJTm9kZSB0b05vZGUpIHsKKwkJaWYgKHRyYW5zaXRpb24uZ2V0QW1iaWd1b3VzU3ludGF4ZXMoKS5pc0VtcHR5KCkpIHJldHVybjsKKwkJTGlzdDxJTm9kZT4gdHJhbnNpdGlvbk5vZGVzID0gY29sbGVjdE5vZGVzKGZyb21Ob2RlLCB0b05vZGUpOworCQlmb3IgKEFic3RyYWN0RWxlbWVudEFsaWFzIHN5bnRheCA6IHRyYW5zaXRpb24uZ2V0QW1iaWd1b3VzU3ludGF4ZXMoKSkgeworCQkJTGlzdDxJTm9kZT4gc3ludGF4Tm9kZXMgPSBnZXROb2Rlc0Zvcih0cmFuc2l0aW9uTm9kZXMsIHN5bnRheCk7CisJCQlpZihtYXRjaF9YQW5ub3RhdGlvbl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfM18wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzNfMl9fcS5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hBbm5vdGF0aW9uX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8zXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfM18yX19xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YQmxvY2tFeHByZXNzaW9uX1NlbWljb2xvbktleXdvcmRfMl8xX3Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YRXhwcmVzc2lvbkluQ2xvc3VyZV9TZW1pY29sb25LZXl3b3JkXzFfMV9xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YRnVuY3Rpb25UeXBlUmVmX19fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wXzBfUmlnaHRQYXJlbnRoZXNpc0tleXdvcmRfMF8yX19xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcShzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgaWYobWF0Y2hfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xLmVxdWFscyhzeW50YXgpKQorCQkJCWVtaXRfWEltcG9ydERlY2xhcmF0aW9uX1NlbWljb2xvbktleXdvcmRfMl9xKHNlbWFudGljT2JqZWN0LCBnZXRMYXN0TmF2aWdhYmxlU3RhdGUoKSwgc3ludGF4Tm9kZXMpOworCQkJZWxzZSBpZihtYXRjaF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2EuZXF1YWxzKHN5bnRheCkpCisJCQkJZW1pdF9YUGFyZW50aGVzaXplZEV4cHJlc3Npb25fTGVmdFBhcmVudGhlc2lzS2V5d29yZF8wX2Eoc2VtYW50aWNPYmplY3QsIGdldExhc3ROYXZpZ2FibGVTdGF0ZSgpLCBzeW50YXhOb2Rlcyk7CisJCQllbHNlIGlmKG1hdGNoX1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcC5lcXVhbHMoc3ludGF4KSkKKwkJCQllbWl0X1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcChzZW1hbnRpY09iamVjdCwgZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJCWVsc2UgYWNjZXB0Tm9kZXMoZ2V0TGFzdE5hdmlnYWJsZVN0YXRlKCksIHN5bnRheE5vZGVzKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKCcoJyAnKScpPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEFubm90YXRpb25fX19MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzNfMF9SaWdodFBhcmVudGhlc2lzS2V5d29yZF8zXzJfX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJzsnPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEJsb2NrRXhwcmVzc2lvbl9TZW1pY29sb25LZXl3b3JkXzJfMV9xKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICc7Jz8KKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hFeHByZXNzaW9uSW5DbG9zdXJlX1NlbWljb2xvbktleXdvcmRfMV8xX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgKCcoJyAnKScpPworCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWEZ1bmN0aW9uVHlwZVJlZl9fX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF8wX1JpZ2h0UGFyZW50aGVzaXNLZXl3b3JkXzBfMl9fcShFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCisJLyoqCisJICogU3ludGF4OgorCSAqICAgICAnOyc/CisJICovCisJcHJvdGVjdGVkIHZvaWQgZW1pdF9YSW1wb3J0RGVjbGFyYXRpb25fU2VtaWNvbG9uS2V5d29yZF8yX3EoRU9iamVjdCBzZW1hbnRpY09iamVjdCwgSVN5bk5hdmlnYWJsZSB0cmFuc2l0aW9uLCBMaXN0PElOb2RlPiBub2RlcykgeworCQlhY2NlcHROb2Rlcyh0cmFuc2l0aW9uLCBub2Rlcyk7CisJfQorCQorCS8qKgorCSAqIFN5bnRheDoKKwkgKiAgICAgJygnKgorCSAqLworCXByb3RlY3RlZCB2b2lkIGVtaXRfWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uX0xlZnRQYXJlbnRoZXNpc0tleXdvcmRfMF9hKEVPYmplY3Qgc2VtYW50aWNPYmplY3QsIElTeW5OYXZpZ2FibGUgdHJhbnNpdGlvbiwgTGlzdDxJTm9kZT4gbm9kZXMpIHsKKwkJYWNjZXB0Tm9kZXModHJhbnNpdGlvbiwgbm9kZXMpOworCX0KKwkKKwkvKioKKwkgKiBTeW50YXg6CisJICogICAgICcoJysKKwkgKi8KKwlwcm90ZWN0ZWQgdm9pZCBlbWl0X1hQYXJlbnRoZXNpemVkRXhwcmVzc2lvbl9MZWZ0UGFyZW50aGVzaXNLZXl3b3JkXzBfcChFT2JqZWN0IHNlbWFudGljT2JqZWN0LCBJU3luTmF2aWdhYmxlIHRyYW5zaXRpb24sIExpc3Q8SU5vZGU+IG5vZGVzKSB7CisJCWFjY2VwdE5vZGVzKHRyYW5zaXRpb24sIG5vZGVzKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvc2VydmljZXMvQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zZXJ2aWNlcy9BdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2Vzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTU4MmQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvc2VydmljZXMvQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MuamF2YQpAQCAtMCwwICsxLDIyODUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuKjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkdyYW1tYXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5zZXJ2aWNlLkFic3RyYWN0RWxlbWVudEZpbmRlci4qOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuYW5ub3RhdGlvbnMuc2VydmljZXMuWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlhiYXNlR3JhbW1hckFjY2VzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3M7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMR3JhbW1hckFjY2VzcyBleHRlbmRzIEFic3RyYWN0R3JhbW1hckVsZW1lbnRGaW5kZXIgeworCQorCQorCXB1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uTW9kZWxFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiQXV0aG9yaXphdGlvbk1vZGVsIik7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUGNrZ0Fzc2lnbm1lbnQgPSAoQXNzaWdubWVudClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUGNrZ0F1dGhvcml6YXRpb25QYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljUGNrZ0Fzc2lnbm1lbnQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9BdXRob3JpemF0aW9uTW9kZWw6CisJCS8vCXBja2c9QXV0aG9yaXphdGlvblBhY2thZ2U7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9wY2tnPUF1dGhvcml6YXRpb25QYWNrYWdlCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFBja2dBc3NpZ25tZW50KCkgeyByZXR1cm4gY1Bja2dBc3NpZ25tZW50OyB9CisKKwkJLy9BdXRob3JpemF0aW9uUGFja2FnZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UGNrZ0F1dGhvcml6YXRpb25QYWNrYWdlUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNQY2tnQXV0aG9yaXphdGlvblBhY2thZ2VQYXJzZXJSdWxlQ2FsbF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25QYWNrYWdlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkF1dGhvcml6YXRpb25QYWNrYWdlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjQXV0aG9yaXphdGlvblBhY2thZ2VBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNQYWNrYWdlS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVF1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzAgPSAoUnVsZUNhbGwpY05hbWVBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0ltcG9ydHNBc3NpZ25tZW50XzQgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRzQXV0aG9yaXphdGlvbkltcG9ydFBhcnNlclJ1bGVDYWxsXzRfMCA9IChSdWxlQ2FsbCljSW1wb3J0c0Fzc2lnbm1lbnRfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjUm9sZXNBc3NpZ25tZW50XzUgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDUpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSb2xlc1JvbGVQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY1JvbGVzQXNzaWdubWVudF81LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNiA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNik7CisJCQorCQkvL0F1dGhvcml6YXRpb25QYWNrYWdlOgorCQkvLwl7QXV0aG9yaXphdGlvblBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgInsiIGltcG9ydHMrPUF1dGhvcml6YXRpb25JbXBvcnQqIHJvbGVzKz1Sb2xlKiAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97QXV0aG9yaXphdGlvblBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgInsiIGltcG9ydHMrPUF1dGhvcml6YXRpb25JbXBvcnQqIHJvbGVzKz1Sb2xlKiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97QXV0aG9yaXphdGlvblBhY2thZ2V9CisJCXB1YmxpYyBBY3Rpb24gZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY3Rpb25fMCgpIHsgcmV0dXJuIGNBdXRob3JpemF0aW9uUGFja2FnZUFjdGlvbl8wOyB9CisKKwkJLy8icGFja2FnZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UGFja2FnZUtleXdvcmRfMSgpIHsgcmV0dXJuIGNQYWNrYWdlS2V5d29yZF8xOyB9CisKKwkJLy9uYW1lPVF1YWxpZmllZE5hbWUKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0TmFtZUFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNOYW1lQXNzaWdubWVudF8yOyB9CisKKwkJLy9RdWFsaWZpZWROYW1lCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNOYW1lUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzJfMDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMzsgfQorCisJCS8vaW1wb3J0cys9QXV0aG9yaXphdGlvbkltcG9ydCoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0SW1wb3J0c0Fzc2lnbm1lbnRfNCgpIHsgcmV0dXJuIGNJbXBvcnRzQXNzaWdubWVudF80OyB9CisKKwkJLy9BdXRob3JpemF0aW9uSW1wb3J0CisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRJbXBvcnRzQXV0aG9yaXphdGlvbkltcG9ydFBhcnNlclJ1bGVDYWxsXzRfMCgpIHsgcmV0dXJuIGNJbXBvcnRzQXV0aG9yaXphdGlvbkltcG9ydFBhcnNlclJ1bGVDYWxsXzRfMDsgfQorCisJCS8vcm9sZXMrPVJvbGUqCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldFJvbGVzQXNzaWdubWVudF81KCkgeyByZXR1cm4gY1JvbGVzQXNzaWdubWVudF81OyB9CisKKwkJLy9Sb2xlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb2xlc1JvbGVQYXJzZXJSdWxlQ2FsbF81XzAoKSB7IHJldHVybiBjUm9sZXNSb2xlUGFyc2VyUnVsZUNhbGxfNV8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzYoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzY7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkltcG9ydEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJBdXRob3JpemF0aW9uSW1wb3J0Iik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0ltcG9ydEtleXdvcmRfMCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjSW1wb3J0ZWROYW1lc3BhY2VBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJbXBvcnRlZE5hbWVzcGFjZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNJbXBvcnRlZE5hbWVzcGFjZUFzc2lnbm1lbnRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL0F1dGhvcml6YXRpb25JbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwkJLy8JImltcG9ydCIgaW1wb3J0ZWROYW1lc3BhY2U9QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8iaW1wb3J0IiBpbXBvcnRlZE5hbWVzcGFjZT1BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJpbXBvcnQiCisJCXB1YmxpYyBLZXl3b3JkIGdldEltcG9ydEtleXdvcmRfMCgpIHsgcmV0dXJuIGNJbXBvcnRLZXl3b3JkXzA7IH0KKworCQkvL2ltcG9ydGVkTmFtZXNwYWNlPUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0ltcG9ydGVkTmFtZXNwYWNlQXNzaWdubWVudF8xOyB9CisKKwkJLy9BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SW1wb3J0ZWROYW1lc3BhY2VBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZFBhcnNlclJ1bGVDYWxsXzFfMCgpIHsgcmV0dXJuIGNJbXBvcnRlZE5hbWVzcGFjZUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkUGFyc2VyUnVsZUNhbGxfMV8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSb2xlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNOYW1lQXNzaWdubWVudF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjTmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMV8wID0gKFJ1bGVDYWxsKWNOYW1lQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNSb2xlRWxlbWVudHNBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSb2xlRWxlbWVudHNSb2xlRWxlbWVudFBhcnNlclJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljUm9sZUVsZW1lbnRzQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNCk7CisJCQorCQkvL1JvbGU6CisJCS8vCSJyb2xlIiBuYW1lPVRSQU5TTEFUQUJMRUlEICJ7IiByb2xlRWxlbWVudHMrPVJvbGVFbGVtZW50KiAifSI7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8icm9sZSIgbmFtZT1UUkFOU0xBVEFCTEVJRCAieyIgcm9sZUVsZW1lbnRzKz1Sb2xlRWxlbWVudCogIn0iCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInJvbGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJvbGVLZXl3b3JkXzAoKSB7IHJldHVybiBjUm9sZUtleXdvcmRfMDsgfQorCisJCS8vbmFtZT1UUkFOU0xBVEFCTEVJRAorCQlwdWJsaWMgQXNzaWdubWVudCBnZXROYW1lQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY05hbWVBc3NpZ25tZW50XzE7IH0KKworCQkvL1RSQU5TTEFUQUJMRUlECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXROYW1lVFJBTlNMQVRBQkxFSURQYXJzZXJSdWxlQ2FsbF8xXzAoKSB7IHJldHVybiBjTmFtZVRSQU5TTEFUQUJMRUlEUGFyc2VyUnVsZUNhbGxfMV8wOyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMigpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF8yOyB9CisKKwkJLy9yb2xlRWxlbWVudHMrPVJvbGVFbGVtZW50KgorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRSb2xlRWxlbWVudHNBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjUm9sZUVsZW1lbnRzQXNzaWdubWVudF8zOyB9CisKKwkJLy9Sb2xlRWxlbWVudAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUVsZW1lbnRzUm9sZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjUm9sZUVsZW1lbnRzUm9sZUVsZW1lbnRQYXJzZXJSdWxlQ2FsbF8zXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNCgpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlRWxlbWVudEVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSb2xlRWxlbWVudCIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUm9sZUVudGl0eVBhcnNlclJ1bGVDYWxsXzAgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JvbGVCZWFuUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUm9sZUR0b1BhcnNlclJ1bGVDYWxsXzIgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JvbGVCbGlwUHJvY2Vzc1BhcnNlclJ1bGVDYWxsXzMgPSAoUnVsZUNhbGwpY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMyk7CisJCQorCQkvL1JvbGVFbGVtZW50OgorCQkvLwlSb2xlRW50aXR5IHwgUm9sZUJlYW4gfCBSb2xlRHRvIHwgUm9sZUJsaXBQcm9jZXNzOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUm9sZUVudGl0eSB8IFJvbGVCZWFuIHwgUm9sZUR0byB8IFJvbGVCbGlwUHJvY2VzcworCQlwdWJsaWMgQWx0ZXJuYXRpdmVzIGdldEFsdGVybmF0aXZlcygpIHsgcmV0dXJuIGNBbHRlcm5hdGl2ZXM7IH0KKworCQkvL1JvbGVFbnRpdHkKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wKCkgeyByZXR1cm4gY1JvbGVFbnRpdHlQYXJzZXJSdWxlQ2FsbF8wOyB9CisKKwkJLy9Sb2xlQmVhbgorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUJlYW5QYXJzZXJSdWxlQ2FsbF8xKCkgeyByZXR1cm4gY1JvbGVCZWFuUGFyc2VyUnVsZUNhbGxfMTsgfQorCisJCS8vUm9sZUR0bworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUR0b1BhcnNlclJ1bGVDYWxsXzIoKSB7IHJldHVybiBjUm9sZUR0b1BhcnNlclJ1bGVDYWxsXzI7IH0KKworCQkvL1JvbGVCbGlwUHJvY2VzcworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUJsaXBQcm9jZXNzUGFyc2VyUnVsZUNhbGxfMygpIHsgcmV0dXJuIGNSb2xlQmxpcFByb2Nlc3NQYXJzZXJSdWxlQ2FsbF8zOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVFbnRpdHlFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUVudGl0eSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1JvbGVFbnRpdHlBY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNFbnRpdHlLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0VudGl0eVJlZkFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0VudGl0eVJlZkxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY0VudGl0eVJlZkFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0VudGl0eVJlZkxFbnRpdHlJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY0VudGl0eVJlZkxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0VudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzMgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDMpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlBdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wID0gKFJ1bGVDYWxsKWNFbnRpdHlBdXRob3JpemVkQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNCA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNHcm91cF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbnRpdHlGZWF0dXJlc0Fzc2lnbm1lbnRfNF8xID0gKEFzc2lnbm1lbnQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlGZWF0dXJlc1JvbGVFbnRpdHlGZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzAgPSAoUnVsZUNhbGwpY0VudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIgPSAoS2V5d29yZCljR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMik7CisJCQorCQkvL1JvbGVFbnRpdHk6CisJCS8vCXtSb2xlRW50aXR5fSAiZW50aXR5IiBlbnRpdHlSZWY9W2VudGl0eTo6TEVudGl0eV0gZW50aXR5QXV0aG9yaXplZCs9Um9sZUVudW0rICgieyIgZW50aXR5RmVhdHVyZXMrPVJvbGVFbnRpdHlGZWF0dXJlKworCQkvLwkifSIpPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tSb2xlRW50aXR5fSAiZW50aXR5IiBlbnRpdHlSZWY9W2VudGl0eTo6TEVudGl0eV0gZW50aXR5QXV0aG9yaXplZCs9Um9sZUVudW0rICgieyIgZW50aXR5RmVhdHVyZXMrPVJvbGVFbnRpdHlGZWF0dXJlKworCQkvLyJ9Iik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8ve1JvbGVFbnRpdHl9CisJCXB1YmxpYyBBY3Rpb24gZ2V0Um9sZUVudGl0eUFjdGlvbl8wKCkgeyByZXR1cm4gY1JvbGVFbnRpdHlBY3Rpb25fMDsgfQorCisJCS8vImVudGl0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RW50aXR5S2V5d29yZF8xKCkgeyByZXR1cm4gY0VudGl0eUtleXdvcmRfMTsgfQorCisJCS8vZW50aXR5UmVmPVtlbnRpdHk6OkxFbnRpdHldCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVudGl0eVJlZkFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNFbnRpdHlSZWZBc3NpZ25tZW50XzI7IH0KKworCQkvL1tlbnRpdHk6OkxFbnRpdHldCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRFbnRpdHlSZWZMRW50aXR5Q3Jvc3NSZWZlcmVuY2VfMl8wKCkgeyByZXR1cm4gY0VudGl0eVJlZkxFbnRpdHlDcm9zc1JlZmVyZW5jZV8yXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbnRpdHlSZWZMRW50aXR5SURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xKCkgeyByZXR1cm4gY0VudGl0eVJlZkxFbnRpdHlJRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzE7IH0KKworCQkvL2VudGl0eUF1dGhvcml6ZWQrPVJvbGVFbnVtKworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbnRpdHlBdXRob3JpemVkQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0VudGl0eUF1dGhvcml6ZWRBc3NpZ25tZW50XzM7IH0KKworCQkvL1JvbGVFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbnRpdHlBdXRob3JpemVkUm9sZUVudW1FbnVtUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY0VudGl0eUF1dGhvcml6ZWRSb2xlRW51bUVudW1SdWxlQ2FsbF8zXzA7IH0KKworCQkvLygieyIgZW50aXR5RmVhdHVyZXMrPVJvbGVFbnRpdHlGZWF0dXJlKyAifSIpPworCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXBfNCgpIHsgcmV0dXJuIGNHcm91cF80OyB9CisKKwkJLy8ieyIKKwkJcHVibGljIEtleXdvcmQgZ2V0TGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNF8wKCkgeyByZXR1cm4gY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMDsgfQorCisJCS8vZW50aXR5RmVhdHVyZXMrPVJvbGVFbnRpdHlGZWF0dXJlKworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbnRpdHlGZWF0dXJlc0Fzc2lnbm1lbnRfNF8xKCkgeyByZXR1cm4gY0VudGl0eUZlYXR1cmVzQXNzaWdubWVudF80XzE7IH0KKworCQkvL1JvbGVFbnRpdHlGZWF0dXJlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRFbnRpdHlGZWF0dXJlc1JvbGVFbnRpdHlGZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzAoKSB7IHJldHVybiBjRW50aXR5RmVhdHVyZXNSb2xlRW50aXR5RmVhdHVyZVBhcnNlclJ1bGVDYWxsXzRfMV8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMigpIHsgcmV0dXJuIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVCZWFuRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVCZWFuIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFjdGlvbiBjUm9sZUJlYW5BY3Rpb25fMCA9IChBY3Rpb24pY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNCZWFuS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNCZWFuUmVmQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjQmVhblJlZkxCZWFuQ3Jvc3NSZWZlcmVuY2VfMl8wID0gKENyb3NzUmVmZXJlbmNlKWNCZWFuUmVmQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmVhblJlZkxCZWFuSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNCZWFuUmVmTEJlYW5Dcm9zc1JlZmVyZW5jZV8yXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JlYW5BdXRob3JpemVkQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmVhbkF1dGhvcml6ZWRSb2xlRW51bUVudW1SdWxlQ2FsbF8zXzAgPSAoUnVsZUNhbGwpY0JlYW5BdXRob3JpemVkQXNzaWdubWVudF8zLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXBfNCA9IChHcm91cCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0xlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCA9IChLZXl3b3JkKWNHcm91cF80LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNCZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMSA9IChBc3NpZ25tZW50KWNHcm91cF80LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmVhbkZlYXR1cmVzUm9sZUJlYW5GZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzAgPSAoUnVsZUNhbGwpY0JlYW5GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yID0gKEtleXdvcmQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQkKKwkJLy9Sb2xlQmVhbjoKKwkJLy8Je1JvbGVCZWFufSAiYmVhbiIgYmVhblJlZj1bZW50aXR5OjpMQmVhbl0gYmVhbkF1dGhvcml6ZWQrPVJvbGVFbnVtKyAoInsiIGJlYW5GZWF0dXJlcys9Um9sZUJlYW5GZWF0dXJlKyAifSIpPzsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tSb2xlQmVhbn0gImJlYW4iIGJlYW5SZWY9W2VudGl0eTo6TEJlYW5dIGJlYW5BdXRob3JpemVkKz1Sb2xlRW51bSsgKCJ7IiBiZWFuRmVhdHVyZXMrPVJvbGVCZWFuRmVhdHVyZSsgIn0iKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Um9sZUJlYW59CisJCXB1YmxpYyBBY3Rpb24gZ2V0Um9sZUJlYW5BY3Rpb25fMCgpIHsgcmV0dXJuIGNSb2xlQmVhbkFjdGlvbl8wOyB9CisKKwkJLy8iYmVhbiIKKwkJcHVibGljIEtleXdvcmQgZ2V0QmVhbktleXdvcmRfMSgpIHsgcmV0dXJuIGNCZWFuS2V5d29yZF8xOyB9CisKKwkJLy9iZWFuUmVmPVtlbnRpdHk6OkxCZWFuXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCZWFuUmVmQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0JlYW5SZWZBc3NpZ25tZW50XzI7IH0KKworCQkvL1tlbnRpdHk6OkxCZWFuXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0QmVhblJlZkxCZWFuQ3Jvc3NSZWZlcmVuY2VfMl8wKCkgeyByZXR1cm4gY0JlYW5SZWZMQmVhbkNyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJlYW5SZWZMQmVhbklEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNCZWFuUmVmTEJlYW5JRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzE7IH0KKworCQkvL2JlYW5BdXRob3JpemVkKz1Sb2xlRW51bSsKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjQmVhbkF1dGhvcml6ZWRBc3NpZ25tZW50XzM7IH0KKworCQkvL1JvbGVFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCZWFuQXV0aG9yaXplZFJvbGVFbnVtRW51bVJ1bGVDYWxsXzNfMCgpIHsgcmV0dXJuIGNCZWFuQXV0aG9yaXplZFJvbGVFbnVtRW51bVJ1bGVDYWxsXzNfMDsgfQorCisJCS8vKCJ7IiBiZWFuRmVhdHVyZXMrPVJvbGVCZWFuRmVhdHVyZSsgIn0iKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzQoKSB7IHJldHVybiBjR3JvdXBfNDsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMCgpIHsgcmV0dXJuIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzA7IH0KKworCQkvL2JlYW5GZWF0dXJlcys9Um9sZUJlYW5GZWF0dXJlKworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMSgpIHsgcmV0dXJuIGNCZWFuRmVhdHVyZXNBc3NpZ25tZW50XzRfMTsgfQorCisJCS8vUm9sZUJlYW5GZWF0dXJlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCZWFuRmVhdHVyZXNSb2xlQmVhbkZlYXR1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMCgpIHsgcmV0dXJuIGNCZWFuRmVhdHVyZXNSb2xlQmVhbkZlYXR1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMDsgfQorCisJCS8vIn0iCisJCXB1YmxpYyBLZXl3b3JkIGdldFJpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzIoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzRfMjsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlRHRvRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVEdG8iKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNSb2xlRHRvQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRHRvS2V5d29yZF8xID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEdG9SZWZBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNEdG9SZWZMRHRvQ3Jvc3NSZWZlcmVuY2VfMl8wID0gKENyb3NzUmVmZXJlbmNlKWNEdG9SZWZBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEdG9SZWZMRHRvSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNEdG9SZWZMRHRvQ3Jvc3NSZWZlcmVuY2VfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEdG9BdXRob3JpemVkQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRHRvQXV0aG9yaXplZFJvbGVFbnVtRW51bVJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljRHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzQgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAgPSAoS2V5d29yZCljR3JvdXBfNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMSA9IChBc3NpZ25tZW50KWNHcm91cF80LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjRHRvRmVhdHVyZXNSb2xlRHRvRmVhdHVyZVBhcnNlclJ1bGVDYWxsXzRfMV8wID0gKFJ1bGVDYWxsKWNEdG9GZWF0dXJlc0Fzc2lnbm1lbnRfNF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yID0gKEtleXdvcmQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQkKKwkJLy9Sb2xlRHRvOgorCQkvLwl7Um9sZUR0b30gImR0byIgZHRvUmVmPVtkdG86OkxEdG9dIGR0b0F1dGhvcml6ZWQrPVJvbGVFbnVtKyAoInsiIGR0b0ZlYXR1cmVzKz1Sb2xlRHRvRmVhdHVyZSsgIn0iKT87CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Um9sZUR0b30gImR0byIgZHRvUmVmPVtkdG86OkxEdG9dIGR0b0F1dGhvcml6ZWQrPVJvbGVFbnVtKyAoInsiIGR0b0ZlYXR1cmVzKz1Sb2xlRHRvRmVhdHVyZSsgIn0iKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Um9sZUR0b30KKwkJcHVibGljIEFjdGlvbiBnZXRSb2xlRHRvQWN0aW9uXzAoKSB7IHJldHVybiBjUm9sZUR0b0FjdGlvbl8wOyB9CisKKwkJLy8iZHRvIgorCQlwdWJsaWMgS2V5d29yZCBnZXREdG9LZXl3b3JkXzEoKSB7IHJldHVybiBjRHRvS2V5d29yZF8xOyB9CisKKwkJLy9kdG9SZWY9W2R0bzo6TER0b10KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RHRvUmVmQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0R0b1JlZkFzc2lnbm1lbnRfMjsgfQorCisJCS8vW2R0bzo6TER0b10KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldER0b1JlZkxEdG9Dcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjRHRvUmVmTER0b0Nyb3NzUmVmZXJlbmNlXzJfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldER0b1JlZkxEdG9JRFRlcm1pbmFsUnVsZUNhbGxfMl8wXzEoKSB7IHJldHVybiBjRHRvUmVmTER0b0lEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCisJCS8vZHRvQXV0aG9yaXplZCs9Um9sZUVudW0rCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldER0b0F1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjRHRvQXV0aG9yaXplZEFzc2lnbm1lbnRfMzsgfQorCisJCS8vUm9sZUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldER0b0F1dGhvcml6ZWRSb2xlRW51bUVudW1SdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjRHRvQXV0aG9yaXplZFJvbGVFbnVtRW51bVJ1bGVDYWxsXzNfMDsgfQorCisJCS8vKCJ7IiBkdG9GZWF0dXJlcys9Um9sZUR0b0ZlYXR1cmUrICJ9Iik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cF80KCkgeyByZXR1cm4gY0dyb3VwXzQ7IH0KKworCQkvLyJ7IgorCQlwdWJsaWMgS2V5d29yZCBnZXRMZWZ0Q3VybHlCcmFja2V0S2V5d29yZF80XzAoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfNF8wOyB9CisKKwkJLy9kdG9GZWF0dXJlcys9Um9sZUR0b0ZlYXR1cmUrCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldER0b0ZlYXR1cmVzQXNzaWdubWVudF80XzEoKSB7IHJldHVybiBjRHRvRmVhdHVyZXNBc3NpZ25tZW50XzRfMTsgfQorCisJCS8vUm9sZUR0b0ZlYXR1cmUKKwkJcHVibGljIFJ1bGVDYWxsIGdldER0b0ZlYXR1cmVzUm9sZUR0b0ZlYXR1cmVQYXJzZXJSdWxlQ2FsbF80XzFfMCgpIHsgcmV0dXJuIGNEdG9GZWF0dXJlc1JvbGVEdG9GZWF0dXJlUGFyc2VyUnVsZUNhbGxfNF8xXzA7IH0KKworCQkvLyJ9IgorCQlwdWJsaWMgS2V5d29yZCBnZXRSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNF8yKCkgeyByZXR1cm4gY1JpZ2h0Q3VybHlCcmFja2V0S2V5d29yZF80XzI7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUJsaXBBbGxVc2VyVGFza3NFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUJsaXBBbGxVc2VyVGFza3MiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNSb2xlQmxpcEFsbFVzZXJUYXNrc0FjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0FsbEtleXdvcmRfMSA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVXNlcnRhc2tzS2V5d29yZF8yID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBdXRob3JpemVkQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQXV0aG9yaXplZFJvbGVCbGlwVXNlclRhc2tFbnVtRW51bVJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljQXV0aG9yaXplZEFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVCbGlwQWxsVXNlclRhc2tzOgorCQkvLwl7Um9sZUJsaXBBbGxVc2VyVGFza3N9ICJhbGwiICJ1c2VydGFza3MiIGF1dGhvcml6ZWQ9Um9sZUJsaXBVc2VyVGFza0VudW07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy97Um9sZUJsaXBBbGxVc2VyVGFza3N9ICJhbGwiICJ1c2VydGFza3MiIGF1dGhvcml6ZWQ9Um9sZUJsaXBVc2VyVGFza0VudW0KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Um9sZUJsaXBBbGxVc2VyVGFza3N9CisJCXB1YmxpYyBBY3Rpb24gZ2V0Um9sZUJsaXBBbGxVc2VyVGFza3NBY3Rpb25fMCgpIHsgcmV0dXJuIGNSb2xlQmxpcEFsbFVzZXJUYXNrc0FjdGlvbl8wOyB9CisKKwkJLy8iYWxsIgorCQlwdWJsaWMgS2V5d29yZCBnZXRBbGxLZXl3b3JkXzEoKSB7IHJldHVybiBjQWxsS2V5d29yZF8xOyB9CisKKwkJLy8idXNlcnRhc2tzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVc2VydGFza3NLZXl3b3JkXzIoKSB7IHJldHVybiBjVXNlcnRhc2tzS2V5d29yZF8yOyB9CisKKwkJLy9hdXRob3JpemVkPVJvbGVCbGlwVXNlclRhc2tFbnVtCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEF1dGhvcml6ZWRBc3NpZ25tZW50XzMoKSB7IHJldHVybiBjQXV0aG9yaXplZEFzc2lnbm1lbnRfMzsgfQorCisJCS8vUm9sZUJsaXBVc2VyVGFza0VudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEF1dGhvcml6ZWRSb2xlQmxpcFVzZXJUYXNrRW51bUVudW1SdWxlQ2FsbF8zXzAoKSB7IHJldHVybiBjQXV0aG9yaXplZFJvbGVCbGlwVXNlclRhc2tFbnVtRW51bVJ1bGVDYWxsXzNfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlQmxpcFVzZXJUYXNrRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVCbGlwVXNlclRhc2siKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQWN0aW9uIGNSb2xlQmxpcFVzZXJUYXNrQWN0aW9uXzAgPSAoQWN0aW9uKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjVXNlcnRhc2tLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1VzZXJUYXNrQXNzaWdubWVudF8yID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgyKTsKKwkJcHJpdmF0ZSBmaW5hbCBDcm9zc1JlZmVyZW5jZSBjVXNlclRhc2tCbGlwVXNlclRhc2tDcm9zc1JlZmVyZW5jZV8yXzAgPSAoQ3Jvc3NSZWZlcmVuY2UpY1VzZXJUYXNrQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVXNlclRhc2tCbGlwVXNlclRhc2tRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMl8wXzEgPSAoUnVsZUNhbGwpY1VzZXJUYXNrQmxpcFVzZXJUYXNrQ3Jvc3NSZWZlcmVuY2VfMl8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNBdXRob3JpemVkQXNzaWdubWVudF8zID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQXV0aG9yaXplZFJvbGVCbGlwVXNlclRhc2tFbnVtRW51bVJ1bGVDYWxsXzNfMCA9IChSdWxlQ2FsbCljQXV0aG9yaXplZEFzc2lnbm1lbnRfMy5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVCbGlwVXNlclRhc2s6CisJCS8vCXtSb2xlQmxpcFVzZXJUYXNrfSAidXNlcnRhc2siIHVzZXJUYXNrPVtibGlwOjpCbGlwVXNlclRhc2t8UXVhbGlmaWVkTmFtZV0gYXV0aG9yaXplZD1Sb2xlQmxpcFVzZXJUYXNrRW51bTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3tSb2xlQmxpcFVzZXJUYXNrfSAidXNlcnRhc2siIHVzZXJUYXNrPVtibGlwOjpCbGlwVXNlclRhc2t8UXVhbGlmaWVkTmFtZV0gYXV0aG9yaXplZD1Sb2xlQmxpcFVzZXJUYXNrRW51bQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvL3tSb2xlQmxpcFVzZXJUYXNrfQorCQlwdWJsaWMgQWN0aW9uIGdldFJvbGVCbGlwVXNlclRhc2tBY3Rpb25fMCgpIHsgcmV0dXJuIGNSb2xlQmxpcFVzZXJUYXNrQWN0aW9uXzA7IH0KKworCQkvLyJ1c2VydGFzayIKKwkJcHVibGljIEtleXdvcmQgZ2V0VXNlcnRhc2tLZXl3b3JkXzEoKSB7IHJldHVybiBjVXNlcnRhc2tLZXl3b3JkXzE7IH0KKworCQkvL3VzZXJUYXNrPVtibGlwOjpCbGlwVXNlclRhc2t8UXVhbGlmaWVkTmFtZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VXNlclRhc2tBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjVXNlclRhc2tBc3NpZ25tZW50XzI7IH0KKworCQkvL1tibGlwOjpCbGlwVXNlclRhc2t8UXVhbGlmaWVkTmFtZV0KKwkJcHVibGljIENyb3NzUmVmZXJlbmNlIGdldFVzZXJUYXNrQmxpcFVzZXJUYXNrQ3Jvc3NSZWZlcmVuY2VfMl8wKCkgeyByZXR1cm4gY1VzZXJUYXNrQmxpcFVzZXJUYXNrQ3Jvc3NSZWZlcmVuY2VfMl8wOyB9CisKKwkJLy9RdWFsaWZpZWROYW1lCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRVc2VyVGFza0JsaXBVc2VyVGFza1F1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNVc2VyVGFza0JsaXBVc2VyVGFza1F1YWxpZmllZE5hbWVQYXJzZXJSdWxlQ2FsbF8yXzBfMTsgfQorCisJCS8vYXV0aG9yaXplZD1Sb2xlQmxpcFVzZXJUYXNrRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRBdXRob3JpemVkQXNzaWdubWVudF8zKCkgeyByZXR1cm4gY0F1dGhvcml6ZWRBc3NpZ25tZW50XzM7IH0KKworCQkvL1JvbGVCbGlwVXNlclRhc2tFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRBdXRob3JpemVkUm9sZUJsaXBVc2VyVGFza0VudW1FbnVtUnVsZUNhbGxfM18wKCkgeyByZXR1cm4gY0F1dGhvcml6ZWRSb2xlQmxpcFVzZXJUYXNrRW51bUVudW1SdWxlQ2FsbF8zXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUJsaXBQcm9jZXNzRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVCbGlwUHJvY2VzcyIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBY3Rpb24gY1JvbGVCbGlwUHJvY2Vzc0FjdGlvbl8wID0gKEFjdGlvbiljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Byb2Nlc3NLZXl3b3JkXzEgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Byb2Nlc3NBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzJfMCA9IChDcm9zc1JlZmVyZW5jZSljUHJvY2Vzc0Fzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1Byb2Nlc3NCbGlwSURUZXJtaW5hbFJ1bGVDYWxsXzJfMF8xID0gKFJ1bGVDYWxsKWNQcm9jZXNzQmxpcENyb3NzUmVmZXJlbmNlXzJfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMyA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMyk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzQgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCg0KTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJc0tleXdvcmRfNF8wID0gKEtleXdvcmQpY0dyb3VwXzQuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY1Byb2Nlc3NTdGFydEF1dGhvcml6ZWRBc3NpZ25tZW50XzRfMSA9IChBc3NpZ25tZW50KWNHcm91cF80LmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZFJvbGVCbGlwUHJvY2Vzc0VudW1FbnVtUnVsZUNhbGxfNF8xXzAgPSAoUnVsZUNhbGwpY1Byb2Nlc3NTdGFydEF1dGhvcml6ZWRBc3NpZ25tZW50XzRfMS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjQWxsVXNlclRhc2tzQXNzaWdubWVudF81ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg1KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQWxsVXNlclRhc2tzUm9sZUJsaXBBbGxVc2VyVGFza3NQYXJzZXJSdWxlQ2FsbF81XzAgPSAoUnVsZUNhbGwpY0FsbFVzZXJUYXNrc0Fzc2lnbm1lbnRfNS5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjVXNlclRhc2tzQXNzaWdubWVudF82ID0gKEFzc2lnbm1lbnQpY0dyb3VwLmVDb250ZW50cygpLmdldCg2KTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjVXNlclRhc2tzUm9sZUJsaXBVc2VyVGFza1BhcnNlclJ1bGVDYWxsXzZfMCA9IChSdWxlQ2FsbCljVXNlclRhc2tzQXNzaWdubWVudF82LmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSaWdodEN1cmx5QnJhY2tldEtleXdvcmRfNyA9IChLZXl3b3JkKWNHcm91cC5lQ29udGVudHMoKS5nZXQoNyk7CisJCQorCQkvL1JvbGVCbGlwUHJvY2VzczoKKwkJLy8Je1JvbGVCbGlwUHJvY2Vzc30gInByb2Nlc3MiIHByb2Nlc3M9W2JsaXA6OkJsaXBdICJ7IiAoImlzIiBwcm9jZXNzU3RhcnRBdXRob3JpemVkPVJvbGVCbGlwUHJvY2Vzc0VudW0pPworCQkvLwlhbGxVc2VyVGFza3M9Um9sZUJsaXBBbGxVc2VyVGFza3M/IHVzZXJUYXNrcys9Um9sZUJsaXBVc2VyVGFzayogIn0iOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8ve1JvbGVCbGlwUHJvY2Vzc30gInByb2Nlc3MiIHByb2Nlc3M9W2JsaXA6OkJsaXBdICJ7IiAoImlzIiBwcm9jZXNzU3RhcnRBdXRob3JpemVkPVJvbGVCbGlwUHJvY2Vzc0VudW0pPworCQkvL2FsbFVzZXJUYXNrcz1Sb2xlQmxpcEFsbFVzZXJUYXNrcz8gdXNlclRhc2tzKz1Sb2xlQmxpcFVzZXJUYXNrKiAifSIKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy97Um9sZUJsaXBQcm9jZXNzfQorCQlwdWJsaWMgQWN0aW9uIGdldFJvbGVCbGlwUHJvY2Vzc0FjdGlvbl8wKCkgeyByZXR1cm4gY1JvbGVCbGlwUHJvY2Vzc0FjdGlvbl8wOyB9CisKKwkJLy8icHJvY2VzcyIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvY2Vzc0tleXdvcmRfMSgpIHsgcmV0dXJuIGNQcm9jZXNzS2V5d29yZF8xOyB9CisKKwkJLy9wcm9jZXNzPVtibGlwOjpCbGlwXQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQcm9jZXNzQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY1Byb2Nlc3NBc3NpZ25tZW50XzI7IH0KKworCQkvL1tibGlwOjpCbGlwXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0UHJvY2Vzc0JsaXBDcm9zc1JlZmVyZW5jZV8yXzAoKSB7IHJldHVybiBjUHJvY2Vzc0JsaXBDcm9zc1JlZmVyZW5jZV8yXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQcm9jZXNzQmxpcElEVGVybWluYWxSdWxlQ2FsbF8yXzBfMSgpIHsgcmV0dXJuIGNQcm9jZXNzQmxpcElEVGVybWluYWxSdWxlQ2FsbF8yXzBfMTsgfQorCisJCS8vInsiCisJCXB1YmxpYyBLZXl3b3JkIGdldExlZnRDdXJseUJyYWNrZXRLZXl3b3JkXzMoKSB7IHJldHVybiBjTGVmdEN1cmx5QnJhY2tldEtleXdvcmRfMzsgfQorCisJCS8vKCJpcyIgcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZD1Sb2xlQmxpcFByb2Nlc3NFbnVtKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzQoKSB7IHJldHVybiBjR3JvdXBfNDsgfQorCisJCS8vImlzIgorCQlwdWJsaWMgS2V5d29yZCBnZXRJc0tleXdvcmRfNF8wKCkgeyByZXR1cm4gY0lzS2V5d29yZF80XzA7IH0KKworCQkvL3Byb2Nlc3NTdGFydEF1dGhvcml6ZWQ9Um9sZUJsaXBQcm9jZXNzRW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkQXNzaWdubWVudF80XzEoKSB7IHJldHVybiBjUHJvY2Vzc1N0YXJ0QXV0aG9yaXplZEFzc2lnbm1lbnRfNF8xOyB9CisKKwkJLy9Sb2xlQmxpcFByb2Nlc3NFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRQcm9jZXNzU3RhcnRBdXRob3JpemVkUm9sZUJsaXBQcm9jZXNzRW51bUVudW1SdWxlQ2FsbF80XzFfMCgpIHsgcmV0dXJuIGNQcm9jZXNzU3RhcnRBdXRob3JpemVkUm9sZUJsaXBQcm9jZXNzRW51bUVudW1SdWxlQ2FsbF80XzFfMDsgfQorCisJCS8vYWxsVXNlclRhc2tzPVJvbGVCbGlwQWxsVXNlclRhc2tzPworCQlwdWJsaWMgQXNzaWdubWVudCBnZXRBbGxVc2VyVGFza3NBc3NpZ25tZW50XzUoKSB7IHJldHVybiBjQWxsVXNlclRhc2tzQXNzaWdubWVudF81OyB9CisKKwkJLy9Sb2xlQmxpcEFsbFVzZXJUYXNrcworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QWxsVXNlclRhc2tzUm9sZUJsaXBBbGxVc2VyVGFza3NQYXJzZXJSdWxlQ2FsbF81XzAoKSB7IHJldHVybiBjQWxsVXNlclRhc2tzUm9sZUJsaXBBbGxVc2VyVGFza3NQYXJzZXJSdWxlQ2FsbF81XzA7IH0KKworCQkvL3VzZXJUYXNrcys9Um9sZUJsaXBVc2VyVGFzayoKKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0VXNlclRhc2tzQXNzaWdubWVudF82KCkgeyByZXR1cm4gY1VzZXJUYXNrc0Fzc2lnbm1lbnRfNjsgfQorCisJCS8vUm9sZUJsaXBVc2VyVGFzaworCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VXNlclRhc2tzUm9sZUJsaXBVc2VyVGFza1BhcnNlclJ1bGVDYWxsXzZfMCgpIHsgcmV0dXJuIGNVc2VyVGFza3NSb2xlQmxpcFVzZXJUYXNrUGFyc2VyUnVsZUNhbGxfNl8wOyB9CisKKwkJLy8ifSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzcoKSB7IHJldHVybiBjUmlnaHRDdXJseUJyYWNrZXRLZXl3b3JkXzc7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUVudGl0eUZlYXR1cmVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUVudGl0eUZlYXR1cmUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JvbGVFbnRpdHlBdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSb2xlRW50aXR5UmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vUm9sZUVudGl0eUZlYXR1cmU6CisJCS8vCVJvbGVFbnRpdHlBdHRyaWJ1dGUgfCBSb2xlRW50aXR5UmVmZXJlbmNlOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUm9sZUVudGl0eUF0dHJpYnV0ZSB8IFJvbGVFbnRpdHlSZWZlcmVuY2UKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9Sb2xlRW50aXR5QXR0cmlidXRlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb2xlRW50aXR5QXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNSb2xlRW50aXR5QXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vUm9sZUVudGl0eVJlZmVyZW5jZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUVudGl0eVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUm9sZUVudGl0eVJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUVudGl0eUF0dHJpYnV0ZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSb2xlRW50aXR5QXR0cmlidXRlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Byb3BlcnR5S2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0VudGl0eUF0dHJpQ29sTEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlBdHRyaUNvbExFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0VudGl0eUF0dHJpQ29sTEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVFbnRpdHlBdHRyaWJ1dGU6CisJCS8vCSJwcm9wZXJ0eSIgZW50aXR5QXR0cmlDb2w9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJwcm9wZXJ0eSIgZW50aXR5QXR0cmlDb2w9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJwcm9wZXJ0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSB7IHJldHVybiBjUHJvcGVydHlLZXl3b3JkXzA7IH0KKworCQkvL2VudGl0eUF0dHJpQ29sPVtlbnRpdHk6OkxFbnRpdHlBdHRyaWJ1dGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEVudGl0eUF0dHJpQ29sQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0VudGl0eUF0dHJpQ29sQXNzaWdubWVudF8xOyB9CisKKwkJLy9bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0RW50aXR5QXR0cmlDb2xMRW50aXR5QXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkgeyByZXR1cm4gY0VudGl0eUF0dHJpQ29sTEVudGl0eUF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEVudGl0eUF0dHJpQ29sTEVudGl0eUF0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNFbnRpdHlBdHRyaUNvbExFbnRpdHlBdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzE7IH0KKworCQkvL2VudGl0eUF0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzI7IH0KKworCQkvL1JvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldEVudGl0eUF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlRW50aXR5UmVmZXJlbmNlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVFbnRpdHlSZWZlcmVuY2UiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmVmZXJlbmNlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNFbnRpdHlBdHRyaUNvbEFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0VudGl0eUF0dHJpQ29sTEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlBdHRyaUNvbExFbnRpdHlSZWZlcmVuY2VJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0VudGl0eUF0dHJpQ29sTEVudGl0eVJlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRW50aXR5QXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVFbnRpdHlSZWZlcmVuY2U6CisJCS8vCSJyZWZlcmVuY2UiIGVudGl0eUF0dHJpQ29sPVtlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdIGVudGl0eUF0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8icmVmZXJlbmNlIiBlbnRpdHlBdHRyaUNvbD1bZW50aXR5OjpMRW50aXR5UmVmZXJlbmNlXSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInJlZmVyZW5jZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkgeyByZXR1cm4gY1JlZmVyZW5jZUtleXdvcmRfMDsgfQorCisJCS8vZW50aXR5QXR0cmlDb2w9W2VudGl0eTo6TEVudGl0eVJlZmVyZW5jZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjRW50aXR5QXR0cmlDb2xBc3NpZ25tZW50XzE7IH0KKworCQkvL1tlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRFbnRpdHlBdHRyaUNvbExFbnRpdHlSZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjRW50aXR5QXR0cmlDb2xMRW50aXR5UmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RW50aXR5QXR0cmlDb2xMRW50aXR5UmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkgeyByZXR1cm4gY0VudGl0eUF0dHJpQ29sTEVudGl0eVJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCisJCS8vZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMjsgfQorCisJCS8vUm9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RW50aXR5QXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNFbnRpdHlBdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVCZWFuRmVhdHVyZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSb2xlQmVhbkZlYXR1cmUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JvbGVCZWFuQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjUm9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9Sb2xlQmVhbkZlYXR1cmU6CisJCS8vCVJvbGVCZWFuQXR0cmlidXRlIHwgUm9sZUJlYW5SZWZlcmVuY2U7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9Sb2xlQmVhbkF0dHJpYnV0ZSB8IFJvbGVCZWFuUmVmZXJlbmNlCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vUm9sZUJlYW5BdHRyaWJ1dGUKKwkJcHVibGljIFJ1bGVDYWxsIGdldFJvbGVCZWFuQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNSb2xlQmVhbkF0dHJpYnV0ZVBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvL1JvbGVCZWFuUmVmZXJlbmNlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb2xlQmVhblJlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUm9sZUJlYW5SZWZlcmVuY2VQYXJzZXJSdWxlQ2FsbF8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVCZWFuQXR0cmlidXRlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVCZWFuQXR0cmlidXRlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Byb3BlcnR5S2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIENyb3NzUmVmZXJlbmNlIGNCZWFuQXR0cmlDb2xMQmVhbkF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljQmVhbkF0dHJpQ29sQXNzaWdubWVudF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjQmVhbkF0dHJpQ29sTEJlYW5BdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0JlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCA9IChSdWxlQ2FsbCljQmVhbkF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vUm9sZUJlYW5BdHRyaWJ1dGU6CisJCS8vCSJwcm9wZXJ0eSIgYmVhbkF0dHJpQ29sPVtlbnRpdHk6OkxCZWFuQXR0cmlidXRlXSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJwcm9wZXJ0eSIgYmVhbkF0dHJpQ29sPVtlbnRpdHk6OkxCZWFuQXR0cmlidXRlXSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJwcm9wZXJ0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSB7IHJldHVybiBjUHJvcGVydHlLZXl3b3JkXzA7IH0KKworCQkvL2JlYW5BdHRyaUNvbD1bZW50aXR5OjpMQmVhbkF0dHJpYnV0ZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QmVhbkF0dHJpQ29sQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0JlYW5BdHRyaUNvbEFzc2lnbm1lbnRfMTsgfQorCisJCS8vW2VudGl0eTo6TEJlYW5BdHRyaWJ1dGVdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXRCZWFuQXR0cmlDb2xMQmVhbkF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMCgpIHsgcmV0dXJuIGNCZWFuQXR0cmlDb2xMQmVhbkF0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldEJlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkgeyByZXR1cm4gY0JlYW5BdHRyaUNvbExCZWFuQXR0cmlidXRlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xOyB9CisKKwkJLy9iZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjQmVhbkF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yOyB9CisKKwkJLy9Sb2xlUHJvcGVydHlFbnVtCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNCZWFuQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlQmVhblJlZmVyZW5jZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSb2xlQmVhblJlZmVyZW5jZSIpOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cCA9IChHcm91cClydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNSZWZlcmVuY2VLZXl3b3JkXzAgPSAoS2V5d29yZCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JlYW5BdHRyaUNvbEFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0JlYW5BdHRyaUNvbExCZWFuUmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMV8wID0gKENyb3NzUmVmZXJlbmNlKWNCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNCZWFuQXR0cmlDb2xMQmVhblJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSA9IChSdWxlQ2FsbCljQmVhbkF0dHJpQ29sTEJlYW5SZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzAuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEFzc2lnbm1lbnQgY0JlYW5BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMiA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY0JlYW5BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNCZWFuQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIuZUNvbnRlbnRzKCkuZ2V0KDApOworCQkKKwkJLy9Sb2xlQmVhblJlZmVyZW5jZToKKwkJLy8JInJlZmVyZW5jZSIgYmVhbkF0dHJpQ29sPVtlbnRpdHk6OkxCZWFuUmVmZXJlbmNlXSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJyZWZlcmVuY2UiIGJlYW5BdHRyaUNvbD1bZW50aXR5OjpMQmVhblJlZmVyZW5jZV0gYmVhbkF0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy8icmVmZXJlbmNlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRSZWZlcmVuY2VLZXl3b3JkXzAoKSB7IHJldHVybiBjUmVmZXJlbmNlS2V5d29yZF8wOyB9CisKKwkJLy9iZWFuQXR0cmlDb2w9W2VudGl0eTo6TEJlYW5SZWZlcmVuY2VdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldEJlYW5BdHRyaUNvbEFzc2lnbm1lbnRfMSgpIHsgcmV0dXJuIGNCZWFuQXR0cmlDb2xBc3NpZ25tZW50XzE7IH0KKworCQkvL1tlbnRpdHk6OkxCZWFuUmVmZXJlbmNlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0QmVhbkF0dHJpQ29sTEJlYW5SZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjQmVhbkF0dHJpQ29sTEJlYW5SZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzA7IH0KKworCQkvL0lECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRCZWFuQXR0cmlDb2xMQmVhblJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNCZWFuQXR0cmlDb2xMQmVhblJlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCisJCS8vYmVhbkF0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkQXNzaWdubWVudF8yKCkgeyByZXR1cm4gY0JlYW5BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMjsgfQorCisJCS8vUm9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0QmVhbkF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjQmVhbkF0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUR0b0ZlYXR1cmVFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUR0b0ZlYXR1cmUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1JvbGVEdG9BdHRyaWJ1dGVQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNSb2xlRHRvUmVmZXJlbmNlUGFyc2VyUnVsZUNhbGxfMSA9IChSdWxlQ2FsbCljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vUm9sZUR0b0ZlYXR1cmU6CisJCS8vCVJvbGVEdG9BdHRyaWJ1dGUgfCBSb2xlRHRvUmVmZXJlbmNlOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUm9sZUR0b0F0dHJpYnV0ZSB8IFJvbGVEdG9SZWZlcmVuY2UKKwkJcHVibGljIEFsdGVybmF0aXZlcyBnZXRBbHRlcm5hdGl2ZXMoKSB7IHJldHVybiBjQWx0ZXJuYXRpdmVzOyB9CisKKwkJLy9Sb2xlRHRvQXR0cmlidXRlCisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRSb2xlRHRvQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNSb2xlRHRvQXR0cmlidXRlUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vUm9sZUR0b1JlZmVyZW5jZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0Um9sZUR0b1JlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzEoKSB7IHJldHVybiBjUm9sZUR0b1JlZmVyZW5jZVBhcnNlclJ1bGVDYWxsXzE7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUR0b0F0dHJpYnV0ZUVsZW1lbnRzIGV4dGVuZHMgQWJzdHJhY3RQYXJzZXJSdWxlRWxlbWVudEZpbmRlciB7CisJCXByaXZhdGUgZmluYWwgUGFyc2VyUnVsZSBydWxlID0gKFBhcnNlclJ1bGUpIEdyYW1tYXJVdGlsLmZpbmRSdWxlRm9yTmFtZShnZXRHcmFtbWFyKCksICJSb2xlRHRvQXR0cmlidXRlIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY1Byb3BlcnR5S2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0R0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRHRvQXR0cmlDb2xBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEdG9BdHRyaUNvbExEdG9BdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0R0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEdG9BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNEdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVEdG9BdHRyaWJ1dGU6CisJCS8vCSJwcm9wZXJ0eSIgZHRvQXR0cmlDb2w9W2R0bzo6TER0b0F0dHJpYnV0ZV0gZHRvQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvLyJwcm9wZXJ0eSIgZHRvQXR0cmlDb2w9W2R0bzo6TER0b0F0dHJpYnV0ZV0gZHRvQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgR3JvdXAgZ2V0R3JvdXAoKSB7IHJldHVybiBjR3JvdXA7IH0KKworCQkvLyJwcm9wZXJ0eSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UHJvcGVydHlLZXl3b3JkXzAoKSB7IHJldHVybiBjUHJvcGVydHlLZXl3b3JkXzA7IH0KKworCQkvL2R0b0F0dHJpQ29sPVtkdG86OkxEdG9BdHRyaWJ1dGVdCisJCXB1YmxpYyBBc3NpZ25tZW50IGdldER0b0F0dHJpQ29sQXNzaWdubWVudF8xKCkgeyByZXR1cm4gY0R0b0F0dHJpQ29sQXNzaWdubWVudF8xOyB9CisKKwkJLy9bZHRvOjpMRHRvQXR0cmlidXRlXQorCQlwdWJsaWMgQ3Jvc3NSZWZlcmVuY2UgZ2V0RHRvQXR0cmlDb2xMRHRvQXR0cmlidXRlQ3Jvc3NSZWZlcmVuY2VfMV8wKCkgeyByZXR1cm4gY0R0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUNyb3NzUmVmZXJlbmNlXzFfMDsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldER0b0F0dHJpQ29sTER0b0F0dHJpYnV0ZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMSgpIHsgcmV0dXJuIGNEdG9BdHRyaUNvbExEdG9BdHRyaWJ1dGVJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzE7IH0KKworCQkvL2R0b0F0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIoKSB7IHJldHVybiBjRHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzI7IH0KKworCQkvL1JvbGVQcm9wZXJ0eUVudW0KKwkJcHVibGljIFJ1bGVDYWxsIGdldER0b0F0dHJpVW5hdXRob3JpemVkUm9sZVByb3BlcnR5RW51bUVudW1SdWxlQ2FsbF8yXzAoKSB7IHJldHVybiBjRHRvQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMDsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBSb2xlRHRvUmVmZXJlbmNlRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlJvbGVEdG9SZWZlcmVuY2UiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmVmZXJlbmNlS2V5d29yZF8wID0gKEtleXdvcmQpY0dyb3VwLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBBc3NpZ25tZW50IGNEdG9BdHRyaUNvbEFzc2lnbm1lbnRfMSA9IChBc3NpZ25tZW50KWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQ3Jvc3NSZWZlcmVuY2UgY0R0b0F0dHJpQ29sTER0b1JlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMCA9IChDcm9zc1JlZmVyZW5jZSljRHRvQXR0cmlDb2xBc3NpZ25tZW50XzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEdG9BdHRyaUNvbExEdG9SZWZlcmVuY2VJRFRlcm1pbmFsUnVsZUNhbGxfMV8wXzEgPSAoUnVsZUNhbGwpY0R0b0F0dHJpQ29sTER0b1JlZmVyZW5jZUNyb3NzUmVmZXJlbmNlXzFfMC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgQXNzaWdubWVudCBjRHRvQXR0cmlVbmF1dGhvcml6ZWRBc3NpZ25tZW50XzIgPSAoQXNzaWdubWVudCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNEdG9BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wID0gKFJ1bGVDYWxsKWNEdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL1JvbGVEdG9SZWZlcmVuY2U6CisJCS8vCSJyZWZlcmVuY2UiIGR0b0F0dHJpQ29sPVtkdG86OkxEdG9SZWZlcmVuY2VdIGR0b0F0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW07CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy8icmVmZXJlbmNlIiBkdG9BdHRyaUNvbD1bZHRvOjpMRHRvUmVmZXJlbmNlXSBkdG9BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtCisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vInJlZmVyZW5jZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0UmVmZXJlbmNlS2V5d29yZF8wKCkgeyByZXR1cm4gY1JlZmVyZW5jZUtleXdvcmRfMDsgfQorCisJCS8vZHRvQXR0cmlDb2w9W2R0bzo6TER0b1JlZmVyZW5jZV0KKwkJcHVibGljIEFzc2lnbm1lbnQgZ2V0RHRvQXR0cmlDb2xBc3NpZ25tZW50XzEoKSB7IHJldHVybiBjRHRvQXR0cmlDb2xBc3NpZ25tZW50XzE7IH0KKworCQkvL1tkdG86OkxEdG9SZWZlcmVuY2VdCisJCXB1YmxpYyBDcm9zc1JlZmVyZW5jZSBnZXREdG9BdHRyaUNvbExEdG9SZWZlcmVuY2VDcm9zc1JlZmVyZW5jZV8xXzAoKSB7IHJldHVybiBjRHRvQXR0cmlDb2xMRHRvUmVmZXJlbmNlQ3Jvc3NSZWZlcmVuY2VfMV8wOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RHRvQXR0cmlDb2xMRHRvUmVmZXJlbmNlSURUZXJtaW5hbFJ1bGVDYWxsXzFfMF8xKCkgeyByZXR1cm4gY0R0b0F0dHJpQ29sTER0b1JlZmVyZW5jZUlEVGVybWluYWxSdWxlQ2FsbF8xXzBfMTsgfQorCisJCS8vZHRvQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgQXNzaWdubWVudCBnZXREdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMigpIHsgcmV0dXJuIGNEdG9BdHRyaVVuYXV0aG9yaXplZEFzc2lnbm1lbnRfMjsgfQorCisJCS8vUm9sZVByb3BlcnR5RW51bQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0RHRvQXR0cmlVbmF1dGhvcml6ZWRSb2xlUHJvcGVydHlFbnVtRW51bVJ1bGVDYWxsXzJfMCgpIHsgcmV0dXJuIGNEdG9BdHRyaVVuYXV0aG9yaXplZFJvbGVQcm9wZXJ0eUVudW1FbnVtUnVsZUNhbGxfMl8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIEF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIkF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkIik7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwID0gKEdyb3VwKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNRdWFsaWZpZWROYW1lUGFyc2VyUnVsZUNhbGxfMCA9IChSdWxlQ2FsbCljR3JvdXAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEdyb3VwIGNHcm91cF8xID0gKEdyb3VwKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRnVsbFN0b3BLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNBc3Rlcmlza0tleXdvcmRfMV8xID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDoKKwkJLy8JUXVhbGlmaWVkTmFtZSAoIi4iICIqIik/OworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vUXVhbGlmaWVkTmFtZSAoIi4iICIqIik/CisJCXB1YmxpYyBHcm91cCBnZXRHcm91cCgpIHsgcmV0dXJuIGNHcm91cDsgfQorCisJCS8vUXVhbGlmaWVkTmFtZQorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0UXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzAoKSB7IHJldHVybiBjUXVhbGlmaWVkTmFtZVBhcnNlclJ1bGVDYWxsXzA7IH0KKworCQkvLygiLiIgIioiKT8KKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzEoKSB7IHJldHVybiBjR3JvdXBfMTsgfQorCisJCS8vIi4iCisJCXB1YmxpYyBLZXl3b3JkIGdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSB7IHJldHVybiBjRnVsbFN0b3BLZXl3b3JkXzFfMDsgfQorCisJCS8vIioiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFzdGVyaXNrS2V5d29yZF8xXzEoKSB7IHJldHVybiBjQXN0ZXJpc2tLZXl3b3JkXzFfMTsgfQorCX0KKworCXB1YmxpYyBjbGFzcyBRdWFsaWZpZWROYW1lRWxlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlclJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBQYXJzZXJSdWxlIHJ1bGUgPSAoUGFyc2VyUnVsZSkgR3JhbW1hclV0aWwuZmluZFJ1bGVGb3JOYW1lKGdldEdyYW1tYXIoKSwgIlF1YWxpZmllZE5hbWUiKTsKKwkJcHJpdmF0ZSBmaW5hbCBHcm91cCBjR3JvdXAgPSAoR3JvdXApcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgUnVsZUNhbGwgY1ZhbGlkSURQYXJzZXJSdWxlQ2FsbF8wID0gKFJ1bGVDYWxsKWNHcm91cC5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgR3JvdXAgY0dyb3VwXzEgPSAoR3JvdXApY0dyb3VwLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNGdWxsU3RvcEtleXdvcmRfMV8wID0gKEtleXdvcmQpY0dyb3VwXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xID0gKFJ1bGVDYWxsKWNHcm91cF8xLmVDb250ZW50cygpLmdldCgxKTsKKwkJCisJCS8vUXVhbGlmaWVkTmFtZToKKwkJLy8JVmFsaWRJRCAoIi4iIFZhbGlkSUQpKjsKKwkJcHVibGljIFBhcnNlclJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL1ZhbGlkSUQgKCIuIiBWYWxpZElEKSoKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwKCkgeyByZXR1cm4gY0dyb3VwOyB9CisKKwkJLy9WYWxpZElECisJCXB1YmxpYyBSdWxlQ2FsbCBnZXRWYWxpZElEUGFyc2VyUnVsZUNhbGxfMCgpIHsgcmV0dXJuIGNWYWxpZElEUGFyc2VyUnVsZUNhbGxfMDsgfQorCisJCS8vKD0+ICIuIiBWYWxpZElEKSoKKwkJcHVibGljIEdyb3VwIGdldEdyb3VwXzEoKSB7IHJldHVybiBjR3JvdXBfMTsgfQorCisJCS8vPT4gIi4iCisJCXB1YmxpYyBLZXl3b3JkIGdldEZ1bGxTdG9wS2V5d29yZF8xXzAoKSB7IHJldHVybiBjRnVsbFN0b3BLZXl3b3JkXzFfMDsgfQorCisJCS8vVmFsaWRJRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0VmFsaWRJRFBhcnNlclJ1bGVDYWxsXzFfMSgpIHsgcmV0dXJuIGNWYWxpZElEUGFyc2VyUnVsZUNhbGxfMV8xOyB9CisJfQorCisJcHVibGljIGNsYXNzIFZhbGlkSURFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVmFsaWRJRCIpOworCQlwcml2YXRlIGZpbmFsIFJ1bGVDYWxsIGNJRFRlcm1pbmFsUnVsZUNhbGwgPSAoUnVsZUNhbGwpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCQorCQkvL1ZhbGlkSUQ6CisJCS8vCUlEOworCQlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSdWxlKCkgeyByZXR1cm4gcnVsZTsgfQorCisJCS8vSUQKKwkJcHVibGljIFJ1bGVDYWxsIGdldElEVGVybWluYWxSdWxlQ2FsbCgpIHsgcmV0dXJuIGNJRFRlcm1pbmFsUnVsZUNhbGw7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgVFJBTlNMQVRBQkxFSURFbGVtZW50cyBleHRlbmRzIEFic3RyYWN0UGFyc2VyUnVsZUVsZW1lbnRGaW5kZXIgeworCQlwcml2YXRlIGZpbmFsIFBhcnNlclJ1bGUgcnVsZSA9IChQYXJzZXJSdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiVFJBTlNMQVRBQkxFSUQiKTsKKwkJcHJpdmF0ZSBmaW5hbCBSdWxlQ2FsbCBjSURUZXJtaW5hbFJ1bGVDYWxsID0gKFJ1bGVDYWxsKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQkKKwkJLy9UUkFOU0xBVEFCTEVJRDoKKwkJLy8JSUQ7CisJCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9JRAorCQlwdWJsaWMgUnVsZUNhbGwgZ2V0SURUZXJtaW5hbFJ1bGVDYWxsKCkgeyByZXR1cm4gY0lEVGVybWluYWxSdWxlQ2FsbDsgfQorCX0KKwkKKwkKKwlwdWJsaWMgY2xhc3MgUm9sZUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUVudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBBbHRlcm5hdGl2ZXMgY0FsdGVybmF0aXZlcyA9IChBbHRlcm5hdGl2ZXMpcnVsZS5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBjQW55RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMCk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjQW55QW55S2V5d29yZF8wXzAgPSAoS2V5d29yZCljQW55RW51bUxpdGVyYWxEZWNsYXJhdGlvbl8wLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNDcmVhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNDcmVhdGFibGVDcmVhdGFibGVLZXl3b3JkXzFfMCA9IChLZXl3b3JkKWNDcmVhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzEuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1JlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMik7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjUmVhZGFibGVSZWFkYWJsZUtleXdvcmRfMl8wID0gKEtleXdvcmQpY1JlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNVcGRhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgzKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNVcGRhdGFibGVVcGRhdGFibGVLZXl3b3JkXzNfMCA9IChLZXl3b3JkKWNVcGRhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0RlbGV0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDQpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0RlbGV0YWJsZURlbGV0YWJsZUtleXdvcmRfNF8wID0gKEtleXdvcmQpY0RlbGV0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNC5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gUm9sZUVudW06CisJCS8vCWFueSB8IGNyZWF0YWJsZSB8IHJlYWRhYmxlIHwgdXBkYXRhYmxlIHwgZGVsZXRhYmxlOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL2FueSB8IGNyZWF0YWJsZSB8IHJlYWRhYmxlIHwgdXBkYXRhYmxlIHwgZGVsZXRhYmxlCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vYW55CisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEFueUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNBbnlFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJhbnkiCisJCXB1YmxpYyBLZXl3b3JkIGdldEFueUFueUtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0FueUFueUtleXdvcmRfMF8wOyB9CisKKwkJLy9jcmVhdGFibGUKKwkJcHVibGljIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gZ2V0Q3JlYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xKCkgeyByZXR1cm4gY0NyZWF0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vImNyZWF0YWJsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0Q3JlYXRhYmxlQ3JlYXRhYmxlS2V5d29yZF8xXzAoKSB7IHJldHVybiBjQ3JlYXRhYmxlQ3JlYXRhYmxlS2V5d29yZF8xXzA7IH0KKworCQkvL3JlYWRhYmxlCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldFJlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yKCkgeyByZXR1cm4gY1JlYWRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8yOyB9CisKKwkJLy8icmVhZGFibGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFJlYWRhYmxlUmVhZGFibGVLZXl3b3JkXzJfMCgpIHsgcmV0dXJuIGNSZWFkYWJsZVJlYWRhYmxlS2V5d29yZF8yXzA7IH0KKworCQkvL3VwZGF0YWJsZQorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRVcGRhdGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzMoKSB7IHJldHVybiBjVXBkYXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8zOyB9CisKKwkJLy8idXBkYXRhYmxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXRVcGRhdGFibGVVcGRhdGFibGVLZXl3b3JkXzNfMCgpIHsgcmV0dXJuIGNVcGRhdGFibGVVcGRhdGFibGVLZXl3b3JkXzNfMDsgfQorCisJCS8vZGVsZXRhYmxlCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldERlbGV0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fNCgpIHsgcmV0dXJuIGNEZWxldGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzQ7IH0KKworCQkvLyJkZWxldGFibGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldERlbGV0YWJsZURlbGV0YWJsZUtleXdvcmRfNF8wKCkgeyByZXR1cm4gY0RlbGV0YWJsZURlbGV0YWJsZUtleXdvcmRfNF8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVQcm9wZXJ0eUVudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZVByb3BlcnR5RW51bSIpOworCQlwcml2YXRlIGZpbmFsIEFsdGVybmF0aXZlcyBjQWx0ZXJuYXRpdmVzID0gKEFsdGVybmF0aXZlcylydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNJbnZpc2libGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAgPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbiljQWx0ZXJuYXRpdmVzLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNJbnZpc2libGVJbnZpc2libGVLZXl3b3JkXzBfMCA9IChLZXl3b3JkKWNJbnZpc2libGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzAuZUNvbnRlbnRzKCkuZ2V0KDApOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY0Rpc2FibGVkRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xID0gKEVudW1MaXRlcmFsRGVjbGFyYXRpb24pY0FsdGVybmF0aXZlcy5lQ29udGVudHMoKS5nZXQoMSk7CisJCXByaXZhdGUgZmluYWwgS2V5d29yZCBjRGlzYWJsZWREaXNhYmxlZEtleXdvcmRfMV8wID0gKEtleXdvcmQpY0Rpc2FibGVkRW51bUxpdGVyYWxEZWNsYXJhdGlvbl8xLmVDb250ZW50cygpLmdldCgwKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNOb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKWNBbHRlcm5hdGl2ZXMuZUNvbnRlbnRzKCkuZ2V0KDIpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY05vbmVkaXRhYmxlTm9uZWRpdGFibGVLZXl3b3JkXzJfMCA9IChLZXl3b3JkKWNOb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gUm9sZVByb3BlcnR5RW51bToKKwkJLy8JaW52aXNpYmxlIHwgZGlzYWJsZWQgfCBub25lZGl0YWJsZTsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9pbnZpc2libGUgfCBkaXNhYmxlZCB8IG5vbmVkaXRhYmxlCisJCXB1YmxpYyBBbHRlcm5hdGl2ZXMgZ2V0QWx0ZXJuYXRpdmVzKCkgeyByZXR1cm4gY0FsdGVybmF0aXZlczsgfQorCisJCS8vaW52aXNpYmxlCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEludmlzaWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMCgpIHsgcmV0dXJuIGNJbnZpc2libGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uXzA7IH0KKworCQkvLyJpbnZpc2libGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldEludmlzaWJsZUludmlzaWJsZUtleXdvcmRfMF8wKCkgeyByZXR1cm4gY0ludmlzaWJsZUludmlzaWJsZUtleXdvcmRfMF8wOyB9CisKKwkJLy9kaXNhYmxlZAorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXREaXNhYmxlZEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMSgpIHsgcmV0dXJuIGNEaXNhYmxlZEVudW1MaXRlcmFsRGVjbGFyYXRpb25fMTsgfQorCisJCS8vImRpc2FibGVkIgorCQlwdWJsaWMgS2V5d29yZCBnZXREaXNhYmxlZERpc2FibGVkS2V5d29yZF8xXzAoKSB7IHJldHVybiBjRGlzYWJsZWREaXNhYmxlZEtleXdvcmRfMV8wOyB9CisKKwkJLy9ub25lZGl0YWJsZQorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXROb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMigpIHsgcmV0dXJuIGNOb25lZGl0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb25fMjsgfQorCisJCS8vIm5vbmVkaXRhYmxlIgorCQlwdWJsaWMgS2V5d29yZCBnZXROb25lZGl0YWJsZU5vbmVkaXRhYmxlS2V5d29yZF8yXzAoKSB7IHJldHVybiBjTm9uZWRpdGFibGVOb25lZGl0YWJsZUtleXdvcmRfMl8wOyB9CisJfQorCisJcHVibGljIGNsYXNzIFJvbGVCbGlwUHJvY2Vzc0VudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUJsaXBQcm9jZXNzRW51bSIpOworCQlwcml2YXRlIGZpbmFsIEVudW1MaXRlcmFsRGVjbGFyYXRpb24gY1N0YXJ0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb24gPSAoRW51bUxpdGVyYWxEZWNsYXJhdGlvbilydWxlLmVDb250ZW50cygpLmdldCgxKTsKKwkJcHJpdmF0ZSBmaW5hbCBLZXl3b3JkIGNTdGFydGFibGVTdGFydGFibGVLZXl3b3JkXzAgPSAoS2V5d29yZCljU3RhcnRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbi5lQ29udGVudHMoKS5nZXQoMCk7CisJCQorCQkvL2VudW0gUm9sZUJsaXBQcm9jZXNzRW51bToKKwkJLy8Jc3RhcnRhYmxlOworCQlwdWJsaWMgRW51bVJ1bGUgZ2V0UnVsZSgpIHsgcmV0dXJuIHJ1bGU7IH0KKworCQkvL3N0YXJ0YWJsZQorCQlwdWJsaWMgRW51bUxpdGVyYWxEZWNsYXJhdGlvbiBnZXRTdGFydGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkgeyByZXR1cm4gY1N0YXJ0YWJsZUVudW1MaXRlcmFsRGVjbGFyYXRpb247IH0KKworCQkvLyJzdGFydGFibGUiCisJCXB1YmxpYyBLZXl3b3JkIGdldFN0YXJ0YWJsZVN0YXJ0YWJsZUtleXdvcmRfMCgpIHsgcmV0dXJuIGNTdGFydGFibGVTdGFydGFibGVLZXl3b3JkXzA7IH0KKwl9CisKKwlwdWJsaWMgY2xhc3MgUm9sZUJsaXBVc2VyVGFza0VudW1FbGVtZW50cyBleHRlbmRzIEFic3RyYWN0RW51bVJ1bGVFbGVtZW50RmluZGVyIHsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtUnVsZSBydWxlID0gKEVudW1SdWxlKSBHcmFtbWFyVXRpbC5maW5kUnVsZUZvck5hbWUoZ2V0R3JhbW1hcigpLCAiUm9sZUJsaXBVc2VyVGFza0VudW0iKTsKKwkJcHJpdmF0ZSBmaW5hbCBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGNFeGVjdXRhYmxlRW51bUxpdGVyYWxEZWNsYXJhdGlvbiA9IChFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKXJ1bGUuZUNvbnRlbnRzKCkuZ2V0KDEpOworCQlwcml2YXRlIGZpbmFsIEtleXdvcmQgY0V4ZWN1dGFibGVFeGVjdXRhYmxlS2V5d29yZF8wID0gKEtleXdvcmQpY0V4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uLmVDb250ZW50cygpLmdldCgwKTsKKwkJCisJCS8vZW51bSBSb2xlQmxpcFVzZXJUYXNrRW51bToKKwkJLy8JZXhlY3V0YWJsZTsKKwkJcHVibGljIEVudW1SdWxlIGdldFJ1bGUoKSB7IHJldHVybiBydWxlOyB9CisKKwkJLy9leGVjdXRhYmxlCisJCXB1YmxpYyBFbnVtTGl0ZXJhbERlY2xhcmF0aW9uIGdldEV4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uKCkgeyByZXR1cm4gY0V4ZWN1dGFibGVFbnVtTGl0ZXJhbERlY2xhcmF0aW9uOyB9CisKKwkJLy8iZXhlY3V0YWJsZSIKKwkJcHVibGljIEtleXdvcmQgZ2V0RXhlY3V0YWJsZUV4ZWN1dGFibGVLZXl3b3JkXzAoKSB7IHJldHVybiBjRXhlY3V0YWJsZUV4ZWN1dGFibGVLZXl3b3JkXzA7IH0KKwl9CisJCisJcHJpdmF0ZSBmaW5hbCBBdXRob3JpemF0aW9uTW9kZWxFbGVtZW50cyBwQXV0aG9yaXphdGlvbk1vZGVsOworCXByaXZhdGUgZmluYWwgQXV0aG9yaXphdGlvblBhY2thZ2VFbGVtZW50cyBwQXV0aG9yaXphdGlvblBhY2thZ2U7CisJcHJpdmF0ZSBmaW5hbCBBdXRob3JpemF0aW9uSW1wb3J0RWxlbWVudHMgcEF1dGhvcml6YXRpb25JbXBvcnQ7CisJcHJpdmF0ZSBmaW5hbCBSb2xlRWxlbWVudHMgcFJvbGU7CisJcHJpdmF0ZSBmaW5hbCBSb2xlRWxlbWVudEVsZW1lbnRzIHBSb2xlRWxlbWVudDsKKwlwcml2YXRlIGZpbmFsIFJvbGVFbnRpdHlFbGVtZW50cyBwUm9sZUVudGl0eTsKKwlwcml2YXRlIGZpbmFsIFJvbGVCZWFuRWxlbWVudHMgcFJvbGVCZWFuOworCXByaXZhdGUgZmluYWwgUm9sZUR0b0VsZW1lbnRzIHBSb2xlRHRvOworCXByaXZhdGUgZmluYWwgUm9sZUJsaXBBbGxVc2VyVGFza3NFbGVtZW50cyBwUm9sZUJsaXBBbGxVc2VyVGFza3M7CisJcHJpdmF0ZSBmaW5hbCBSb2xlQmxpcFVzZXJUYXNrRWxlbWVudHMgcFJvbGVCbGlwVXNlclRhc2s7CisJcHJpdmF0ZSBmaW5hbCBSb2xlQmxpcFByb2Nlc3NFbGVtZW50cyBwUm9sZUJsaXBQcm9jZXNzOworCXByaXZhdGUgZmluYWwgUm9sZUVudGl0eUZlYXR1cmVFbGVtZW50cyBwUm9sZUVudGl0eUZlYXR1cmU7CisJcHJpdmF0ZSBmaW5hbCBSb2xlRW50aXR5QXR0cmlidXRlRWxlbWVudHMgcFJvbGVFbnRpdHlBdHRyaWJ1dGU7CisJcHJpdmF0ZSBmaW5hbCBSb2xlRW50aXR5UmVmZXJlbmNlRWxlbWVudHMgcFJvbGVFbnRpdHlSZWZlcmVuY2U7CisJcHJpdmF0ZSBmaW5hbCBSb2xlQmVhbkZlYXR1cmVFbGVtZW50cyBwUm9sZUJlYW5GZWF0dXJlOworCXByaXZhdGUgZmluYWwgUm9sZUJlYW5BdHRyaWJ1dGVFbGVtZW50cyBwUm9sZUJlYW5BdHRyaWJ1dGU7CisJcHJpdmF0ZSBmaW5hbCBSb2xlQmVhblJlZmVyZW5jZUVsZW1lbnRzIHBSb2xlQmVhblJlZmVyZW5jZTsKKwlwcml2YXRlIGZpbmFsIFJvbGVEdG9GZWF0dXJlRWxlbWVudHMgcFJvbGVEdG9GZWF0dXJlOworCXByaXZhdGUgZmluYWwgUm9sZUR0b0F0dHJpYnV0ZUVsZW1lbnRzIHBSb2xlRHRvQXR0cmlidXRlOworCXByaXZhdGUgZmluYWwgUm9sZUR0b1JlZmVyZW5jZUVsZW1lbnRzIHBSb2xlRHRvUmVmZXJlbmNlOworCXByaXZhdGUgZmluYWwgUm9sZUVudW1FbGVtZW50cyB1bmtub3duUnVsZVJvbGVFbnVtOworCXByaXZhdGUgZmluYWwgUm9sZVByb3BlcnR5RW51bUVsZW1lbnRzIHVua25vd25SdWxlUm9sZVByb3BlcnR5RW51bTsKKwlwcml2YXRlIGZpbmFsIFJvbGVCbGlwUHJvY2Vzc0VudW1FbGVtZW50cyB1bmtub3duUnVsZVJvbGVCbGlwUHJvY2Vzc0VudW07CisJcHJpdmF0ZSBmaW5hbCBSb2xlQmxpcFVzZXJUYXNrRW51bUVsZW1lbnRzIHVua25vd25SdWxlUm9sZUJsaXBVc2VyVGFza0VudW07CisJcHJpdmF0ZSBmaW5hbCBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEVsZW1lbnRzIHBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKwlwcml2YXRlIGZpbmFsIFF1YWxpZmllZE5hbWVFbGVtZW50cyBwUXVhbGlmaWVkTmFtZTsKKwlwcml2YXRlIGZpbmFsIFZhbGlkSURFbGVtZW50cyBwVmFsaWRJRDsKKwlwcml2YXRlIGZpbmFsIFRSQU5TTEFUQUJMRUlERWxlbWVudHMgcFRSQU5TTEFUQUJMRUlEOworCQorCXByaXZhdGUgZmluYWwgR3JhbW1hciBncmFtbWFyOworCisJcHJpdmF0ZSBmaW5hbCBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MgZ2FYYmFzZVdpdGhBbm5vdGF0aW9uczsKKworCUBJbmplY3QKKwlwdWJsaWMgQXV0aG9yaXphdGlvbkRTTEdyYW1tYXJBY2Nlc3MoR3JhbW1hclByb3ZpZGVyIGdyYW1tYXJQcm92aWRlciwKKwkJWGJhc2VXaXRoQW5ub3RhdGlvbnNHcmFtbWFyQWNjZXNzIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMpIHsKKwkJdGhpcy5ncmFtbWFyID0gaW50ZXJuYWxGaW5kR3JhbW1hcihncmFtbWFyUHJvdmlkZXIpOworCQl0aGlzLmdhWGJhc2VXaXRoQW5ub3RhdGlvbnMgPSBnYVhiYXNlV2l0aEFubm90YXRpb25zOworCQl0aGlzLnBBdXRob3JpemF0aW9uTW9kZWwgPSBuZXcgQXV0aG9yaXphdGlvbk1vZGVsRWxlbWVudHMoKTsKKwkJdGhpcy5wQXV0aG9yaXphdGlvblBhY2thZ2UgPSBuZXcgQXV0aG9yaXphdGlvblBhY2thZ2VFbGVtZW50cygpOworCQl0aGlzLnBBdXRob3JpemF0aW9uSW1wb3J0ID0gbmV3IEF1dGhvcml6YXRpb25JbXBvcnRFbGVtZW50cygpOworCQl0aGlzLnBSb2xlID0gbmV3IFJvbGVFbGVtZW50cygpOworCQl0aGlzLnBSb2xlRWxlbWVudCA9IG5ldyBSb2xlRWxlbWVudEVsZW1lbnRzKCk7CisJCXRoaXMucFJvbGVFbnRpdHkgPSBuZXcgUm9sZUVudGl0eUVsZW1lbnRzKCk7CisJCXRoaXMucFJvbGVCZWFuID0gbmV3IFJvbGVCZWFuRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUR0byA9IG5ldyBSb2xlRHRvRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUJsaXBBbGxVc2VyVGFza3MgPSBuZXcgUm9sZUJsaXBBbGxVc2VyVGFza3NFbGVtZW50cygpOworCQl0aGlzLnBSb2xlQmxpcFVzZXJUYXNrID0gbmV3IFJvbGVCbGlwVXNlclRhc2tFbGVtZW50cygpOworCQl0aGlzLnBSb2xlQmxpcFByb2Nlc3MgPSBuZXcgUm9sZUJsaXBQcm9jZXNzRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUVudGl0eUZlYXR1cmUgPSBuZXcgUm9sZUVudGl0eUZlYXR1cmVFbGVtZW50cygpOworCQl0aGlzLnBSb2xlRW50aXR5QXR0cmlidXRlID0gbmV3IFJvbGVFbnRpdHlBdHRyaWJ1dGVFbGVtZW50cygpOworCQl0aGlzLnBSb2xlRW50aXR5UmVmZXJlbmNlID0gbmV3IFJvbGVFbnRpdHlSZWZlcmVuY2VFbGVtZW50cygpOworCQl0aGlzLnBSb2xlQmVhbkZlYXR1cmUgPSBuZXcgUm9sZUJlYW5GZWF0dXJlRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUJlYW5BdHRyaWJ1dGUgPSBuZXcgUm9sZUJlYW5BdHRyaWJ1dGVFbGVtZW50cygpOworCQl0aGlzLnBSb2xlQmVhblJlZmVyZW5jZSA9IG5ldyBSb2xlQmVhblJlZmVyZW5jZUVsZW1lbnRzKCk7CisJCXRoaXMucFJvbGVEdG9GZWF0dXJlID0gbmV3IFJvbGVEdG9GZWF0dXJlRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUR0b0F0dHJpYnV0ZSA9IG5ldyBSb2xlRHRvQXR0cmlidXRlRWxlbWVudHMoKTsKKwkJdGhpcy5wUm9sZUR0b1JlZmVyZW5jZSA9IG5ldyBSb2xlRHRvUmVmZXJlbmNlRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVJvbGVFbnVtID0gbmV3IFJvbGVFbnVtRWxlbWVudHMoKTsKKwkJdGhpcy51bmtub3duUnVsZVJvbGVQcm9wZXJ0eUVudW0gPSBuZXcgUm9sZVByb3BlcnR5RW51bUVsZW1lbnRzKCk7CisJCXRoaXMudW5rbm93blJ1bGVSb2xlQmxpcFByb2Nlc3NFbnVtID0gbmV3IFJvbGVCbGlwUHJvY2Vzc0VudW1FbGVtZW50cygpOworCQl0aGlzLnVua25vd25SdWxlUm9sZUJsaXBVc2VyVGFza0VudW0gPSBuZXcgUm9sZUJsaXBVc2VyVGFza0VudW1FbGVtZW50cygpOworCQl0aGlzLnBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCA9IG5ldyBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEVsZW1lbnRzKCk7CisJCXRoaXMucFF1YWxpZmllZE5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZUVsZW1lbnRzKCk7CisJCXRoaXMucFZhbGlkSUQgPSBuZXcgVmFsaWRJREVsZW1lbnRzKCk7CisJCXRoaXMucFRSQU5TTEFUQUJMRUlEID0gbmV3IFRSQU5TTEFUQUJMRUlERWxlbWVudHMoKTsKKwl9CisJCisJcHJvdGVjdGVkIEdyYW1tYXIgaW50ZXJuYWxGaW5kR3JhbW1hcihHcmFtbWFyUHJvdmlkZXIgZ3JhbW1hclByb3ZpZGVyKSB7CisJCUdyYW1tYXIgZ3JhbW1hciA9IGdyYW1tYXJQcm92aWRlci5nZXRHcmFtbWFyKHRoaXMpOworCQl3aGlsZSAoZ3JhbW1hciAhPSBudWxsKSB7CisJCQlpZiAoIm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMIi5lcXVhbHMoZ3JhbW1hci5nZXROYW1lKCkpKSB7CisJCQkJcmV0dXJuIGdyYW1tYXI7CisJCQl9CisJCQlMaXN0PEdyYW1tYXI+IGdyYW1tYXJzID0gZ3JhbW1hci5nZXRVc2VkR3JhbW1hcnMoKTsKKwkJCWlmICghZ3JhbW1hcnMuaXNFbXB0eSgpKSB7CisJCQkJZ3JhbW1hciA9IGdyYW1tYXJzLml0ZXJhdG9yKCkubmV4dCgpOworCQkJfSBlbHNlIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gZ3JhbW1hcjsKKwl9CisJCisJCisJcHVibGljIEdyYW1tYXIgZ2V0R3JhbW1hcigpIHsKKwkJcmV0dXJuIGdyYW1tYXI7CisJfQorCQorCisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2VzcyBnZXRYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zOworCX0KKworCQorCS8vQXV0aG9yaXphdGlvbk1vZGVsOgorCS8vCXBja2c9QXV0aG9yaXphdGlvblBhY2thZ2U7CisJcHVibGljIEF1dGhvcml6YXRpb25Nb2RlbEVsZW1lbnRzIGdldEF1dGhvcml6YXRpb25Nb2RlbEFjY2VzcygpIHsKKwkJcmV0dXJuIHBBdXRob3JpemF0aW9uTW9kZWw7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEF1dGhvcml6YXRpb25Nb2RlbFJ1bGUoKSB7CisJCXJldHVybiBnZXRBdXRob3JpemF0aW9uTW9kZWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9BdXRob3JpemF0aW9uUGFja2FnZToKKwkvLwl7QXV0aG9yaXphdGlvblBhY2thZ2V9ICJwYWNrYWdlIiBuYW1lPVF1YWxpZmllZE5hbWUgInsiIGltcG9ydHMrPUF1dGhvcml6YXRpb25JbXBvcnQqIHJvbGVzKz1Sb2xlKiAifSI7CisJcHVibGljIEF1dGhvcml6YXRpb25QYWNrYWdlRWxlbWVudHMgZ2V0QXV0aG9yaXphdGlvblBhY2thZ2VBY2Nlc3MoKSB7CisJCXJldHVybiBwQXV0aG9yaXphdGlvblBhY2thZ2U7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEF1dGhvcml6YXRpb25QYWNrYWdlUnVsZSgpIHsKKwkJcmV0dXJuIGdldEF1dGhvcml6YXRpb25QYWNrYWdlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vQXV0aG9yaXphdGlvbkltcG9ydCByZXR1cm5zIHR5cGVzOjpMSW1wb3J0OgorCS8vCSJpbXBvcnQiIGltcG9ydGVkTmFtZXNwYWNlPUF1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOworCXB1YmxpYyBBdXRob3JpemF0aW9uSW1wb3J0RWxlbWVudHMgZ2V0QXV0aG9yaXphdGlvbkltcG9ydEFjY2VzcygpIHsKKwkJcmV0dXJuIHBBdXRob3JpemF0aW9uSW1wb3J0OworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRBdXRob3JpemF0aW9uSW1wb3J0UnVsZSgpIHsKKwkJcmV0dXJuIGdldEF1dGhvcml6YXRpb25JbXBvcnRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlOgorCS8vCSJyb2xlIiBuYW1lPVRSQU5TTEFUQUJMRUlEICJ7IiByb2xlRWxlbWVudHMrPVJvbGVFbGVtZW50KiAifSI7CisJcHVibGljIFJvbGVFbGVtZW50cyBnZXRSb2xlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJvbGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JvbGVFbGVtZW50OgorCS8vCVJvbGVFbnRpdHkgfCBSb2xlQmVhbiB8IFJvbGVEdG8gfCBSb2xlQmxpcFByb2Nlc3M7CisJcHVibGljIFJvbGVFbGVtZW50RWxlbWVudHMgZ2V0Um9sZUVsZW1lbnRBY2Nlc3MoKSB7CisJCXJldHVybiBwUm9sZUVsZW1lbnQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJvbGVFbGVtZW50UnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVFbGVtZW50QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUm9sZUVudGl0eToKKwkvLwl7Um9sZUVudGl0eX0gImVudGl0eSIgZW50aXR5UmVmPVtlbnRpdHk6OkxFbnRpdHldIGVudGl0eUF1dGhvcml6ZWQrPVJvbGVFbnVtKyAoInsiIGVudGl0eUZlYXR1cmVzKz1Sb2xlRW50aXR5RmVhdHVyZSsKKwkvLwkifSIpPzsKKwlwdWJsaWMgUm9sZUVudGl0eUVsZW1lbnRzIGdldFJvbGVFbnRpdHlBY2Nlc3MoKSB7CisJCXJldHVybiBwUm9sZUVudGl0eTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUVudGl0eVJ1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlRW50aXR5QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUm9sZUJlYW46CisJLy8Je1JvbGVCZWFufSAiYmVhbiIgYmVhblJlZj1bZW50aXR5OjpMQmVhbl0gYmVhbkF1dGhvcml6ZWQrPVJvbGVFbnVtKyAoInsiIGJlYW5GZWF0dXJlcys9Um9sZUJlYW5GZWF0dXJlKyAifSIpPzsKKwlwdWJsaWMgUm9sZUJlYW5FbGVtZW50cyBnZXRSb2xlQmVhbkFjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlQmVhbjsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUJlYW5SdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUJlYW5BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlRHRvOgorCS8vCXtSb2xlRHRvfSAiZHRvIiBkdG9SZWY9W2R0bzo6TER0b10gZHRvQXV0aG9yaXplZCs9Um9sZUVudW0rICgieyIgZHRvRmVhdHVyZXMrPVJvbGVEdG9GZWF0dXJlKyAifSIpPzsKKwlwdWJsaWMgUm9sZUR0b0VsZW1lbnRzIGdldFJvbGVEdG9BY2Nlc3MoKSB7CisJCXJldHVybiBwUm9sZUR0bzsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUR0b1J1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlRHRvQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUm9sZUJsaXBBbGxVc2VyVGFza3M6CisJLy8Je1JvbGVCbGlwQWxsVXNlclRhc2tzfSAiYWxsIiAidXNlcnRhc2tzIiBhdXRob3JpemVkPVJvbGVCbGlwVXNlclRhc2tFbnVtOworCXB1YmxpYyBSb2xlQmxpcEFsbFVzZXJUYXNrc0VsZW1lbnRzIGdldFJvbGVCbGlwQWxsVXNlclRhc2tzQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGVCbGlwQWxsVXNlclRhc2tzOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlQmxpcEFsbFVzZXJUYXNrc1J1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlQmxpcEFsbFVzZXJUYXNrc0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JvbGVCbGlwVXNlclRhc2s6CisJLy8Je1JvbGVCbGlwVXNlclRhc2t9ICJ1c2VydGFzayIgdXNlclRhc2s9W2JsaXA6OkJsaXBVc2VyVGFza3xRdWFsaWZpZWROYW1lXSBhdXRob3JpemVkPVJvbGVCbGlwVXNlclRhc2tFbnVtOworCXB1YmxpYyBSb2xlQmxpcFVzZXJUYXNrRWxlbWVudHMgZ2V0Um9sZUJsaXBVc2VyVGFza0FjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlQmxpcFVzZXJUYXNrOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlQmxpcFVzZXJUYXNrUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVCbGlwVXNlclRhc2tBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlQmxpcFByb2Nlc3M6CisJLy8Je1JvbGVCbGlwUHJvY2Vzc30gInByb2Nlc3MiIHByb2Nlc3M9W2JsaXA6OkJsaXBdICJ7IiAoImlzIiBwcm9jZXNzU3RhcnRBdXRob3JpemVkPVJvbGVCbGlwUHJvY2Vzc0VudW0pPworCS8vCWFsbFVzZXJUYXNrcz1Sb2xlQmxpcEFsbFVzZXJUYXNrcz8gdXNlclRhc2tzKz1Sb2xlQmxpcFVzZXJUYXNrKiAifSI7CisJcHVibGljIFJvbGVCbGlwUHJvY2Vzc0VsZW1lbnRzIGdldFJvbGVCbGlwUHJvY2Vzc0FjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlQmxpcFByb2Nlc3M7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJvbGVCbGlwUHJvY2Vzc1J1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlQmxpcFByb2Nlc3NBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlRW50aXR5RmVhdHVyZToKKwkvLwlSb2xlRW50aXR5QXR0cmlidXRlIHwgUm9sZUVudGl0eVJlZmVyZW5jZTsKKwlwdWJsaWMgUm9sZUVudGl0eUZlYXR1cmVFbGVtZW50cyBnZXRSb2xlRW50aXR5RmVhdHVyZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlRW50aXR5RmVhdHVyZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUVudGl0eUZlYXR1cmVSdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUVudGl0eUZlYXR1cmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlRW50aXR5QXR0cmlidXRlOgorCS8vCSJwcm9wZXJ0eSIgZW50aXR5QXR0cmlDb2w9W2VudGl0eTo6TEVudGl0eUF0dHJpYnV0ZV0gZW50aXR5QXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwlwdWJsaWMgUm9sZUVudGl0eUF0dHJpYnV0ZUVsZW1lbnRzIGdldFJvbGVFbnRpdHlBdHRyaWJ1dGVBY2Nlc3MoKSB7CisJCXJldHVybiBwUm9sZUVudGl0eUF0dHJpYnV0ZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUVudGl0eUF0dHJpYnV0ZVJ1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlRW50aXR5QXR0cmlidXRlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vUm9sZUVudGl0eVJlZmVyZW5jZToKKwkvLwkicmVmZXJlbmNlIiBlbnRpdHlBdHRyaUNvbD1bZW50aXR5OjpMRW50aXR5UmVmZXJlbmNlXSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCXB1YmxpYyBSb2xlRW50aXR5UmVmZXJlbmNlRWxlbWVudHMgZ2V0Um9sZUVudGl0eVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlRW50aXR5UmVmZXJlbmNlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlRW50aXR5UmVmZXJlbmNlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVFbnRpdHlSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlQmVhbkZlYXR1cmU6CisJLy8JUm9sZUJlYW5BdHRyaWJ1dGUgfCBSb2xlQmVhblJlZmVyZW5jZTsKKwlwdWJsaWMgUm9sZUJlYW5GZWF0dXJlRWxlbWVudHMgZ2V0Um9sZUJlYW5GZWF0dXJlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGVCZWFuRmVhdHVyZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUJlYW5GZWF0dXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVCZWFuRmVhdHVyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JvbGVCZWFuQXR0cmlidXRlOgorCS8vCSJwcm9wZXJ0eSIgYmVhbkF0dHJpQ29sPVtlbnRpdHk6OkxCZWFuQXR0cmlidXRlXSBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKwlwdWJsaWMgUm9sZUJlYW5BdHRyaWJ1dGVFbGVtZW50cyBnZXRSb2xlQmVhbkF0dHJpYnV0ZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlQmVhbkF0dHJpYnV0ZTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0Um9sZUJlYW5BdHRyaWJ1dGVSdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUJlYW5BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlQmVhblJlZmVyZW5jZToKKwkvLwkicmVmZXJlbmNlIiBiZWFuQXR0cmlDb2w9W2VudGl0eTo6TEJlYW5SZWZlcmVuY2VdIGJlYW5BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCXB1YmxpYyBSb2xlQmVhblJlZmVyZW5jZUVsZW1lbnRzIGdldFJvbGVCZWFuUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGVCZWFuUmVmZXJlbmNlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlQmVhblJlZmVyZW5jZVJ1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlQmVhblJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JvbGVEdG9GZWF0dXJlOgorCS8vCVJvbGVEdG9BdHRyaWJ1dGUgfCBSb2xlRHRvUmVmZXJlbmNlOworCXB1YmxpYyBSb2xlRHRvRmVhdHVyZUVsZW1lbnRzIGdldFJvbGVEdG9GZWF0dXJlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGVEdG9GZWF0dXJlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlRHRvRmVhdHVyZVJ1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlRHRvRmVhdHVyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1JvbGVEdG9BdHRyaWJ1dGU6CisJLy8JInByb3BlcnR5IiBkdG9BdHRyaUNvbD1bZHRvOjpMRHRvQXR0cmlidXRlXSBkdG9BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCXB1YmxpYyBSb2xlRHRvQXR0cmlidXRlRWxlbWVudHMgZ2V0Um9sZUR0b0F0dHJpYnV0ZUFjY2VzcygpIHsKKwkJcmV0dXJuIHBSb2xlRHRvQXR0cmlidXRlOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRSb2xlRHRvQXR0cmlidXRlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVEdG9BdHRyaWJ1dGVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Sb2xlRHRvUmVmZXJlbmNlOgorCS8vCSJyZWZlcmVuY2UiIGR0b0F0dHJpQ29sPVtkdG86OkxEdG9SZWZlcmVuY2VdIGR0b0F0dHJpVW5hdXRob3JpemVkPVJvbGVQcm9wZXJ0eUVudW07CisJcHVibGljIFJvbGVEdG9SZWZlcmVuY2VFbGVtZW50cyBnZXRSb2xlRHRvUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gcFJvbGVEdG9SZWZlcmVuY2U7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFJvbGVEdG9SZWZlcmVuY2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUR0b1JlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gUm9sZUVudW06CisJLy8JYW55IHwgY3JlYXRhYmxlIHwgcmVhZGFibGUgfCB1cGRhdGFibGUgfCBkZWxldGFibGU7CisJcHVibGljIFJvbGVFbnVtRWxlbWVudHMgZ2V0Um9sZUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZVJvbGVFbnVtOworCX0KKwkKKwlwdWJsaWMgRW51bVJ1bGUgZ2V0Um9sZUVudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIFJvbGVQcm9wZXJ0eUVudW06CisJLy8JaW52aXNpYmxlIHwgZGlzYWJsZWQgfCBub25lZGl0YWJsZTsKKwlwdWJsaWMgUm9sZVByb3BlcnR5RW51bUVsZW1lbnRzIGdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKSB7CisJCXJldHVybiB1bmtub3duUnVsZVJvbGVQcm9wZXJ0eUVudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRSb2xlUHJvcGVydHlFbnVtUnVsZSgpIHsKKwkJcmV0dXJuIGdldFJvbGVQcm9wZXJ0eUVudW1BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9lbnVtIFJvbGVCbGlwUHJvY2Vzc0VudW06CisJLy8Jc3RhcnRhYmxlOworCXB1YmxpYyBSb2xlQmxpcFByb2Nlc3NFbnVtRWxlbWVudHMgZ2V0Um9sZUJsaXBQcm9jZXNzRW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlUm9sZUJsaXBQcm9jZXNzRW51bTsKKwl9CisJCisJcHVibGljIEVudW1SdWxlIGdldFJvbGVCbGlwUHJvY2Vzc0VudW1SdWxlKCkgeworCQlyZXR1cm4gZ2V0Um9sZUJsaXBQcm9jZXNzRW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL2VudW0gUm9sZUJsaXBVc2VyVGFza0VudW06CisJLy8JZXhlY3V0YWJsZTsKKwlwdWJsaWMgUm9sZUJsaXBVc2VyVGFza0VudW1FbGVtZW50cyBnZXRSb2xlQmxpcFVzZXJUYXNrRW51bUFjY2VzcygpIHsKKwkJcmV0dXJuIHVua25vd25SdWxlUm9sZUJsaXBVc2VyVGFza0VudW07CisJfQorCQorCXB1YmxpYyBFbnVtUnVsZSBnZXRSb2xlQmxpcFVzZXJUYXNrRW51bVJ1bGUoKSB7CisJCXJldHVybiBnZXRSb2xlQmxpcFVzZXJUYXNrRW51bUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0F1dGhRdWFsaWZpZWROYW1lV2l0aFdpbGRDYXJkOgorCS8vCVF1YWxpZmllZE5hbWUgKCIuIiAiKiIpPzsKKwlwdWJsaWMgQXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRFbGVtZW50cyBnZXRBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZEFjY2VzcygpIHsKKwkJcmV0dXJuIHBBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0QXV0aFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9RdWFsaWZpZWROYW1lOgorCS8vCVZhbGlkSUQgKCIuIiBWYWxpZElEKSo7CisJcHVibGljIFF1YWxpZmllZE5hbWVFbGVtZW50cyBnZXRRdWFsaWZpZWROYW1lQWNjZXNzKCkgeworCQlyZXR1cm4gcFF1YWxpZmllZE5hbWU7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFF1YWxpZmllZE5hbWVSdWxlKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1ZhbGlkSUQ6CisJLy8JSUQ7CisJcHVibGljIFZhbGlkSURFbGVtZW50cyBnZXRWYWxpZElEQWNjZXNzKCkgeworCQlyZXR1cm4gcFZhbGlkSUQ7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFZhbGlkSURSdWxlKCkgeworCQlyZXR1cm4gZ2V0VmFsaWRJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1RSQU5TTEFUQUJMRUlEOgorCS8vCUlEOworCXB1YmxpYyBUUkFOU0xBVEFCTEVJREVsZW1lbnRzIGdldFRSQU5TTEFUQUJMRUlEQWNjZXNzKCkgeworCQlyZXR1cm4gcFRSQU5TTEFUQUJMRUlEOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRUUkFOU0xBVEFCTEVJRFJ1bGUoKSB7CisJCXJldHVybiBnZXRUUkFOU0xBVEFCTEVJREFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uOgorCS8vCXtYQW5ub3RhdGlvbn0gIkAiIGFubm90YXRpb25UeXBlPVt0eXBlczo6SnZtQW5ub3RhdGlvblR5cGV8UXVhbGlmaWVkTmFtZV0gKCIoIgorCS8vCShlbGVtZW50VmFsdWVQYWlycys9WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyICgiLCIgZWxlbWVudFZhbHVlUGFpcnMrPVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcikqIHwKKwkvLwl2YWx1ZT1YQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0KT8gIikiKT87CisJcHVibGljIFhiYXNlV2l0aEFubm90YXRpb25zR3JhbW1hckFjY2Vzcy5YQW5ub3RhdGlvbkVsZW1lbnRzIGdldFhBbm5vdGF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5ub3RhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpcjoKKwkvLwk9PiAoZWxlbWVudD1bdHlwZXM6Okp2bU9wZXJhdGlvbnxWYWxpZElEXSAiPSIpIHZhbHVlPVhBbm5vdGF0aW9uRWxlbWVudFZhbHVlOworCXB1YmxpYyBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MuWEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyRWxlbWVudHMgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZVBhaXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVQYWlyUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlUGFpckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3QgcmV0dXJucyB4YmFzZTo6WEV4cHJlc3Npb246CisJLy8JPT4gKHt4YmFzZTo6WExpc3RMaXRlcmFsfSAiIyIgIlsiKSAoZWxlbWVudHMrPVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICgiLCIgZWxlbWVudHMrPVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKSopPyAiXSIKKwkvLwl8IFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICh7eGJhc2U6OlhMaXN0TGl0ZXJhbC5lbGVtZW50cys9Y3VycmVudH0gKCIsIiBlbGVtZW50cys9WEFubm90YXRpb25PckV4cHJlc3Npb24pKyk/OworCXB1YmxpYyBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MuWEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdEVsZW1lbnRzIGdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBbm5vdGF0aW9uRWxlbWVudFZhbHVlT3JDb21tYUxpc3RBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVPckNvbW1hTGlzdFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZU9yQ29tbWFMaXN0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFubm90YXRpb25FbGVtZW50VmFsdWUgcmV0dXJucyB4YmFzZTo6WEV4cHJlc3Npb246CisJLy8JPT4gKHt4YmFzZTo6WExpc3RMaXRlcmFsfSAiIyIgIlsiKSAoZWxlbWVudHMrPVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uICgiLCIgZWxlbWVudHMrPVhBbm5vdGF0aW9uT3JFeHByZXNzaW9uKSopPyAiXSIKKwkvLwl8IFhBbm5vdGF0aW9uT3JFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MuWEFubm90YXRpb25FbGVtZW50VmFsdWVFbGVtZW50cyBnZXRYQW5ub3RhdGlvbkVsZW1lbnRWYWx1ZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVSdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25FbGVtZW50VmFsdWVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQW5ub3RhdGlvbk9yRXhwcmVzc2lvbiByZXR1cm5zIHhiYXNlOjpYRXhwcmVzc2lvbjoKKwkvLwlYQW5ub3RhdGlvbiB8IFhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZVdpdGhBbm5vdGF0aW9uc0dyYW1tYXJBY2Nlc3MuWEFubm90YXRpb25PckV4cHJlc3Npb25FbGVtZW50cyBnZXRYQW5ub3RhdGlvbk9yRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WEFubm90YXRpb25PckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRXhwcmVzc2lvbjoKKwkvLwlYQXNzaWdubWVudDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFzc2lnbm1lbnQgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WEFzc2lnbm1lbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fEZlYXR1cmVDYWxsSURdIE9wU2luZ2xlQXNzaWduIHZhbHVlPVhBc3NpZ25tZW50IHwgWE9yRXhwcmVzc2lvbgorCS8vCSg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BNdWx0aUFzc2lnbl0pCisJLy8JcmlnaHRPcGVyYW5kPVhBc3NpZ25tZW50KT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQXNzaWdubWVudEVsZW1lbnRzIGdldFhBc3NpZ25tZW50QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQXNzaWdubWVudEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQXNzaWdubWVudFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQXNzaWdubWVudEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wU2luZ2xlQXNzaWduOgorCS8vCSI9IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wU2luZ2xlQXNzaWduRWxlbWVudHMgZ2V0T3BTaW5nbGVBc3NpZ25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wU2luZ2xlQXNzaWduQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wU2luZ2xlQXNzaWduUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wU2luZ2xlQXNzaWduQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BNdWx0aUFzc2lnbjoKKwkvLwkiKz0iIHwgIi09IiB8ICIqPSIgfCAiLz0iIHwgIiU9IiB8ICI8IiAiPCIgIj0iIHwgIj4iICI+Ij8gIj49IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wTXVsdGlBc3NpZ25FbGVtZW50cyBnZXRPcE11bHRpQXNzaWduQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcE11bHRpQXNzaWduQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wTXVsdGlBc3NpZ25SdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BNdWx0aUFzc2lnbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hPckV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYQW5kRXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wT3JdKQorCS8vCXJpZ2h0T3BlcmFuZD1YQW5kRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE9yRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhPckV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhPckV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE9yRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYT3JFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BPcjoKKwkvLwkifHwiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BPckVsZW1lbnRzIGdldE9wT3JBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wT3JBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BPclJ1bGUoKSB7CisJCXJldHVybiBnZXRPcE9yQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEFuZEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYRXF1YWxpdHlFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BBbmRdKQorCS8vCXJpZ2h0T3BlcmFuZD1YRXF1YWxpdHlFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQW5kRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhBbmRFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQW5kRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQW5kRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wQW5kOgorCS8vCSImJiI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcEFuZEVsZW1lbnRzIGdldE9wQW5kQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcEFuZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcEFuZFJ1bGUoKSB7CisJCXJldHVybiBnZXRPcEFuZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hFcXVhbGl0eUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYUmVsYXRpb25hbEV4cHJlc3Npb24gKD0+ICh7WEJpbmFyeU9wZXJhdGlvbi5sZWZ0T3BlcmFuZD1jdXJyZW50fSBmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxPcEVxdWFsaXR5XSkKKwkvLwlyaWdodE9wZXJhbmQ9WFJlbGF0aW9uYWxFeHByZXNzaW9uKSo7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YRXF1YWxpdHlFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEVxdWFsaXR5RXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYRXF1YWxpdHlFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhFcXVhbGl0eUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcEVxdWFsaXR5OgorCS8vCSI9PSIgfCAiIT0iIHwgIj09PSIgfCAiIT09IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wRXF1YWxpdHlFbGVtZW50cyBnZXRPcEVxdWFsaXR5QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcEVxdWFsaXR5QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wRXF1YWxpdHlSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BFcXVhbGl0eUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hSZWxhdGlvbmFsRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbiAoPT4gKHtYSW5zdGFuY2VPZkV4cHJlc3Npb24uZXhwcmVzc2lvbj1jdXJyZW50fSAiaW5zdGFuY2VvZiIpIHR5cGU9SnZtVHlwZVJlZmVyZW5jZSB8ID0+CisJLy8JKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wQ29tcGFyZV0pCisJLy8JcmlnaHRPcGVyYW5kPVhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFJlbGF0aW9uYWxFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUmVsYXRpb25hbEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFJlbGF0aW9uYWxFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhSZWxhdGlvbmFsRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL09wQ29tcGFyZToKKwkvLwkiPj0iIHwgIjwiICI9IiB8ICI+IiB8ICI8IjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wQ29tcGFyZUVsZW1lbnRzIGdldE9wQ29tcGFyZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BDb21wYXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wQ29tcGFyZVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcENvbXBhcmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YT3RoZXJPcGVyYXRvckV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYQWRkaXRpdmVFeHByZXNzaW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BPdGhlcl0pCisJLy8JcmlnaHRPcGVyYW5kPVhBZGRpdGl2ZUV4cHJlc3Npb24pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE90aGVyT3BlcmF0b3JFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhPdGhlck9wZXJhdG9yRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYT3RoZXJPcGVyYXRvckV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcE90aGVyOgorCS8vCSItPiIgfCAiLi48IiB8ICI+IiAiLi4iIHwgIi4uIiB8ICI9PiIgfCAiPiIgKD0+ICgiPiIgIj4iKSB8ICI+IikgfCAiPCIgKD0+ICgiPCIgIjwiKSB8ICI8IiB8ICI9PiIpIHwgIjw+IiB8ICI/OiI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcE90aGVyRWxlbWVudHMgZ2V0T3BPdGhlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BPdGhlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcE90aGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldE9wT3RoZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQWRkaXRpdmVFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAoPT4gKHtYQmluYXJ5T3BlcmF0aW9uLmxlZnRPcGVyYW5kPWN1cnJlbnR9IGZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fE9wQWRkXSkKKwkvLwlyaWdodE9wZXJhbmQ9WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEFkZGl0aXZlRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhBZGRpdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEFkZGl0aXZlRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQWRkaXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BBZGQ6CisJLy8JIisiIHwgIi0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BBZGRFbGVtZW50cyBnZXRPcEFkZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0T3BBZGRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BBZGRSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BBZGRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWFVuYXJ5T3BlcmF0aW9uICg9PiAoe1hCaW5hcnlPcGVyYXRpb24ubGVmdE9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BNdWx0aV0pCisJLy8JcmlnaHRPcGVyYW5kPVhVbmFyeU9wZXJhdGlvbikqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vT3BNdWx0aToKKwkvLwkiKiIgfCAiKioiIHwgIi8iIHwgIiUiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuT3BNdWx0aUVsZW1lbnRzIGdldE9wTXVsdGlBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wTXVsdGlBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0T3BNdWx0aVJ1bGUoKSB7CisJCXJldHVybiBnZXRPcE11bHRpQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFVuYXJ5T3BlcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hVbmFyeU9wZXJhdGlvbn0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BVbmFyeV0gb3BlcmFuZD1YVW5hcnlPcGVyYXRpb24gfCBYQ2FzdGVkRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhVbmFyeU9wZXJhdGlvbkVsZW1lbnRzIGdldFhVbmFyeU9wZXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFVuYXJ5T3BlcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhVbmFyeU9wZXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYVW5hcnlPcGVyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcFVuYXJ5OgorCS8vCSIhIiB8ICItIiB8ICIrIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLk9wVW5hcnlFbGVtZW50cyBnZXRPcFVuYXJ5QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRPcFVuYXJ5QWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldE9wVW5hcnlSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BVbmFyeUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDYXN0ZWRFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWFBvc3RmaXhPcGVyYXRpb24gKD0+ICh7WENhc3RlZEV4cHJlc3Npb24udGFyZ2V0PWN1cnJlbnR9ICJhcyIpIHR5cGU9SnZtVHlwZVJlZmVyZW5jZSkqOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENhc3RlZEV4cHJlc3Npb25FbGVtZW50cyBnZXRYQ2FzdGVkRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENhc3RlZEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WENhc3RlZEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YUG9zdGZpeE9wZXJhdGlvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCVhNZW1iZXJGZWF0dXJlQ2FsbCA9PiAoe1hQb3N0Zml4T3BlcmF0aW9uLm9wZXJhbmQ9Y3VycmVudH0gZmVhdHVyZT1bdHlwZXM6Okp2bUlkZW50aWZpYWJsZUVsZW1lbnR8T3BQb3N0Zml4XSk/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFBvc3RmaXhPcGVyYXRpb25FbGVtZW50cyBnZXRYUG9zdGZpeE9wZXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFBvc3RmaXhPcGVyYXRpb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFBvc3RmaXhPcGVyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9PcFBvc3RmaXg6CisJLy8JIisrIiB8ICItLSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5PcFBvc3RmaXhFbGVtZW50cyBnZXRPcFBvc3RmaXhBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldE9wUG9zdGZpeEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRPcFBvc3RmaXhSdWxlKCkgeworCQlyZXR1cm4gZ2V0T3BQb3N0Zml4QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWE1lbWJlckZlYXR1cmVDYWxsIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWFByaW1hcnlFeHByZXNzaW9uICg9PiAoe1hBc3NpZ25tZW50LmFzc2lnbmFibGU9Y3VycmVudH0gKCIuIiB8IGV4cGxpY2l0U3RhdGljPz0iOjoiKQorCS8vCWZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fEZlYXR1cmVDYWxsSURdIE9wU2luZ2xlQXNzaWduKSB2YWx1ZT1YQXNzaWdubWVudCB8ID0+CisJLy8JKHtYTWVtYmVyRmVhdHVyZUNhbGwubWVtYmVyQ2FsbFRhcmdldD1jdXJyZW50fSAoIi4iIHwgbnVsbFNhZmU/PSI/LiIgfCBleHBsaWNpdFN0YXRpYz89Ijo6IikpICgiPCIKKwkvLwl0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPworCS8vCWZlYXR1cmU9W3R5cGVzOjpKdm1JZGVudGlmaWFibGVFbGVtZW50fElkT3JTdXBlcl0gKD0+IGV4cGxpY2l0T3BlcmF0aW9uQ2FsbD89IigiIChtZW1iZXJDYWxsQXJndW1lbnRzKz1YU2hvcnRDbG9zdXJlCisJLy8JfCBtZW1iZXJDYWxsQXJndW1lbnRzKz1YRXhwcmVzc2lvbiAoIiwiIG1lbWJlckNhbGxBcmd1bWVudHMrPVhFeHByZXNzaW9uKSopPyAiKSIpPyBtZW1iZXJDYWxsQXJndW1lbnRzKz1YQ2xvc3VyZT8pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhNZW1iZXJGZWF0dXJlQ2FsbEVsZW1lbnRzIGdldFhNZW1iZXJGZWF0dXJlQ2FsbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE1lbWJlckZlYXR1cmVDYWxsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhNZW1iZXJGZWF0dXJlQ2FsbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTWVtYmVyRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YUHJpbWFyeUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYQ29uc3RydWN0b3JDYWxsIHwgWEJsb2NrRXhwcmVzc2lvbiB8IFhTd2l0Y2hFeHByZXNzaW9uIHwgWFN5bmNocm9uaXplZEV4cHJlc3Npb24gfCBYRmVhdHVyZUNhbGwgfCBYTGl0ZXJhbCB8CisJLy8JWElmRXhwcmVzc2lvbiB8IFhGb3JMb29wRXhwcmVzc2lvbiB8IFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uIHwgWFdoaWxlRXhwcmVzc2lvbiB8IFhEb1doaWxlRXhwcmVzc2lvbiB8CisJLy8JWFRocm93RXhwcmVzc2lvbiB8IFhSZXR1cm5FeHByZXNzaW9uIHwgWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb24gfCBYUGFyZW50aGVzaXplZEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUHJpbWFyeUV4cHJlc3Npb25FbGVtZW50cyBnZXRYUHJpbWFyeUV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhQcmltYXJ5RXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUHJpbWFyeUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFByaW1hcnlFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWExpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwlYQ29sbGVjdGlvbkxpdGVyYWwgfCBYQ2xvc3VyZSB8IFhCb29sZWFuTGl0ZXJhbCB8IFhOdW1iZXJMaXRlcmFsIHwgWE51bGxMaXRlcmFsIHwgWFN0cmluZ0xpdGVyYWwgfCBYVHlwZUxpdGVyYWw7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTGl0ZXJhbEVsZW1lbnRzIGdldFhMaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDb2xsZWN0aW9uTGl0ZXJhbDoKKwkvLwlYU2V0TGl0ZXJhbCB8IFhMaXN0TGl0ZXJhbDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDb2xsZWN0aW9uTGl0ZXJhbEVsZW1lbnRzIGdldFhDb2xsZWN0aW9uTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WENvbGxlY3Rpb25MaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDb2xsZWN0aW9uTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ29sbGVjdGlvbkxpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU2V0TGl0ZXJhbDoKKwkvLwl7WFNldExpdGVyYWx9ICIjIiAieyIgKGVsZW1lbnRzKz1YRXhwcmVzc2lvbiAoIiwiIGVsZW1lbnRzKz1YRXhwcmVzc2lvbikqKT8gIn0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFNldExpdGVyYWxFbGVtZW50cyBnZXRYU2V0TGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFNldExpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFNldExpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WFNldExpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTGlzdExpdGVyYWw6CisJLy8Je1hMaXN0TGl0ZXJhbH0gIiMiICJbIiAoZWxlbWVudHMrPVhFeHByZXNzaW9uICgiLCIgZWxlbWVudHMrPVhFeHByZXNzaW9uKSopPyAiXSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YTGlzdExpdGVyYWxFbGVtZW50cyBnZXRYTGlzdExpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhMaXN0TGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYTGlzdExpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WExpc3RMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENsb3N1cmUgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwk9PiAoe1hDbG9zdXJlfSAiWyIpID0+ICgoZGVjbGFyZWRGb3JtYWxQYXJhbWV0ZXJzKz1Kdm1Gb3JtYWxQYXJhbWV0ZXIgKCIsIgorCS8vCWRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycys9SnZtRm9ybWFsUGFyYW1ldGVyKSopPyBleHBsaWNpdFN5bnRheD89InwiKT8gZXhwcmVzc2lvbj1YRXhwcmVzc2lvbkluQ2xvc3VyZSAiXSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2xvc3VyZUVsZW1lbnRzIGdldFhDbG9zdXJlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ2xvc3VyZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2xvc3VyZVJ1bGUoKSB7CisJCXJldHVybiBnZXRYQ2xvc3VyZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hFeHByZXNzaW9uSW5DbG9zdXJlIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hCbG9ja0V4cHJlc3Npb259IChleHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICI7Ij8pKjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhFeHByZXNzaW9uSW5DbG9zdXJlRWxlbWVudHMgZ2V0WEV4cHJlc3Npb25JbkNsb3N1cmVBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhFeHByZXNzaW9uSW5DbG9zdXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhFeHByZXNzaW9uSW5DbG9zdXJlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFNob3J0Q2xvc3VyZSByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCT0+ICh7WENsb3N1cmV9IChkZWNsYXJlZEZvcm1hbFBhcmFtZXRlcnMrPUp2bUZvcm1hbFBhcmFtZXRlciAoIiwiIGRlY2xhcmVkRm9ybWFsUGFyYW1ldGVycys9SnZtRm9ybWFsUGFyYW1ldGVyKSopPworCS8vCWV4cGxpY2l0U3ludGF4Pz0ifCIpIGV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU2hvcnRDbG9zdXJlRWxlbWVudHMgZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFNob3J0Q2xvc3VyZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU2hvcnRDbG9zdXJlUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhTaG9ydENsb3N1cmVBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YUGFyZW50aGVzaXplZEV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwkiKCIgWEV4cHJlc3Npb24gIikiOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUGFyZW50aGVzaXplZEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFBhcmVudGhlc2l6ZWRFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhQYXJlbnRoZXNpemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hJZkV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WElmRXhwcmVzc2lvbn0gImlmIiAiKCIgaWY9WEV4cHJlc3Npb24gIikiIHRoZW49WEV4cHJlc3Npb24gKCJlbHNlIiBlbHNlPVhFeHByZXNzaW9uKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YSWZFeHByZXNzaW9uRWxlbWVudHMgZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WElmRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYSWZFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhJZkV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU3dpdGNoRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYU3dpdGNoRXhwcmVzc2lvbn0gInN3aXRjaCIgKD0+ICgiKCIgZGVjbGFyZWRQYXJhbT1Kdm1Gb3JtYWxQYXJhbWV0ZXIgIjoiKSBzd2l0Y2g9WEV4cHJlc3Npb24gIikiIHwgPT4KKwkvLwkoZGVjbGFyZWRQYXJhbT1Kdm1Gb3JtYWxQYXJhbWV0ZXIgIjoiKT8gc3dpdGNoPVhFeHByZXNzaW9uKSAieyIgY2FzZXMrPVhDYXNlUGFydCogKCJkZWZhdWx0IiAiOiIKKwkvLwlkZWZhdWx0PVhFeHByZXNzaW9uKT8gIn0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFN3aXRjaEV4cHJlc3Npb25FbGVtZW50cyBnZXRYU3dpdGNoRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFN3aXRjaEV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFN3aXRjaEV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQ2FzZVBhcnQ6CisJLy8Je1hDYXNlUGFydH0gdHlwZUd1YXJkPUp2bVR5cGVSZWZlcmVuY2U/ICgiY2FzZSIgY2FzZT1YRXhwcmVzc2lvbik/ICgiOiIgdGhlbj1YRXhwcmVzc2lvbiB8IGZhbGxUaHJvdWdoPz0iLCIpOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWENhc2VQYXJ0RWxlbWVudHMgZ2V0WENhc2VQYXJ0QWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ2FzZVBhcnRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WENhc2VQYXJ0UnVsZSgpIHsKKwkJcmV0dXJuIGdldFhDYXNlUGFydEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hGb3JMb29wRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCT0+ICh7WEZvckxvb3BFeHByZXNzaW9ufSAiZm9yIiAiKCIgZGVjbGFyZWRQYXJhbT1Kdm1Gb3JtYWxQYXJhbWV0ZXIgIjoiKSBmb3JFeHByZXNzaW9uPVhFeHByZXNzaW9uICIpIgorCS8vCWVhY2hFeHByZXNzaW9uPVhFeHByZXNzaW9uOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEZvckxvb3BFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEZvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEZvckxvb3BFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhGb3JMb29wRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hCYXNpY0Zvckxvb3BFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hCYXNpY0Zvckxvb3BFeHByZXNzaW9ufSAiZm9yIiAiKCIgKGluaXRFeHByZXNzaW9ucys9WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uICgiLCIKKwkvLwlpbml0RXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbikqKT8gIjsiIGV4cHJlc3Npb249WEV4cHJlc3Npb24/ICI7IiAodXBkYXRlRXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uICgiLCIKKwkvLwl1cGRhdGVFeHByZXNzaW9ucys9WEV4cHJlc3Npb24pKik/ICIpIiBlYWNoRXhwcmVzc2lvbj1YRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhCYXNpY0Zvckxvb3BFeHByZXNzaW9uRWxlbWVudHMgZ2V0WEJhc2ljRm9yTG9vcEV4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhCYXNpY0Zvckxvb3BFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFdoaWxlRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYV2hpbGVFeHByZXNzaW9ufSAid2hpbGUiICIoIiBwcmVkaWNhdGU9WEV4cHJlc3Npb24gIikiIGJvZHk9WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YV2hpbGVFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFdoaWxlRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYV2hpbGVFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhXaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YRG9XaGlsZUV4cHJlc3Npb24gcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WERvV2hpbGVFeHByZXNzaW9ufSAiZG8iIGJvZHk9WEV4cHJlc3Npb24gIndoaWxlIiAiKCIgcHJlZGljYXRlPVhFeHByZXNzaW9uICIpIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhEb1doaWxlRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhEb1doaWxlRXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WERvV2hpbGVFeHByZXNzaW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhEb1doaWxlRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYRG9XaGlsZUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YQmxvY2tFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hCbG9ja0V4cHJlc3Npb259ICJ7IiAoZXhwcmVzc2lvbnMrPVhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbiAiOyI/KSogIn0iOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEJsb2NrRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhCbG9ja0V4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEJsb2NrRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYQmxvY2tFeHByZXNzaW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8JWFZhcmlhYmxlRGVjbGFyYXRpb24gfCBYRXhwcmVzc2lvbjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkVsZW1lbnRzIGdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEV4cHJlc3Npb25PclZhckRlY2xhcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhFeHByZXNzaW9uT3JWYXJEZWNsYXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYRXhwcmVzc2lvbk9yVmFyRGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVmFyaWFibGVEZWNsYXJhdGlvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVmFyaWFibGVEZWNsYXJhdGlvbn0gKHdyaXRlYWJsZT89InZhciIgfCAidmFsIikgKD0+ICh0eXBlPUp2bVR5cGVSZWZlcmVuY2UgbmFtZT1WYWxpZElEKSB8IG5hbWU9VmFsaWRJRCkgKCI9IgorCS8vCXJpZ2h0PVhFeHByZXNzaW9uKT87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVmFyaWFibGVEZWNsYXJhdGlvbkVsZW1lbnRzIGdldFhWYXJpYWJsZURlY2xhcmF0aW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVmFyaWFibGVEZWNsYXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYVmFyaWFibGVEZWNsYXJhdGlvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIHR5cGVzOjpKdm1Gb3JtYWxQYXJhbWV0ZXI6CisJLy8JcGFyYW1ldGVyVHlwZT1Kdm1UeXBlUmVmZXJlbmNlPyBuYW1lPVZhbGlkSUQ7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5Kdm1Gb3JtYWxQYXJhbWV0ZXJFbGVtZW50cyBnZXRKdm1Gb3JtYWxQYXJhbWV0ZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vRnVsbEp2bUZvcm1hbFBhcmFtZXRlciByZXR1cm5zIHR5cGVzOjpKdm1Gb3JtYWxQYXJhbWV0ZXI6CisJLy8JcGFyYW1ldGVyVHlwZT1Kdm1UeXBlUmVmZXJlbmNlIG5hbWU9VmFsaWRJRDsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLkZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJFbGVtZW50cyBnZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRGdWxsSnZtRm9ybWFsUGFyYW1ldGVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0RnVsbEp2bUZvcm1hbFBhcmFtZXRlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hGZWF0dXJlQ2FsbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYRmVhdHVyZUNhbGx9ICgiPCIgdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICgiLCIgdHlwZUFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKSogIj4iKT8KKwkvLwlmZWF0dXJlPVt0eXBlczo6SnZtSWRlbnRpZmlhYmxlRWxlbWVudHxJZE9yU3VwZXJdICg9PiBleHBsaWNpdE9wZXJhdGlvbkNhbGw/PSIoIiAoZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhTaG9ydENsb3N1cmUKKwkvLwl8IGZlYXR1cmVDYWxsQXJndW1lbnRzKz1YRXhwcmVzc2lvbiAoIiwiIGZlYXR1cmVDYWxsQXJndW1lbnRzKz1YRXhwcmVzc2lvbikqKT8gIikiKT8gZmVhdHVyZUNhbGxBcmd1bWVudHMrPVhDbG9zdXJlPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhGZWF0dXJlQ2FsbEVsZW1lbnRzIGdldFhGZWF0dXJlQ2FsbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEZlYXR1cmVDYWxsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhGZWF0dXJlQ2FsbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYRmVhdHVyZUNhbGxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9GZWF0dXJlQ2FsbElEOgorCS8vCVZhbGlkSUQgfCAiZXh0ZW5kcyIgfCAic3RhdGljIiB8ICJpbXBvcnQiIHwgImV4dGVuc2lvbiI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5GZWF0dXJlQ2FsbElERWxlbWVudHMgZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0RmVhdHVyZUNhbGxJREFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRGZWF0dXJlQ2FsbElEUnVsZSgpIHsKKwkJcmV0dXJuIGdldEZlYXR1cmVDYWxsSURBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9JZE9yU3VwZXI6CisJLy8JRmVhdHVyZUNhbGxJRCB8ICJzdXBlciI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5JZE9yU3VwZXJFbGVtZW50cyBnZXRJZE9yU3VwZXJBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldElkT3JTdXBlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRJZE9yU3VwZXJSdWxlKCkgeworCQlyZXR1cm4gZ2V0SWRPclN1cGVyQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWENvbnN0cnVjdG9yQ2FsbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQ29uc3RydWN0b3JDYWxsfSAibmV3IiBjb25zdHJ1Y3Rvcj1bdHlwZXM6Okp2bUNvbnN0cnVjdG9yfFF1YWxpZmllZE5hbWVdICgiPCIKKwkvLwl0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIiB0eXBlQXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIpPyAoPT4KKwkvLwlleHBsaWNpdENvbnN0cnVjdG9yQ2FsbD89IigiIChhcmd1bWVudHMrPVhTaG9ydENsb3N1cmUgfCBhcmd1bWVudHMrPVhFeHByZXNzaW9uICgiLCIgYXJndW1lbnRzKz1YRXhwcmVzc2lvbikqKT8gIikiKT8KKwkvLwlhcmd1bWVudHMrPVhDbG9zdXJlPzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhDb25zdHJ1Y3RvckNhbGxFbGVtZW50cyBnZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQ29uc3RydWN0b3JDYWxsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhDb25zdHJ1Y3RvckNhbGxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENvbnN0cnVjdG9yQ2FsbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hCb29sZWFuTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYQm9vbGVhbkxpdGVyYWx9ICgiZmFsc2UiIHwgaXNUcnVlPz0idHJ1ZSIpOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWEJvb2xlYW5MaXRlcmFsRWxlbWVudHMgZ2V0WEJvb2xlYW5MaXRlcmFsQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYQm9vbGVhbkxpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEJvb2xlYW5MaXRlcmFsUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhCb29sZWFuTGl0ZXJhbEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hOdWxsTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYTnVsbExpdGVyYWx9ICJudWxsIjsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlhOdWxsTGl0ZXJhbEVsZW1lbnRzIGdldFhOdWxsTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE51bGxMaXRlcmFsQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhOdWxsTGl0ZXJhbFJ1bGUoKSB7CisJCXJldHVybiBnZXRYTnVsbExpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YTnVtYmVyTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYTnVtYmVyTGl0ZXJhbH0gdmFsdWU9TnVtYmVyOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWE51bWJlckxpdGVyYWxFbGVtZW50cyBnZXRYTnVtYmVyTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WE51bWJlckxpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WE51bWJlckxpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU3RyaW5nTGl0ZXJhbCByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYU3RyaW5nTGl0ZXJhbH0gdmFsdWU9U1RSSU5HOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFN0cmluZ0xpdGVyYWxFbGVtZW50cyBnZXRYU3RyaW5nTGl0ZXJhbEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFN0cmluZ0xpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WFN0cmluZ0xpdGVyYWxBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YVHlwZUxpdGVyYWwgcmV0dXJucyBYRXhwcmVzc2lvbjoKKwkvLwl7WFR5cGVMaXRlcmFsfSAidHlwZW9mIiAiKCIgdHlwZT1bdHlwZXM6Okp2bVR5cGV8UXVhbGlmaWVkTmFtZV0gYXJyYXlEaW1lbnNpb25zKz1BcnJheUJyYWNrZXRzKiAiKSI7CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVHlwZUxpdGVyYWxFbGVtZW50cyBnZXRYVHlwZUxpdGVyYWxBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhUeXBlTGl0ZXJhbEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVHlwZUxpdGVyYWxSdWxlKCkgeworCQlyZXR1cm4gZ2V0WFR5cGVMaXRlcmFsQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWFRocm93RXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYVGhyb3dFeHByZXNzaW9ufSAidGhyb3ciIGV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YVGhyb3dFeHByZXNzaW9uRWxlbWVudHMgZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFRocm93RXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYVGhyb3dFeHByZXNzaW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhUaHJvd0V4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YUmV0dXJuRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCXtYUmV0dXJuRXhwcmVzc2lvbn0gInJldHVybiIgLT4gZXhwcmVzc2lvbj1YRXhwcmVzc2lvbj87CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YUmV0dXJuRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhSZXR1cm5FeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYUmV0dXJuRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYUmV0dXJuRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9uIHJldHVybnMgWEV4cHJlc3Npb246CisJLy8Je1hUcnlDYXRjaEZpbmFsbHlFeHByZXNzaW9ufSAidHJ5IiBleHByZXNzaW9uPVhFeHByZXNzaW9uIChjYXRjaENsYXVzZXMrPVhDYXRjaENsYXVzZSsgKCJmaW5hbGx5IgorCS8vCWZpbmFsbHlFeHByZXNzaW9uPVhFeHByZXNzaW9uKT8gfCAiZmluYWxseSIgZmluYWxseUV4cHJlc3Npb249WEV4cHJlc3Npb24pOworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuWFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25FbGVtZW50cyBnZXRYVHJ5Q2F0Y2hGaW5hbGx5RXhwcmVzc2lvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25SdWxlKCkgeworCQlyZXR1cm4gZ2V0WFRyeUNhdGNoRmluYWxseUV4cHJlc3Npb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9YU3luY2hyb25pemVkRXhwcmVzc2lvbiByZXR1cm5zIFhFeHByZXNzaW9uOgorCS8vCT0+ICh7WFN5bmNocm9uaXplZEV4cHJlc3Npb259ICJzeW5jaHJvbml6ZWQiICIoIikgcGFyYW09WEV4cHJlc3Npb24gIikiIGV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YU3luY2hyb25pemVkRXhwcmVzc2lvbkVsZW1lbnRzIGdldFhTeW5jaHJvbml6ZWRFeHByZXNzaW9uQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYU3luY2hyb25pemVkRXhwcmVzc2lvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYU3luY2hyb25pemVkRXhwcmVzc2lvbkFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hDYXRjaENsYXVzZToKKwkvLwkiY2F0Y2giICIoIiBkZWNsYXJlZFBhcmFtPUZ1bGxKdm1Gb3JtYWxQYXJhbWV0ZXIgIikiIGV4cHJlc3Npb249WEV4cHJlc3Npb247CisJcHVibGljIFhiYXNlR3JhbW1hckFjY2Vzcy5YQ2F0Y2hDbGF1c2VFbGVtZW50cyBnZXRYQ2F0Y2hDbGF1c2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhDYXRjaENsYXVzZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRYQ2F0Y2hDbGF1c2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0WENhdGNoQ2xhdXNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vTnVtYmVyIGhpZGRlbigpOgorCS8vCUhFWCB8IChJTlQgfCBERUNJTUFMKSAoIi4iIChJTlQgfCBERUNJTUFMKSk/OworCXB1YmxpYyBYYmFzZUdyYW1tYXJBY2Nlc3MuTnVtYmVyRWxlbWVudHMgZ2V0TnVtYmVyQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXROdW1iZXJBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0TnVtYmVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldE51bWJlckFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvLy8gKioKKwkvLyAqIER1bW15IHJ1bGUsIGZvciAiYmV0dGVyIiBkb3dud2FyZHMgY29tcGF0aWJpbGl0eSwgc2luY2UgR3JhbW1hckFjY2VzcyBnZW5lcmF0ZXMgbm9uLXN0YXRpYyBpbm5lciBjbGFzc2VzLCAKKwkvLyAqIHdoaWNoIG1ha2VzIGRvd25zdHJlYW0gZ3JhbW1hcnMgYnJlYWsgb24gY2xhc3Nsb2FkaW5nLCB3aGVuIGEgcnVsZSBpcyByZW1vdmVkLgorCS8vICogLworCS8vU3RhdGljUXVhbGlmaWVyOgorCS8vCShWYWxpZElEICI6OiIpKzsKKwlwdWJsaWMgWGJhc2VHcmFtbWFyQWNjZXNzLlN0YXRpY1F1YWxpZmllckVsZW1lbnRzIGdldFN0YXRpY1F1YWxpZmllckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0U3RhdGljUXVhbGlmaWVyQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFN0YXRpY1F1YWxpZmllclJ1bGUoKSB7CisJCXJldHVybiBnZXRTdGF0aWNRdWFsaWZpZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy90ZXJtaW5hbCBIRVg6CisJLy8JKCIweCIgfCAiMFgiKSAoIjAiLi4iOSIgfCAiYSIuLiJmIiB8ICJBIi4uIkYiIHwgIl8iKSsgKCIjIiAoKCJiIiB8ICJCIikgKCJpIiB8ICJJIikgfCAoImwiIHwgIkwiKSkpPzsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldEhFWFJ1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEhFWFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBJTlQgcmV0dXJucyBlY29yZTo6RUludDoKKwkvLwkiMCIuLiI5IiAoIjAiLi4iOSIgfCAiXyIpKjsKKwlwdWJsaWMgVGVybWluYWxSdWxlIGdldElOVFJ1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldElOVFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBERUNJTUFMOgorCS8vCUlOVCAoKCJlIiB8ICJFIikgKCIrIiB8ICItIik/IElOVCk/ICgoImIiIHwgIkIiKSAoImkiIHwgIkkiIHwgImQiIHwgIkQiKSB8ICgibCIgfCAiTCIgfCAiZCIgfCAiRCIgfCAiZiIgfCAiRiIpKT87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRERUNJTUFMUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0REVDSU1BTFJ1bGUoKTsKKwl9IAorCisJLy9Kdm1UeXBlUmVmZXJlbmNlOgorCS8vCUp2bVBhcmFtZXRlcml6ZWRUeXBlUmVmZXJlbmNlID0+ICh7SnZtR2VuZXJpY0FycmF5VHlwZVJlZmVyZW5jZS5jb21wb25lbnRUeXBlPWN1cnJlbnR9IEFycmF5QnJhY2tldHMpKiB8CisJLy8JWEZ1bmN0aW9uVHlwZVJlZjsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkp2bVR5cGVSZWZlcmVuY2VFbGVtZW50cyBnZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1UeXBlUmVmZXJlbmNlQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEp2bVR5cGVSZWZlcmVuY2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtVHlwZVJlZmVyZW5jZUFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0FycmF5QnJhY2tldHM6CisJLy8JIlsiICJdIjsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLkFycmF5QnJhY2tldHNFbGVtZW50cyBnZXRBcnJheUJyYWNrZXRzQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRBcnJheUJyYWNrZXRzQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldEFycmF5QnJhY2tldHNSdWxlKCkgeworCQlyZXR1cm4gZ2V0QXJyYXlCcmFja2V0c0FjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hGdW5jdGlvblR5cGVSZWY6CisJLy8JKCIoIiAocGFyYW1UeXBlcys9SnZtVHlwZVJlZmVyZW5jZSAoIiwiIHBhcmFtVHlwZXMrPUp2bVR5cGVSZWZlcmVuY2UpKik/ICIpIik/ICI9PiIgcmV0dXJuVHlwZT1Kdm1UeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuWEZ1bmN0aW9uVHlwZVJlZkVsZW1lbnRzIGdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhGdW5jdGlvblR5cGVSZWZBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0WEZ1bmN0aW9uVHlwZVJlZlJ1bGUoKSB7CisJCXJldHVybiBnZXRYRnVuY3Rpb25UeXBlUmVmQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2U6CisJLy8JdHlwZT1bSnZtVHlwZXxRdWFsaWZpZWROYW1lXSAoIjwiIGFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlICgiLCIgYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UpKiAiPiIKKwkvLwkoPT4gKHtKdm1Jbm5lclR5cGVSZWZlcmVuY2Uub3V0ZXI9Y3VycmVudH0gIi4iKSB0eXBlPVtKdm1UeXBlfFZhbGlkSURdICgiPCIgYXJndW1lbnRzKz1Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgKCIsIgorCS8vCWFyZ3VtZW50cys9SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlKSogIj4iKT8pKik/OworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VFbGVtZW50cyBnZXRKdm1QYXJhbWV0ZXJpemVkVHlwZVJlZmVyZW5jZUFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtUGFyYW1ldGVyaXplZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2UgcmV0dXJucyBKdm1UeXBlUmVmZXJlbmNlOgorCS8vCUp2bVR5cGVSZWZlcmVuY2UgfCBKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VFbGVtZW50cyBnZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bUFyZ3VtZW50VHlwZVJlZmVyZW5jZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1Bcmd1bWVudFR5cGVSZWZlcmVuY2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtQXJndW1lbnRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlOgorCS8vCXtKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2V9ICI/IiAoY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmQgY29uc3RyYWludHMrPUp2bVVwcGVyQm91bmRBbmRlZCogfAorCS8vCWNvbnN0cmFpbnRzKz1Kdm1Mb3dlckJvdW5kIGNvbnN0cmFpbnRzKz1Kdm1Mb3dlckJvdW5kQW5kZWQqKT87CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VFbGVtZW50cyBnZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVdpbGRjYXJkVHlwZVJlZmVyZW5jZUFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1XaWxkY2FyZFR5cGVSZWZlcmVuY2VSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtV2lsZGNhcmRUeXBlUmVmZXJlbmNlQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtVXBwZXJCb3VuZDoKKwkvLwkiZXh0ZW5kcyIgdHlwZVJlZmVyZW5jZT1Kdm1UeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtVXBwZXJCb3VuZEVsZW1lbnRzIGdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bVVwcGVyQm91bmRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtVXBwZXJCb3VuZFJ1bGUoKSB7CisJCXJldHVybiBnZXRKdm1VcHBlckJvdW5kQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtVXBwZXJCb3VuZEFuZGVkIHJldHVybnMgSnZtVXBwZXJCb3VuZDoKKwkvLwkiJiIgdHlwZVJlZmVyZW5jZT1Kdm1UeXBlUmVmZXJlbmNlOworCXB1YmxpYyBYdHlwZUdyYW1tYXJBY2Nlc3MuSnZtVXBwZXJCb3VuZEFuZGVkRWxlbWVudHMgZ2V0SnZtVXBwZXJCb3VuZEFuZGVkQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRKdm1VcHBlckJvdW5kQW5kZWRBY2Nlc3MoKTsKKwl9CisJCisJcHVibGljIFBhcnNlclJ1bGUgZ2V0SnZtVXBwZXJCb3VuZEFuZGVkUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVVwcGVyQm91bmRBbmRlZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL0p2bUxvd2VyQm91bmQ6CisJLy8JInN1cGVyIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1Mb3dlckJvdW5kRWxlbWVudHMgZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtTG93ZXJCb3VuZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1Mb3dlckJvdW5kUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bUxvd2VyQm91bmRBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9Kdm1Mb3dlckJvdW5kQW5kZWQgcmV0dXJucyBKdm1Mb3dlckJvdW5kOgorCS8vCSImIiB0eXBlUmVmZXJlbmNlPUp2bVR5cGVSZWZlcmVuY2U7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1Mb3dlckJvdW5kQW5kZWRFbGVtZW50cyBnZXRKdm1Mb3dlckJvdW5kQW5kZWRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldEp2bUxvd2VyQm91bmRBbmRlZEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1Mb3dlckJvdW5kQW5kZWRSdWxlKCkgeworCQlyZXR1cm4gZ2V0SnZtTG93ZXJCb3VuZEFuZGVkQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vSnZtVHlwZVBhcmFtZXRlcjoKKwkvLwluYW1lPVZhbGlkSUQgKGNvbnN0cmFpbnRzKz1Kdm1VcHBlckJvdW5kIGNvbnN0cmFpbnRzKz1Kdm1VcHBlckJvdW5kQW5kZWQqKT87CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5Kdm1UeXBlUGFyYW1ldGVyRWxlbWVudHMgZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0SnZtVHlwZVBhcmFtZXRlckFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRKdm1UeXBlUGFyYW1ldGVyUnVsZSgpIHsKKwkJcmV0dXJuIGdldEp2bVR5cGVQYXJhbWV0ZXJBY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9RdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkOgorCS8vCVF1YWxpZmllZE5hbWUgIi4iICIqIjsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRFbGVtZW50cyBnZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRRdWFsaWZpZWROYW1lV2l0aFdpbGRjYXJkQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZGNhcmRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZEFjY2VzcygpLmdldFJ1bGUoKTsKKwl9CisKKwkvL1hJbXBvcnRTZWN0aW9uOgorCS8vCWltcG9ydERlY2xhcmF0aW9ucys9WEltcG9ydERlY2xhcmF0aW9uKzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlhJbXBvcnRTZWN0aW9uRWxlbWVudHMgZ2V0WEltcG9ydFNlY3Rpb25BY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJbXBvcnRTZWN0aW9uUnVsZSgpIHsKKwkJcmV0dXJuIGdldFhJbXBvcnRTZWN0aW9uQWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vWEltcG9ydERlY2xhcmF0aW9uOgorCS8vCSJpbXBvcnQiIChzdGF0aWM/PSJzdGF0aWMiIGV4dGVuc2lvbj89ImV4dGVuc2lvbiI/IGltcG9ydGVkVHlwZT1bSnZtRGVjbGFyZWRUeXBlfFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydF0KKwkvLwkod2lsZGNhcmQ/PSIqIiB8IG1lbWJlck5hbWU9VmFsaWRJRCkgfCBpbXBvcnRlZFR5cGU9W0p2bURlY2xhcmVkVHlwZXxRdWFsaWZpZWROYW1lXSB8CisJLy8JaW1wb3J0ZWROYW1lc3BhY2U9UXVhbGlmaWVkTmFtZVdpdGhXaWxkY2FyZCkgIjsiPzsKKwlwdWJsaWMgWHR5cGVHcmFtbWFyQWNjZXNzLlhJbXBvcnREZWNsYXJhdGlvbkVsZW1lbnRzIGdldFhJbXBvcnREZWNsYXJhdGlvbkFjY2VzcygpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0WEltcG9ydERlY2xhcmF0aW9uQWNjZXNzKCk7CisJfQorCQorCXB1YmxpYyBQYXJzZXJSdWxlIGdldFhJbXBvcnREZWNsYXJhdGlvblJ1bGUoKSB7CisJCXJldHVybiBnZXRYSW1wb3J0RGVjbGFyYXRpb25BY2Nlc3MoKS5nZXRSdWxlKCk7CisJfQorCisJLy9RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnQ6CisJLy8JKFZhbGlkSUQgIi4iKSs7CisJcHVibGljIFh0eXBlR3JhbW1hckFjY2Vzcy5RdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRFbGVtZW50cyBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRBY2Nlc3MoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFF1YWxpZmllZE5hbWVJblN0YXRpY0ltcG9ydEFjY2VzcygpOworCX0KKwkKKwlwdWJsaWMgUGFyc2VyUnVsZSBnZXRRdWFsaWZpZWROYW1lSW5TdGF0aWNJbXBvcnRSdWxlKCkgeworCQlyZXR1cm4gZ2V0UXVhbGlmaWVkTmFtZUluU3RhdGljSW1wb3J0QWNjZXNzKCkuZ2V0UnVsZSgpOworCX0KKworCS8vdGVybWluYWwgSUQ6CisJLy8JIl4iPyAoImEiLi4ieiIgfCAiQSIuLiJaIiB8ICIkIiB8ICJfIikgKCJhIi4uInoiIHwgIkEiLi4iWiIgfCAiJCIgfCAiXyIgfCAiMCIuLiI5IikqOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0SURSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRJRFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBTVFJJTkc6CisJLy8JIlwiIiAoIlxcIiAuIC8gKiAoJ2InfCd0J3wnbid8J2YnfCdyJ3wndSd8JyInfCInInwnXFwnKSAqIC8gfCAhKCJcXCIgfCAiXCIiKSkqICJcIiI/IHwgIlwnIiAoIlxcIiAuCisJLy8JLyAqICgnYid8J3QnfCduJ3wnZid8J3InfCd1J3wnIid8IicifCdcXCcpICogLyB8ICEoIlxcIiB8ICJcJyIpKSogIlwnIj87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRTVFJJTkdSdWxlKCkgeworCQlyZXR1cm4gZ2FYYmFzZVdpdGhBbm5vdGF0aW9ucy5nZXRTVFJJTkdSdWxlKCk7CisJfSAKKworCS8vdGVybWluYWwgTUxfQ09NTUVOVDoKKwkvLwkiLyAqIi0+IiogLyI7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRNTF9DT01NRU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0TUxfQ09NTUVOVFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBTTF9DT01NRU5UOgorCS8vCSIvLyIgISgiXG4iIHwgIlxyIikqICgiXHIiPyAiXG4iKT87CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRTTF9DT01NRU5UUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0U0xfQ09NTUVOVFJ1bGUoKTsKKwl9IAorCisJLy90ZXJtaW5hbCBXUzoKKwkvLwkoIiAiIHwgIlx0IiB8ICJcciIgfCAiXG4iKSs7CisJcHVibGljIFRlcm1pbmFsUnVsZSBnZXRXU1J1bGUoKSB7CisJCXJldHVybiBnYVhiYXNlV2l0aEFubm90YXRpb25zLmdldFdTUnVsZSgpOworCX0gCisKKwkvL3Rlcm1pbmFsIEFOWV9PVEhFUjoKKwkvLwkuOworCXB1YmxpYyBUZXJtaW5hbFJ1bGUgZ2V0QU5ZX09USEVSUnVsZSgpIHsKKwkJcmV0dXJuIGdhWGJhc2VXaXRoQW5ub3RhdGlvbnMuZ2V0QU5ZX09USEVSUnVsZSgpOworCX0gCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsaWRhdGlvbi9BYnN0cmFjdEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC92YWxpZGF0aW9uL0Fic3RyYWN0QXV0aG9yaXphdGlvbkRTTFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjY1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsaWRhdGlvbi9BYnN0cmFjdEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7CisKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy52YWxpZGF0aW9uLlhiYXNlV2l0aEFubm90YXRpb25zVmFsaWRhdG9yIHsKKworCUBPdmVycmlkZQorCXByb3RlY3RlZCBMaXN0PEVQYWNrYWdlPiBnZXRFUGFja2FnZXMoKSB7CisJICAgIExpc3Q8RVBhY2thZ2U+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8RVBhY2thZ2U+KHN1cGVyLmdldEVQYWNrYWdlcygpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy9kc2wvY29tbW9uL3R5cGVzL3YxIikpOworCSAgICByZXN1bHQuYWRkKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKCJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L1hiYXNlL1hBbm5vdGF0aW9ucyIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC94YmFzZS9YYmFzZSIpKTsKKwkgICAgcmVzdWx0LmFkZChFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZSgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy94dGV4dC9jb21tb24vSmF2YVZNVHlwZXMiKSk7CisJICAgIHJlc3VsdC5hZGQoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcveHRleHQveGJhc2UvWHR5cGUiKSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQWN0aXZhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmU0YmMwCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQWN0aXZhdG9yLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqLworIHBhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5naXRpbmZvLkxvZ2luZm87CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKKworcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7CisKKwlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7CisKKwlzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgeworCQlyZXR1cm4gY29udGV4dDsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCisJICovCisJcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQWN0aXZhdG9yLmNvbnRleHQgPSBidW5kbGVDb250ZXh0OworCQlMb2dpbmZvIGxpID0gbmV3IExvZ2luZm8oKTsKKwkJbGkucHJpbnQoIEFjdGl2YXRvci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCksIEFjdGl2YXRvci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKwl9CisKKwkvKgorCSAqIChub24tSmF2YWRvYykKKwkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKKwkgKi8KKwlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0wueHRleHQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMLnh0ZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjVjZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMLnh0ZXh0CkBAIC0wLDAgKzEsMTExIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisKK2dyYW1tYXIgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0wgd2l0aCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy5YYmFzZVdpdGhBbm5vdGF0aW9ucworCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTCIKK2ltcG9ydCAiaHR0cDovL29zYnAuZWNsaXBzZS5vcmcveHRleHQvYmxpcC9CbGlwRFNMIiBhcyBibGlwCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL2RzbC9jb21tb24vdHlwZXMvdjEiIGFzIHR5cGVzCitpbXBvcnQgImh0dHA6Ly9vc2JwLmVjbGlwc2Uub3JnL2RzbC9lbnRpdHkvdjEiIGFzIGVudGl0eQoraW1wb3J0ICJodHRwOi8vb3NicC5lY2xpcHNlLm9yZy9kc2wvZHRvL3YxIiBhcyBkdG8KK2ltcG9ydCAiaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lbWYvMjAwMi9FY29yZSIgYXMgZWNvcmUKKworQXV0aG9yaXphdGlvbk1vZGVsOgorCXBja2c9QXV0aG9yaXphdGlvblBhY2thZ2U7CisKK0F1dGhvcml6YXRpb25QYWNrYWdlOgorCXtBdXRob3JpemF0aW9uUGFja2FnZX0gJ3BhY2thZ2UnIG5hbWU9UXVhbGlmaWVkTmFtZSAneycgKGltcG9ydHMrPUF1dGhvcml6YXRpb25JbXBvcnQpKiAocm9sZXMrPVJvbGUpKiAnfSc7CisKK0F1dGhvcml6YXRpb25JbXBvcnQgcmV0dXJucyB0eXBlczo6TEltcG9ydDoKKwknaW1wb3J0JyBpbXBvcnRlZE5hbWVzcGFjZT1BdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDsKKworUm9sZToKKwkgJ3JvbGUnIG5hbWU9VFJBTlNMQVRBQkxFSUQgJ3snIHJvbGVFbGVtZW50cys9Um9sZUVsZW1lbnQqICd9JzsKKwkgCitSb2xlRWxlbWVudDoKKwlSb2xlRW50aXR5IHwgUm9sZUJlYW4gfCBSb2xlRHRvIHwgUm9sZUJsaXBQcm9jZXNzOworCitSb2xlRW50aXR5OgorCSB7Um9sZUVudGl0eX0gJ2VudGl0eScgZW50aXR5UmVmPVtlbnRpdHk6OkxFbnRpdHldIGVudGl0eUF1dGhvcml6ZWQrPVJvbGVFbnVtKyAoJ3snICBlbnRpdHlGZWF0dXJlcys9Um9sZUVudGl0eUZlYXR1cmUrICd9Jyk/OworCSAKK1JvbGVCZWFuOgorCSB7Um9sZUJlYW59ICdiZWFuJyBiZWFuUmVmPVtlbnRpdHk6OkxCZWFuXSBiZWFuQXV0aG9yaXplZCs9Um9sZUVudW0rICgneycgIGJlYW5GZWF0dXJlcys9Um9sZUJlYW5GZWF0dXJlKyAnfScpPzsKKwkgCitSb2xlRHRvOgorCSB7Um9sZUR0b30gJ2R0bycgZHRvUmVmPVtkdG86OkxEdG9dIGR0b0F1dGhvcml6ZWQrPVJvbGVFbnVtKyAoJ3snICBkdG9GZWF0dXJlcys9Um9sZUR0b0ZlYXR1cmUrICd9Jyk/OworCitSb2xlQmxpcEFsbFVzZXJUYXNrczoKKwl7Um9sZUJsaXBBbGxVc2VyVGFza3N9ICdhbGwnICd1c2VydGFza3MnIGF1dGhvcml6ZWQ9Um9sZUJsaXBVc2VyVGFza0VudW07CisKK1JvbGVCbGlwVXNlclRhc2s6CisJe1JvbGVCbGlwVXNlclRhc2t9ICd1c2VydGFzaycgdXNlclRhc2s9W2JsaXA6OkJsaXBVc2VyVGFza3xRdWFsaWZpZWROYW1lXSBhdXRob3JpemVkPVJvbGVCbGlwVXNlclRhc2tFbnVtOworCQorUm9sZUJsaXBQcm9jZXNzOgorCXtSb2xlQmxpcFByb2Nlc3N9ICdwcm9jZXNzJyBwcm9jZXNzPVtibGlwOjpCbGlwXSAneycKKwkJKCdpcycgcHJvY2Vzc1N0YXJ0QXV0aG9yaXplZD1Sb2xlQmxpcFByb2Nlc3NFbnVtKT8KKwkJKGFsbFVzZXJUYXNrcz1Sb2xlQmxpcEFsbFVzZXJUYXNrcyk/CisJCSh1c2VyVGFza3MrPVJvbGVCbGlwVXNlclRhc2spKgorCSd9JzsKKworUm9sZUVudGl0eUZlYXR1cmU6CisJUm9sZUVudGl0eUF0dHJpYnV0ZSB8IFJvbGVFbnRpdHlSZWZlcmVuY2U7CisKK1JvbGVFbnRpdHlBdHRyaWJ1dGU6CisJJ3Byb3BlcnR5JyBlbnRpdHlBdHRyaUNvbD1bZW50aXR5OjpMRW50aXR5QXR0cmlidXRlXSBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCitSb2xlRW50aXR5UmVmZXJlbmNlOgorCSdyZWZlcmVuY2UnIGVudGl0eUF0dHJpQ29sPVtlbnRpdHk6OkxFbnRpdHlSZWZlcmVuY2VdICBlbnRpdHlBdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCitSb2xlQmVhbkZlYXR1cmU6CisJUm9sZUJlYW5BdHRyaWJ1dGUgfCBSb2xlQmVhblJlZmVyZW5jZTsKKworUm9sZUJlYW5BdHRyaWJ1dGU6CisJJ3Byb3BlcnR5JyBiZWFuQXR0cmlDb2w9W2VudGl0eTo6TEJlYW5BdHRyaWJ1dGVdIGJlYW5BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCitSb2xlQmVhblJlZmVyZW5jZToKKwkncmVmZXJlbmNlJyBiZWFuQXR0cmlDb2w9W2VudGl0eTo6TEJlYW5SZWZlcmVuY2VdICBiZWFuQXR0cmlVbmF1dGhvcml6ZWQ9Um9sZVByb3BlcnR5RW51bTsKKworUm9sZUR0b0ZlYXR1cmU6CisJUm9sZUR0b0F0dHJpYnV0ZSB8IFJvbGVEdG9SZWZlcmVuY2U7CisKK1JvbGVEdG9BdHRyaWJ1dGU6CisJJ3Byb3BlcnR5JyBkdG9BdHRyaUNvbD1bZHRvOjpMRHRvQXR0cmlidXRlXSBkdG9BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCitSb2xlRHRvUmVmZXJlbmNlOgorCSdyZWZlcmVuY2UnIGR0b0F0dHJpQ29sPVtkdG86OkxEdG9SZWZlcmVuY2VdICBkdG9BdHRyaVVuYXV0aG9yaXplZD1Sb2xlUHJvcGVydHlFbnVtOworCitlbnVtIFJvbGVFbnVtOgorCSBhbnk9J2FueScgfCBjcmVhdGFibGU9J2NyZWF0YWJsZSd8IHJlYWRhYmxlPSdyZWFkYWJsZScgfCB1cGRhdGFibGU9J3VwZGF0YWJsZSd8IGRlbGV0YWJsZT0nZGVsZXRhYmxlJzsKKworZW51bSBSb2xlUHJvcGVydHlFbnVtOgorCSBpbnZpc2libGU9J2ludmlzaWJsZScgfCBkaXNhYmxlZD0nZGlzYWJsZWQnIHwgbm9uZWRpdGFibGU9J25vbmVkaXRhYmxlJzsKKwkKK2VudW0gUm9sZUJsaXBQcm9jZXNzRW51bToKKwlzdGFydGFibGU9J3N0YXJ0YWJsZSc7CisJCitlbnVtIFJvbGVCbGlwVXNlclRhc2tFbnVtOgorCWV4ZWN1dGFibGU9J2V4ZWN1dGFibGUnOworCitBdXRoUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZDoKKwlRdWFsaWZpZWROYW1lICgnLicgJyonKT87CisKK1F1YWxpZmllZE5hbWU6CisgIFZhbGlkSUQgKD0+Jy4nIFZhbGlkSUQpKjsKKworVmFsaWRJRDoKKwlJRDsKKworVFJBTlNMQVRBQkxFSUQ6CisJSUQ7CisJCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMQnVuZGxlU3BhY2VSdW50aW1lTW9kdWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YWFlYwotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC50eXBlcy5idW5kbGVzLkJ1bmRsZVNwYWNlVHlwZVNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5hcGkuSVR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIuYXBpLklUeXBlTG9hZGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5idWlsZGVyLnR5cGVzLmxvYWRlci5ydW50aW1lLlR5cGVMb2FkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYnVpbGRlci50eXBlcy5sb2FkZXIucnVudGltZS5UeXBlTG9hZGVyUHJvdmlkZXI7CisKK0BTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTEJ1bmRsZVNwYWNlUnVudGltZU1vZHVsZSBleHRlbmRzCisJCUF1dGhvcml6YXRpb25EU0xSdW50aW1lTW9kdWxlIHsKKwkvLyBjb250cmlidXRlZCBieSBvcmcuZWNsaXBzZS54dGV4dC5nZW5lcmF0b3IudHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudAorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzLmFjY2Vzcy5JSnZtVHlwZVByb3ZpZGVyLkZhY3Rvcnk+IGJpbmRJSnZtVHlwZVByb3ZpZGVyJEZhY3RvcnkoKSB7CisJCXJldHVybiBCdW5kbGVTcGFjZVR5cGVQcm92aWRlckZhY3RvcnkuY2xhc3M7CisJfQorCisJLy8gY29udHJpYnV0ZWQgYnkgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLnR5cGVzLlR5cGVzR2VuZXJhdG9yRnJhZ21lbnQKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy54dGV4dC5BYnN0cmFjdFR5cGVTY29wZVByb3ZpZGVyPiBiaW5kQWJzdHJhY3RUeXBlU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIEJ1bmRsZVNwYWNlVHlwZVNjb3BlUHJvdmlkZXIuY2xhc3M7CisJfQorCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVHlwZUxvYWRlckZhY3Rvcnk+IGJpbmRJVHlwZUxvYWRlckZhY3RvcnkoKSB7CisJCXJldHVybiBUeXBlTG9hZGVyRmFjdG9yeS5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElUeXBlTG9hZGVyUHJvdmlkZXI+IElUeXBlTG9hZGVyUHJvdmlkZXIoKSB7CisJCXJldHVybiBUeXBlTG9hZGVyUHJvdmlkZXIuY2xhc3M7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjI1ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJ1aWxkZXIueGJhc2Uuc2V0dXBzLlhiYXNlQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXA7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5HdWljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3RvcjsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAgZXh0ZW5kcworCQlBdXRob3JpemF0aW9uRFNMU3RhbmRhbG9uZVNldHVwIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZG9TZXR1cCgpIHsKKwkJbmV3IEF1dGhvcml6YXRpb25EU0xCdW5kbGVTcGFjZVN0YW5kYWxvbmVTZXR1cCgpLmNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKTsKKwl9CisJCisJQE92ZXJyaWRlCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKSB7CisJCVhiYXNlQnVuZGxlU3BhY2VTdGFuZGFsb25lU2V0dXAuZG9TZXR1cCgpOworCisJCUluamVjdG9yIGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3IoKTsKKwkJcmVnaXN0ZXIoaW5qZWN0b3IpOworCQlyZXR1cm4gaW5qZWN0b3I7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIEluamVjdG9yIGNyZWF0ZUluamVjdG9yKCkgeworCQlyZXR1cm4gR3VpY2UuY3JlYXRlSW5qZWN0b3IobmV3IEF1dGhvcml6YXRpb25EU0xCdW5kbGVTcGFjZVJ1bnRpbWVNb2R1bGUoKSk7CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMUnVudGltZU1vZHVsZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTY1YzJjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnh0ZXh0LmxhenlyZXNvbHZlci5MYXp5SnZtVHlwZUxpbmtlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC54dGV4dC5sYXp5cmVzb2x2ZXIuU2VtYW50aWNMb2FkaW5nUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wueHRleHQubGF6eXJlc29sdmVyLmxpbmtlci5MYXp5SnZtVHlwZVRyYW5zaWVudFZhbHVlU2VydmljZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZ2VuZXJhdG9yLkF1dGhvcml6YXRpb25EU0xHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNjb3BpbmcuQXV0aG9yaXphdGlvbkRTTFNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnZhbHVlY29udmVydGVyLkF1dGhvcml6YXRpb25RdWFsaWZpZWROYW1lUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnZhbHVlY29udmVydGVyLkF1dGhvcml6YXRpb25WYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkRTTE91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5jb252ZXJzaW9uLklWYWx1ZUNvbnZlcnRlclNlcnZpY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklPdXRwdXRDb25maWd1cmF0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5JU2NvcGVQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5TaW5nbGV0b247CisKKworLyoqCisgKiBVc2UgdGhpcyBjbGFzcyB0byByZWdpc3RlciBjb21wb25lbnRzIHRvIGJlIHVzZWQgYXQgcnVudGltZSAvIHdpdGhvdXQgdGhlIEVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5LgorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xSdW50aW1lTW9kdWxlIGV4dGVuZHMgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkFic3RyYWN0QXV0aG9yaXphdGlvbkRTTFJ1bnRpbWVNb2R1bGUgeworCQorCUBPdmVycmlkZQorCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSVNjb3BlUHJvdmlkZXI+IGJpbmRJU2NvcGVQcm92aWRlcigpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25EU0xTY29wZVByb3ZpZGVyLmNsYXNzOworCX0KKworCXB1YmxpYyBDbGFzczw/IGV4dGVuZHMgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuWHRleHRSZXNvdXJjZT4gYmluZFh0ZXh0UmVzb3VyY2UoKSB7CisJCXJldHVybiBTZW1hbnRpY0xvYWRpbmdSZXNvdXJjZS5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LmxpbmtpbmcuSUxpbmtlcj4gYmluZElMaW5rZXIoKSB7CisJCXJldHVybiBMYXp5SnZtVHlwZUxpbmtlci5jbGFzczsKKwl9CisKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0LnNlcmlhbGl6ZXIuc2VxdWVuY2VyLklUcmFuc2llbnRWYWx1ZVNlcnZpY2U+IGJpbmRTZXJpYWxpemVySVRyYW5zaWVudFZhbHVlU2VydmljZSgpIHsKKwkJcmV0dXJuIExhenlKdm1UeXBlVHJhbnNpZW50VmFsdWVTZXJ2aWNlLmNsYXNzOworCX0KKwkKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIElHZW5lcmF0b3I+IGJpbmRJR2VuZXJhdG9yKCkgeworCQlyZXR1cm4gQXV0aG9yaXphdGlvbkRTTEdlbmVyYXRvci5jbGFzczsKKwl9CisKKwkvKioKKwkgKiBPbmx5IHJlcXVpcmVkLCBpZiBmcW4gY2FuIG5vdCBiZSBjcmVhdGVkIGJ5IGFwcGVuZGluZyB0aGUgbmFtZXMgb2YgdGhlCisJICogc2VtYW50aWMgZWxlbWVudHMgdXAgdGhlIGhpZXJhcmNoeS4KKwkgKi8KKwlwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZVByb3ZpZGVyPiBiaW5kSVF1YWxpZmllZE5hbWVQcm92aWRlcigpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25RdWFsaWZpZWROYW1lUHJvdmlkZXIuY2xhc3M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIENsYXNzPD8gZXh0ZW5kcyBJVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlPiBiaW5kSVZhbHVlQ29udmVydGVyU2VydmljZSgpIHsKKwkJcmV0dXJuIEF1dGhvcml6YXRpb25WYWx1ZUNvbnZlcnRlclNlcnZpY2UuY2xhc3M7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIHZvaWQgY29uZmlndXJlKEJpbmRlciBiaW5kZXIpIHsKKwlzdXBlci5jb25maWd1cmUoYmluZGVyKTsKKwkJYmluZGVyLmJpbmQoSU91dHB1dENvbmZpZ3VyYXRpb25Qcm92aWRlci5jbGFzcykudG8oRFNMT3V0cHV0Q29uZmlndXJhdGlvblByb3ZpZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xTdGFuZGFsb25lU2V0dXAuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0F1dGhvcml6YXRpb25EU0xTdGFuZGFsb25lU2V0dXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmM0YzE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkF1dGhvcml6YXRpb25EU0xTdGFuZGFsb25lU2V0dXBHZW5lcmF0ZWQ7CisKKy8qKgorICogSW5pdGlhbGl6YXRpb24gc3VwcG9ydCBmb3IgcnVubmluZyBYdGV4dCBsYW5ndWFnZXMgCisgKiB3aXRob3V0IGVxdWlub3ggZXh0ZW5zaW9uIHJlZ2lzdHJ5CisgKi8KK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMU3RhbmRhbG9uZVNldHVwIGV4dGVuZHMgQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cEdlbmVyYXRlZHsKKworCXB1YmxpYyBzdGF0aWMgdm9pZCBkb1NldHVwKCkgeworCQluZXcgQXV0aG9yaXphdGlvbkRTTFN0YW5kYWxvbmVTZXR1cCgpLmNyZWF0ZUluamVjdG9yQW5kRG9FTUZSZWdpc3RyYXRpb24oKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0dlbmVyYXRlQXV0aG9yaXphdGlvbkRTTC5td2UyIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvR2VuZXJhdGVBdXRob3JpemF0aW9uRFNMLm13ZTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzZDk5ZgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL0dlbmVyYXRlQXV0aG9yaXphdGlvbkRTTC5td2UyCkBAIC0wLDAgKzEsMTYzIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgCittb2R1bGUgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLkdlbmVyYXRlQXV0aG9yaXphdGlvbkRTTAorCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLm13ZS51dGlscy4qCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLioKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC51aS5nZW5lcmF0b3IuKgoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLm13ZS4qCisKK3ZhciBwcm9qZWN0TmFtZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wiCit2YXIgZ3JhbW1hclVSSSA9ICJwbGF0Zm9ybTovcmVzb3VyY2UvJHtwcm9qZWN0TmFtZX0vc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9BdXRob3JpemF0aW9uRFNMLnh0ZXh0IgordmFyIGZpbGVFeHRlbnNpb25zID0gImF1dGhvcml6YXRpb24iCit2YXIgcnVudGltZVByb2plY3QgPSAiLi4vJHtwcm9qZWN0TmFtZX0iCit2YXIgZ2VuZXJhdGVYdGVuZFN0dWIgPSB0cnVlCit2YXIgZW5jb2RpbmcgPSAiVVRGLTgiCisKK1dvcmtmbG93IHsKKwkJYmVhbiA9IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZS5YY29yZVN0YW5kYWxvbmVTZXR1cCA6IHhjb3JlIHt9CisJCWJlYW4gPSBvcmcuZWNsaXBzZS54dGV4dC5td2UuUmVhZGVyIHsKKwkJCXJlZ2lzdGVyID0geGNvcmUKKwkJfQorCQliZWFuID0gTWF2ZW5TdGFuZGFsb25lU2V0dXAgeworCQkJc2NhbkNsYXNzUGF0aCA9IHRydWUKKwkJCXBsYXRmb3JtVXJpID0gIiR7cnVudGltZVByb2plY3R9Ly4uIgorCQkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9tb2RlbC9BdXRob3JpemF0aW9uRFNMLnhjb3JlIgorCQkJcmVnaXN0ZXJHZW5lcmF0ZWRFUGFja2FnZSA9ICJvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UiCisJCQkKKwkJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAvbW9kZWwvQmxpcERTTC54Y29yZSIKKwkJCXJlZ2lzdGVyR2VuZXJhdGVkRVBhY2thZ2UgPSAib3JnLmVjbGlwc2Uub3NicC54dGV4dC5ibGlwLkJsaXBEU0xQYWNrYWdlIgorCisJCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0L21vZGVsL2VudGl0eS54Y29yZSIKKwkJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLmRzbC5lbnRpdHkueHRleHQvbW9kZWwvZW50aXR5Lnhjb3JlIgorCQkJcmVnaXN0ZXJHZW5Nb2RlbEZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLm9zYnAuZHNsLmNvbW1vbi54dGV4dC9tb2RlbC90eXBlcy54Y29yZSIKKwkJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS5vc2JwLmRzbC5jb21tb24ueHRleHQvbW9kZWwvdHlwZXMueGNvcmUiCisJCQlyZWdpc3Rlckdlbk1vZGVsRmlsZSA9ICJwbGF0Zm9ybTovcmVzb3VyY2Uvb3JnLmVjbGlwc2UueHRleHQuY29tbW9uLnR5cGVzL21vZGVsL0phdmFWTVR5cGVzLmdlbm1vZGVsIgorCQkJcmVnaXN0ZXJFY29yZUZpbGUgPSAicGxhdGZvcm06L3Jlc291cmNlL29yZy5lY2xpcHNlLnh0ZXh0LmNvbW1vbi50eXBlcy9tb2RlbC9KYXZhVk1UeXBlcy5lY29yZSIKKwkJCXJlZ2lzdGVyR2VuTW9kZWxGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YYmFzZS5nZW5tb2RlbCIKKwkJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YdHlwZS5lY29yZSIKKwkJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YYmFzZS5lY29yZSIKKwkJCXJlZ2lzdGVyRWNvcmVGaWxlID0gInBsYXRmb3JtOi9yZXNvdXJjZS9vcmcuZWNsaXBzZS54dGV4dC54YmFzZS9tb2RlbC9YQW5ub3RhdGlvbnMuZWNvcmUiCisJICAgIH0KKyAgICAgICAgY29tcG9uZW50ID0gRGlyZWN0b3J5Q2xlYW5lciB7CisgICAgICAgICAgICBkaXJlY3RvcnkgPSAiJHtydW50aW1lUHJvamVjdH0vc3JjLWdlbiIKKwkgICAgCWV4Y2x1ZGUgPSAiUkVBRE1FLnR4dCIKKyAgICAgICAgfQorICAgIAorICAgICAgICBjb21wb25lbnQgPSBEaXJlY3RvcnlDbGVhbmVyIHsKKyAgICAgICAgICAgIGRpcmVjdG9yeSA9ICIke3J1bnRpbWVQcm9qZWN0fS51aS9zcmMtZ2VuIgorCSAgICAJZXhjbHVkZSA9ICJSRUFETUUudHh0IgorICAgICAgICB9CisgICAgCisgICAgICAgIGNvbXBvbmVudCA9IEdlbmVyYXRvciB7CisgICAgICAgICAgICBwYXRoUnRQcm9qZWN0ID0gcnVudGltZVByb2plY3QKKyAgICAgICAgICAgIHBhdGhVaVByb2plY3QgPSAiJHtydW50aW1lUHJvamVjdH0udWkiCisgICAgICAgICAgICBwYXRoVGVzdFByb2plY3QgPSAiJHtydW50aW1lUHJvamVjdH0udGVzdHMiCisgICAgICAgICAgICBwcm9qZWN0TmFtZVJ0ID0gcHJvamVjdE5hbWUKKyAgICAgICAgICAgIHByb2plY3ROYW1lVWkgPSAiJHtwcm9qZWN0TmFtZX0udWkiCisgICAgICAgICAgICBlbmNvZGluZyA9IGVuY29kaW5nCisgICAgICAgICAgICBsYW5ndWFnZSA9IGF1dG8taW5qZWN0IHsKKwkgICAgCQl1cmkgPSBncmFtbWFyVVJJCisJICAgIAorCSAgICAJCS8vIEphdmEgQVBJIHRvIGFjY2VzcyBncmFtbWFyIGVsZW1lbnRzIChyZXF1aXJlZCBieSBzZXZlcmFsIG90aGVyIGZyYWdtZW50cykKKwkgICAgCQlmcmFnbWVudCA9IGdyYW1tYXJBY2Nlc3MuR3JhbW1hckFjY2Vzc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIGdlbmVyYXRlcyBKYXZhIEFQSSBmb3IgdGhlIGdlbmVyYXRlZCBFUGFja2FnZXMKKwkgICAgCQlmcmFnbWVudCA9IGVjb3JlLkVNRkdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIHRoZSBvbGQgc2VyaWFsaXphdGlvbiBjb21wb25lbnQKKwkgICAgCQkvLyBmcmFnbWVudCA9IHBhcnNlVHJlZUNvbnN0cnVjdG9yLlBhcnNlVHJlZUNvbnN0cnVjdG9yRnJhZ21lbnQgYXV0by1pbmplY3Qge30gICAgCisJICAgIAorCSAgICAJCS8vIHNlcmlhbGl6ZXIgMi4wCisJICAgIAkJZnJhZ21lbnQgPSBzZXJpYWxpemVyLlNlcmlhbGl6ZXJGcmFnbWVudCBhdXRvLWluamVjdCB7CisJICAgIAkJCWdlbmVyYXRlU3R1YiA9IGZhbHNlCisJICAgIAkJfQorCSAgICAKKwkgICAgCQkvLyBhIGN1c3RvbSBSZXNvdXJjZUZhY3RvcnkgZm9yIHVzZSB3aXRoIEVNRgorCSAgICAJCWZyYWdtZW50ID0gcmVzb3VyY2VGYWN0b3J5LlJlc291cmNlRmFjdG9yeUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIFRoZSBhbnRsciBwYXJzZXIgZ2VuZXJhdG9yIGZyYWdtZW50LgorCSAgICAJCWZyYWdtZW50ID0gcGFyc2VyLmFudGxyLlh0ZXh0QW50bHJHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7CisJICAgIAkJLy8gIG9wdGlvbnMgPSB7CisJICAgIAkJLy8gICAgICBiYWNrdHJhY2sgPSB0cnVlCisJICAgIAkJLy8gIH0KKwkgICAgCQl9CisJICAgIAorCSAgICAJCS8vIFh0ZW5kLWJhc2VkIEFQSSBmb3IgdmFsaWRhdGlvbgorCSAgICAJCWZyYWdtZW50ID0gdmFsaWRhdGlvbi5WYWxpZGF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7CisJICAgIAkJLy8gICAgY29tcG9zZWRDaGVjayA9ICJvcmcuZWNsaXBzZS54dGV4dC52YWxpZGF0aW9uLkltcG9ydFVyaVZhbGlkYXRvciIKKwkgICAgCQkvLyAgICBjb21wb3NlZENoZWNrID0gIm9yZy5lY2xpcHNlLnh0ZXh0LnZhbGlkYXRpb24uTmFtZXNBcmVVbmlxdWVWYWxpZGF0b3IiCisJICAgIAkJfQorCSAgICAKKwkgICAgCQkvLyBvbGQgc2NvcGluZyBhbmQgZXhwb3J0aW5nIEFQSQorCSAgICAJCS8vIGZyYWdtZW50ID0gc2NvcGluZy5JbXBvcnRVUklTY29waW5nRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCQkvLyBmcmFnbWVudCA9IGV4cG9ydGluZy5TaW1wbGVOYW1lc0ZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIHNjb3BpbmcgYW5kIGV4cG9ydGluZyBBUEkKKwkgICAgCQlmcmFnbWVudCA9IHNjb3BpbmcuSW1wb3J0TmFtZXNwYWNlc1Njb3BpbmdGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCSAgICAJCWZyYWdtZW50ID0gZXhwb3J0aW5nLlF1YWxpZmllZE5hbWVzRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCQlmcmFnbWVudCA9IGJ1aWxkZXIuQnVpbGRlckludGVncmF0aW9uRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCisJICAgIAkJLy8gZ2VuZXJhdG9yIEFQSQorCSAgICAJCWZyYWdtZW50ID0gZ2VuZXJhdG9yLkdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIGZvcm1hdHRlciBBUEkKKwkgICAgCQlmcmFnbWVudCA9IGZvcm1hdHRpbmcuRm9ybWF0dGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCisJICAgIAkJLy8gbGFiZWxpbmcgQVBJCisJICAgIAkJZnJhZ21lbnQgPSBsYWJlbGluZy5MYWJlbFByb3ZpZGVyRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCisJICAgIAkJLy8gb3V0bGluZSBBUEkKKwkgICAgCQlmcmFnbWVudCA9IG91dGxpbmUuT3V0bGluZVRyZWVQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAkJZnJhZ21lbnQgPSBvdXRsaW5lLlF1aWNrT3V0bGluZUZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIHF1aWNrZml4IEFQSQorCSAgICAJCWZyYWdtZW50ID0gcXVpY2tmaXguUXVpY2tmaXhQcm92aWRlckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIGNvbnRlbnQgYXNzaXN0IEFQSQorCSAgICAJCWZyYWdtZW50ID0gY29udGVudEFzc2lzdC5Db250ZW50QXNzaXN0RnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCisJICAgIAkJLy8gZ2VuZXJhdGVzIGEgbW9yZSBsaWdodHdlaWdodCBBbnRsciBwYXJzZXIgYW5kIGxleGVyIHRhaWxvcmVkIGZvciBjb250ZW50IGFzc2lzdAorCSAgICAJCWZyYWdtZW50ID0gcGFyc2VyLmFudGxyLlh0ZXh0QW50bHJVaUdlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIGdlbmVyYXRlcyBqdW5pdCB0ZXN0IHN1cHBvcnQgY2xhc3NlcyBpbnRvIEdlbmVyYXRvciNwYXRoVGVzdFByb2plY3QKKwkgICAgCQlmcmFnbWVudCA9IGp1bml0Lkp1bml0NEZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIHByb2plY3Qgd2l6YXJkIChvcHRpb25hbCkKKwkgICAgCQkvLyBmcmFnbWVudCA9IHByb2plY3RXaXphcmQuU2ltcGxlUHJvamVjdFdpemFyZEZyYWdtZW50IGF1dG8taW5qZWN0IHsKKwkgICAgCQkvLyAgICAgIGdlbmVyYXRvclByb2plY3ROYW1lID0gIiR7cHJvamVjdE5hbWV9IgorCSAgICAJCS8vIH0KKwkgICAgCisJICAgIAkJLy8gcmVuYW1lIHJlZmFjdG9yaW5nCisJICAgIAkJZnJhZ21lbnQgPSByZWZhY3RvcmluZy5SZWZhY3RvckVsZW1lbnROYW1lRnJhZ21lbnQgYXV0by1pbmplY3Qge30KKwkgICAgCisJICAgIAkJLy8gcHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBiaW5kaW5ncyBmb3IgamF2YSB0eXBlcyBpbnRlZ3JhdGlvbgorCSAgICAJCWZyYWdtZW50ID0gdHlwZXMuVHlwZXNHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCSAgICAKKwkgICAgCQkvLyBnZW5lcmF0ZXMgdGhlIHJlcXVpcmVkIGJpbmRpbmdzIG9ubHkgaWYgdGhlIGdyYW1tYXIgaW5oZXJpdHMgZnJvbSBYYmFzZQorCSAgICAJCWZyYWdtZW50ID0geGJhc2UuWGJhc2VHZW5lcmF0b3JGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCSAgICAKKwkgICAgCQkvLyBwcm92aWRlcyBhIHByZWZlcmVuY2UgcGFnZSBmb3IgdGVtcGxhdGUgcHJvcG9zYWxzCisJICAgIAkJZnJhZ21lbnQgPSB0ZW1wbGF0ZXMuQ29kZXRlbXBsYXRlc0dlbmVyYXRvckZyYWdtZW50IGF1dG8taW5qZWN0IHt9CisJICAgIAorCSAgICAJCS8vIHByb3ZpZGVzIGEgY29tcGFyZSB2aWV3CisJICAgIAkJZnJhZ21lbnQgPSBjb21wYXJlLkNvbXBhcmVGcmFnbWVudCBhdXRvLWluamVjdCB7fQorCSAgICAJCQorCSAgICAJCS8vIHBhcnNlIGdyYW1tYXIgYW5kIGdlbmVyYXRlIGkxOG4gZ3JhbW1hcgorICAgICAgICAgICAgICAgIGZyYWdtZW50ID0gb3JnLmVjbGlwc2Uub3NicC54dGV4dC5iYXNpYy5nZW5lcmF0b3IuQmFzaWNEc2xHcmFtbWFySTE4bkdlbmVyYXRvciBhdXRvLWluamVjdCB7fQorICAgICAgICAgICAgfQorICAgICAgICB9Cit9CisKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL1hjb3JlUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmY2FhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9YY29yZVJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKi8KKyBwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS54Y29yZS5yZXNvdXJjZS5YY29yZVJlc291cmNlOworCitwdWJsaWMgY2xhc3MgWGNvcmVSZXNvdXJjZUZhY3RvcnkgaW1wbGVtZW50cyBSZXNvdXJjZS5GYWN0b3J5IHsKKwlAT3ZlcnJpZGUKKwlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoVVJJIHVyaSkgeworCQlYY29yZVJlc291cmNlIHJlc291cmNlID0gbmV3IFhjb3JlUmVzb3VyY2UoKTsKKwkJcmVzb3VyY2Uuc2V0VVJJKHVyaSk7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2NvbW1vbi9BdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9jb21tb24vQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYTQ5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9jb21tb24vQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLnh0ZW5kCkBAIC0wLDAgKzEsNTUgQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqICBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgICAgICAgICAgICAgICAgICAKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQ29udHJpYnV0b3JzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmNvbW1vbgorCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVQcm9wZXJ0eUVudW0KK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzRW51bQoraW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrRW51bQorCisvKioKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNjb250ZW50QXNzaXN0IG9uIGhvdyB0byBjdXN0b21pemUgY29udGVudCBhc3Npc3RhbnQKKyAqLworY2xhc3MgQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzIHsKKyAgICAKKyAgICBkZWYgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eUVudW0oU3RyaW5nIHByb3Bvc2FsKSB7CisgICAgICAgIGZvciAoUm9sZVByb3BlcnR5RW51bSBpdGVtIDogUm9sZVByb3BlcnR5RW51bS52YWx1ZXMpIHsKKyAgICAgICAgICAgIGlmICAoaXRlbS5saXRlcmFsLmVxdWFscyhwcm9wb3NhbCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZQorICAgIH0KKyAgICAKKyAgICBkZWYgc3RhdGljIGJvb2xlYW4gaXNQcm9jZXNzRW51bShTdHJpbmcgcHJvcG9zYWwpIHsKKyAgICAgICAgZm9yIChSb2xlQmxpcFByb2Nlc3NFbnVtIGl0ZW0gOiBSb2xlQmxpcFByb2Nlc3NFbnVtLnZhbHVlcykgeworICAgICAgICAgICAgaWYgIChpdGVtLmxpdGVyYWwuZXF1YWxzKHByb3Bvc2FsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlCisgICAgfQorICAgIAorICAgIGRlZiBzdGF0aWMgYm9vbGVhbiBpc1VzZXJUYXNrRW51bShTdHJpbmcgcHJvcG9zYWwpIHsKKyAgICAgICAgZm9yIChSb2xlQmxpcFVzZXJUYXNrRW51bSBpdGVtIDogUm9sZUJsaXBVc2VyVGFza0VudW0udmFsdWVzKSB7CisgICAgICAgICAgICBpZiAgKGl0ZW0ubGl0ZXJhbC5lcXVhbHMocHJvcG9zYWwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2UKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9mb3JtYXR0aW5nL0F1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9mb3JtYXR0aW5nL0F1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIueHRlbmQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhhZWViMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2Zvcm1hdHRpbmcvQXV0aG9yaXphdGlvbkRTTEZvcm1hdHRlci54dGVuZApAQCAtMCwwICsxLDQ2IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKgorICovCisgCitwYWNrYWdlIG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5mb3JtYXR0aW5nCisKK2ltcG9ydCBjb20uZ29vZ2xlLmluamVjdC5JbmplY3Q7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC51dGlscy54dGV4dC5HZW5lcmljRm9ybWF0dGVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZm9ybWF0dGluZy5pbXBsLkFic3RyYWN0RGVjbGFyYXRpdmVGb3JtYXR0ZXIKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuRm9ybWF0dGluZ0NvbmZpZworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLnNlcnZpY2VzLlh0eXBlR3JhbW1hckFjY2VzcworLy9pbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNlcnZpY2VzLkF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzCisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjdXN0b20gZm9ybWF0dGluZyBkZXNjcmlwdGlvbi4KKyAqIAorICogc2VlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjZm9ybWF0dGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdCAKKyAqIAorICogQWxzbyBzZWUge0BsaW5rIG9yZy5lY2xpcHNlLnh0ZXh0Lnh0ZXh0Llh0ZXh0Rm9ybWF0dGluZ1Rva2VuU2VyaWFsaXplcn0gYXMgYW4gZXhhbXBsZQorICovCitjbGFzcyBBdXRob3JpemF0aW9uRFNMRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3REZWNsYXJhdGl2ZUZvcm1hdHRlciB7CisKKy8vCUBJbmplY3QgZXh0ZW5zaW9uIEF1dGhvcml6YXRpb25EU0xHcmFtbWFyQWNjZXNzCisJQEluamVjdCBYdHlwZUdyYW1tYXJBY2Nlc3MgZ3JhbW1hckFjY2VzcworCisJb3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRm9ybWF0dGluZyhGb3JtYXR0aW5nQ29uZmlnIGMpIHsKKwkJdmFsIGdlbmVyaWNGb3JtYXR0ZXIgPSBuZXcgR2VuZXJpY0Zvcm1hdHRlcigpCisKKwkJZ2VuZXJpY0Zvcm1hdHRlci5mb3JtYXRGaXJzdExldmVsQmxvY2tzKCBjLCBncmFtbWFyLmdyYW1tYXIsICJSb2xlIiwgIkF1dGhvcml6YXRpb25JbXBvcnQiICkKKwkJZ2VuZXJpY0Zvcm1hdHRlci5nZW5lcmljRm9ybWF0dGluZyggYywgZ3JhbW1hciwgZ3JhbW1hckFjY2VzcyApCisJfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvZ2VuZXJhdG9yL0F1dGhvcml6YXRpb25EU0xHZW5lcmF0b3IueHRlbmQgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9nZW5lcmF0b3IvQXV0aG9yaXphdGlvbkRTTEdlbmVyYXRvci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNhNTFkCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvZ2VuZXJhdG9yL0F1dGhvcml6YXRpb25EU0xHZW5lcmF0b3IueHRlbmQKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgIAorICogIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBDb250cmlidXRvcnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAJICAgQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZ2VuZXJhdG9yCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmkxOG4uSTE4Tk1vZGVsR2VuZXJhdG9yCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklGaWxlU3lzdGVtQWNjZXNzCisKK2NsYXNzIEF1dGhvcml6YXRpb25EU0xHZW5lcmF0b3IgZXh0ZW5kcyBJMThOTW9kZWxHZW5lcmF0b3IgeworCW92ZXJyaWRlIHZvaWQgZG9HZW5lcmF0ZShSZXNvdXJjZSByZXNvdXJjZSwgSUZpbGVTeXN0ZW1BY2Nlc3MgZnNhKSB7CisJCXN1cGVyLmRvR2VuZXJhdGUocmVzb3VyY2UsIGZzYSkKKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9qdm1tb2RlbC9BdXRob3JpemF0aW9uRFNMSnZtTW9kZWxJbmZlcnJlci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2p2bW1vZGVsL0F1dGhvcml6YXRpb25EU0xKdm1Nb2RlbEluZmVycmVyLnh0ZW5kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDc1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9qdm1tb2RlbC9BdXRob3JpemF0aW9uRFNMSnZtTW9kZWxJbmZlcnJlci54dGVuZApAQCAtMCwwICsxLDM3IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmp2bW1vZGVsCisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuQWJzdHJhY3RNb2RlbEluZmVycmVyCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UuanZtbW9kZWwuSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yCisKKy8qKgorICogPHA+SW5mZXJzIGEgSlZNIG1vZGVsIGZyb20gdGhlIHNvdXJjZSBtb2RlbC48L3A+IAorICoKKyAqIDxwPlRoZSBKVk0gbW9kZWwgc2hvdWxkIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUgCisgKiB3aGljaCBpcyBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIG1vZGVsLiBPdGhlciBtb2RlbHMgbGluayBhZ2FpbnN0IHRoZSBKVk0gbW9kZWwgcmF0aGVyIHRoYW4gdGhlIHNvdXJjZSBtb2RlbC48L3A+ICAgICAKKyAqLworY2xhc3MgQXV0aG9yaXphdGlvbkRTTEp2bU1vZGVsSW5mZXJyZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSW5mZXJyZXIgeworICAgIC8qKgorICAgICAqIGNvbnZlbmllbmNlIEFQSSB0byBidWlsZCBhbmQgaW5pdGlhbGl6ZSBKVk0gdHlwZXMgYW5kIHRoZWlyIG1lbWJlcnMuCisgICAgICovCisgICAJZGVmIGRpc3BhdGNoIHZvaWQgaW5mZXIoQXV0aG9yaXphdGlvbk1vZGVsIG1vZGVsLCBJSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3IgYWNjZXB0b3IsIGJvb2xlYW4gaXNQcmVJbmRleGluZ1BoYXNlKSB7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zY29waW5nL0F1dGhvcml6YXRpb25EU0xTY29wZVByb3ZpZGVyLnh0ZW5kIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvc2NvcGluZy9BdXRob3JpemF0aW9uRFNMU2NvcGVQcm92aWRlci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTA2MzY3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvc2NvcGluZy9BdXRob3JpemF0aW9uRFNMU2NvcGVQcm92aWRlci54dGVuZApAQCAtMCwwICsxLDU1IEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE2IC0gTG9ldHogR21iSCZDby5LRyAoNjkxMTUgSGVpZGVsYmVyZywgR2VybWFueSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgICAgICAgCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAgICAgICAgICAgICAgICAgIAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogQ29udHJpYnV0b3JzOiAgIAorICogQ2hyaXN0b3BoZSBMb2V0eiAoTG9ldHogR21iSCZDby5LRykgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIAorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqCisgKi8KKyAKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnNjb3BpbmcKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2sKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuRU9iamVjdERlc2NyaXB0aW9uCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQucmVzb3VyY2UuSUVPYmplY3REZXNjcmlwdGlvbgoraW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuc2NvcGluZy5pbXBsLk1hcEJhc2VkU2NvcGUKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5hbm5vdGF0aW9ucy50eXBlc3lzdGVtLlhiYXNlV2l0aEFubm90YXRpb25zQmF0Y2hTY29wZVByb3ZpZGVyCisKK2NsYXNzIEF1dGhvcml6YXRpb25EU0xTY29wZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VXaXRoQW5ub3RhdGlvbnNCYXRjaFNjb3BlUHJvdmlkZXIgeworCisJQE92ZXJyaWRlCisJb3ZlcnJpZGUgSVNjb3BlIGdldFNjb3BlKEVPYmplY3QgY29udGV4dCwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKwkJaWYgKHJlZmVyZW5jZSA9PSBBdXRob3JpemF0aW9uRFNMUGFja2FnZS5MaXRlcmFscy5ST0xFX0JMSVBfVVNFUl9UQVNLX19VU0VSX1RBU0spIHsKKwkJCXJldHVybiBnZXRTY29wZV9Sb2xlQmxpcFByb2Nlc3NfVXNlclRhc2soY29udGV4dCBhcyBSb2xlQmxpcFVzZXJUYXNrKQorCQl9CisJCXZhciBycyA9IGNvbnRleHQuZVJlc291cmNlLnJlc291cmNlU2V0CisJCXJldHVybiBzdXBlci5nZXRTY29wZShjb250ZXh0LCByZWZlcmVuY2UpCisJfQorCisJZGVmIGdldFNjb3BlX1JvbGVCbGlwUHJvY2Vzc19Vc2VyVGFzayhSb2xlQmxpcFVzZXJUYXNrIHJvbGVCbGlwVXNlclRhc2spIHsKKwkJdmFyIHJlc3VsdCA9IDxJRU9iamVjdERlc2NyaXB0aW9uPm5ld0FycmF5TGlzdAorCQl2YXIgcHJvY2VzcyA9IChyb2xlQmxpcFVzZXJUYXNrLmVDb250YWluZXIgYXMgUm9sZUJsaXBQcm9jZXNzKS5wcm9jZXNzCisJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCWZvciAoaXRlbSA6IHByb2Nlc3MuaXRlbXMpIHsKKwkJCQlpZgkoaXRlbSBpbnN0YW5jZW9mIEJsaXBVc2VyVGFzaykgeworCQkJCQlyZXN1bHQuYWRkKEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoaXRlbS5uYW1lLCBpdGVtKSkKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KQorCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3ZhbGlkYXRpb24vQXV0aG9yaXphdGlvbkRTTFZhbGlkYXRvci54dGVuZCBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3ZhbGlkYXRpb24vQXV0aG9yaXphdGlvbkRTTFZhbGlkYXRvci54dGVuZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTEyNzI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsaWRhdGlvbi9BdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yLnh0ZW5kCkBAIC0wLDAgKzEsMzggQEAKKy8qKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCAgICAgICAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiBDb250cmlidXRvcnM6ICAgCisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24gCisgKiAKKyAqIAorICogIFRoaXMgY29weXJpZ2h0IG5vdGljZSBzaG93cyB1cCBpbiB0aGUgZ2VuZXJhdGVkIEphdmEgY29kZQorICoKKyAqLworIAorcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudmFsaWRhdGlvbgorLy9pbXBvcnQgb3JnLmVjbGlwc2UueHRleHQudmFsaWRhdGlvbi5DaGVjaworCisvKioKKyAqIEN1c3RvbSB2YWxpZGF0aW9uIHJ1bGVzLiAKKyAqCisgKiBzZWUgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjdmFsaWRhdGlvbgorICovCitjbGFzcyBBdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RBdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yIHsKKworLy8gIHB1YmxpYyBzdGF0aWMgdmFsIElOVkFMSURfTkFNRSA9ICdpbnZhbGlkTmFtZScKKy8vCisvLwlAQ2hlY2sKKy8vCWRlZiBjaGVja0dyZWV0aW5nU3RhcnRzV2l0aENhcGl0YWwoR3JlZXRpbmcgZ3JlZXRpbmcpIHsKKy8vCQlpZiAoIUNoYXJhY3Rlci5pc1VwcGVyQ2FzZShncmVldGluZy5uYW1lLmNoYXJBdCgwKSkpIHsKKy8vCQkJd2FybmluZygnTmFtZSBzaG91bGQgc3RhcnQgd2l0aCBhIGNhcGl0YWwnLCAKKy8vCQkJCQlNeURzbFBhY2thZ2UuTGl0ZXJhbHMuR1JFRVRJTkdfX05BTUUsCisvLwkJCQkJSU5WQUxJRF9OQU1FKQorLy8JCX0KKy8vCX0KK30KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3ZhbHVlY29udmVydGVyL0F1dGhvcml6YXRpb25RdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC9zcmMvb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3ZhbHVlY29udmVydGVyL0F1dGhvcml6YXRpb25RdWFsaWZpZWROYW1lUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzdlNWZjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsdWVjb252ZXJ0ZXIvQXV0aG9yaXphdGlvblF1YWxpZmllZE5hbWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wICAgICAgIAorICogIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICAgICAgICAgICAgICAgICAgCisgKiAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIENvbnRyaWJ1dG9yczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqIAkgICBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICovCisgcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudmFsdWVjb252ZXJ0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuZW50aXR5Lnh0ZXh0LmV4dGVuc2lvbnMuTW9kZWxFeHRlbnNpb25zOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAuZHNsLnNlbWFudGljLmNvbW1vbi50eXBlcy5MRmVhdHVyZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLmRzbC5zZW1hbnRpYy5jb21tb24udHlwZXMuTFBhY2thZ2U7CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC5kc2wuc2VtYW50aWMuY29tbW9uLnR5cGVzLkxUeXBlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0Lm5hbWluZy5JUXVhbGlmaWVkTmFtZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5uYW1pbmcuUXVhbGlmaWVkTmFtZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5ub2RlbW9kZWwuSU5vZGU7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQubm9kZW1vZGVsLnV0aWwuTm9kZU1vZGVsVXRpbHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2Uuc2NvcGluZy5YYmFzZVF1YWxpZmllZE5hbWVQcm92aWRlcjsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKKworQFN1cHByZXNzV2FybmluZ3MoInJlc3RyaWN0aW9uIikKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uUXVhbGlmaWVkTmFtZVByb3ZpZGVyIGV4dGVuZHMgWGJhc2VRdWFsaWZpZWROYW1lUHJvdmlkZXIgeworCisJQEluamVjdAorCXByaXZhdGUgSVF1YWxpZmllZE5hbWVDb252ZXJ0ZXIgcXVhbGlmaWVkTmFtZUNvbnZlcnRlcjsKKworCUBJbmplY3QKKwlwcml2YXRlIE1vZGVsRXh0ZW5zaW9ucyBleHRlbnNpb25zOworCisJQE92ZXJyaWRlCisJcHVibGljIFF1YWxpZmllZE5hbWUgZ2V0RnVsbHlRdWFsaWZpZWROYW1lKEVPYmplY3Qgb2JqKSB7CisJCWlmIChvYmogPT0gbnVsbCkgeworCQkJcmV0dXJuIFF1YWxpZmllZE5hbWUuY3JlYXRlKCIiKTsKKwkJfQorCisJCWlmIChvYmogaW5zdGFuY2VvZiBSb2xlKSB7CisJCQlSb2xlIHJvbGUgPSAoUm9sZSkgb2JqOworICAgICAgICAgICAgaWYgKHJvbGUuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIAlyZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFF1YWxpZmllZE5hbWUgciA9IHF1YWxpZmllZE5hbWVDb252ZXJ0ZXIudG9RdWFsaWZpZWROYW1lKHJvbGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByOworCQl9CisJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIFJvbGVCbGlwVXNlclRhc2spIHsKKwkJCVF1YWxpZmllZE5hbWUgciA9IHF1YWxpZmllZENyb3NzUmVmZXJlbmNlTmFtZUNvbnZlcnRlcihvYmosIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlQmxpcFVzZXJUYXNrX1VzZXJUYXNrKCkpOworCQkJcmV0dXJuIHI7CisJCX0KKy8vCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBSb2xlQmxpcFByb2Nlc3MpIHsKKy8vICAgICAgICAgICAgcmV0dXJuIHF1YWxpZmllZENyb3NzUmVmZXJlbmNlTmFtZUNvbnZlcnRlcihvYmosIEF1dGhvcml6YXRpb25EU0xQYWNrYWdlLmVJTlNUQU5DRS5nZXRSb2xlQmxpcFByb2Nlc3NfVXNlclRhc2tzKCkpOworLy8JCX0KKwkJUXVhbGlmaWVkTmFtZSByID0gc3VwZXIuZ2V0RnVsbHlRdWFsaWZpZWROYW1lKG9iaik7CisJCXJldHVybiByOworCX0KKworCS8vIHRoaXMgbWV0aG9kIGV2YWx1YXRlcyB0aGUgY3Jvc3MgcmVmZXJlbmNlZCBuYW1lIG9mIGFuIG9iamVjdCB3aXRob3V0IGNhdXNpbmcgY3ljbGljIGxhenkgbGlua2luZyBlcnJvcnMKKwlwcml2YXRlIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkQ3Jvc3NSZWZlcmVuY2VOYW1lQ29udmVydGVyKEVPYmplY3Qgb2JqLCBFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgeworCQlMaXN0PElOb2RlPiBub2RlcyA9IE5vZGVNb2RlbFV0aWxzLmZpbmROb2Rlc0ZvckZlYXR1cmUob2JqLCBmZWF0dXJlKTsKKwkJaWYgKG5vZGVzLnNpemUoKSA9PSAwKSB7CisJCQlyZXR1cm4gUXVhbGlmaWVkTmFtZS5jcmVhdGUoIiIpOworCQl9CisJCVN0cmluZyB0ZXh0ID0gTm9kZU1vZGVsVXRpbHMuZ2V0VG9rZW5UZXh0KG5vZGVzLmdldCgwKSk7CisJCWlmCSh0ZXh0LmlzRW1wdHkoKSkgeworCQkJcmV0dXJuIFF1YWxpZmllZE5hbWUuY3JlYXRlKCIiKTsKKwkJfQorCQlyZXR1cm4gcXVhbGlmaWVkTmFtZUNvbnZlcnRlci50b1F1YWxpZmllZE5hbWUodGV4dCk7CisJfQorCQorCXB1YmxpYyBRdWFsaWZpZWROYW1lIGdldEZRTihMRmVhdHVyZSBsZmVhdHVyZSl7CisJCSAgIGlmKGxmZWF0dXJlLmdldE5hbWUoKSA9PSBudWxsKXsKKwkJICAgIHJldHVybiBRdWFsaWZpZWROYW1lLmNyZWF0ZSgiIik7CisJCSAgIH0KKwkJICAgTFR5cGUgdHlwZSA9IChMVHlwZSkgbGZlYXR1cmUuZUNvbnRhaW5lcigpOworCQkgICBMUGFja2FnZSBwa2cgPSBleHRlbnNpb25zLmdldFBhY2thZ2UodHlwZSk7CisJCSAgIGlmIChwa2cgIT0gbnVsbCAmJiB0eXBlICE9IG51bGwpIHsKKwkJICAgIGZpbmFsIFN0cmluZyBxdWFsaWZpZWROYW1lID0gU3RyaW5nLmZvcm1hdCgiJXMuJXMuJXMiLAorCQkgICAgICBwa2cuZ2V0TmFtZSgpLCB0eXBlLmdldE5hbWUoKSwgbGZlYXR1cmUuZ2V0TmFtZSgpKTsKKwkJICAgIGlmIChxdWFsaWZpZWROYW1lID09IG51bGwpCisJCSAgICAgcmV0dXJuIG51bGw7CisJCSAgICByZXR1cm4gcXVhbGlmaWVkTmFtZUNvbnZlcnRlci50b1F1YWxpZmllZE5hbWUocXVhbGlmaWVkTmFtZSk7CisJCSAgIH0gZWxzZSB7CisJCSAgICByZXR1cm4gbGZlYXR1cmUuZ2V0TmFtZSgpICE9IG51bGwgPyBxdWFsaWZpZWROYW1lQ29udmVydGVyCisJCSAgICAgIC50b1F1YWxpZmllZE5hbWUobGZlYXR1cmUuZ2V0TmFtZSgpKSA6IG51bGw7CisJCSAgIH0KKwkgIH0KKworfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsdWVjb252ZXJ0ZXIvQXV0aG9yaXphdGlvblZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3NyYy9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsdWVjb252ZXJ0ZXIvQXV0aG9yaXphdGlvblZhbHVlQ29udmVydGVyU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMmUzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wvc3JjL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC92YWx1ZWNvbnZlcnRlci9BdXRob3JpemF0aW9uVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogCQlDaHJpc3RvcGhlIExvZXR6IC0gSW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnZhbHVlY29udmVydGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5JVmFsdWVDb252ZXJ0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuY29udmVyc2lvbi5WYWx1ZUNvbnZlcnRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5jb252ZXJzaW9uLlhiYXNlVmFsdWVDb252ZXJ0ZXJTZXJ2aWNlOworCitpbXBvcnQgY29tLmdvb2dsZS5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5pMThuLkkxOG5VdGlsOworCisvKioKKyAqIEFkZHMgYSB2YWx1ZSBjb252ZXJzaW9uIGZvciB0aGUgUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCBydWxlLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25WYWx1ZUNvbnZlcnRlclNlcnZpY2UgZXh0ZW5kcyBYYmFzZVZhbHVlQ29udmVydGVyU2VydmljZSB7CisJCisJQFZhbHVlQ29udmVydGVyKHJ1bGUgPSAiUXVhbGlmaWVkTmFtZVdpdGhXaWxkQ2FyZCIpCisJcHVibGljIElWYWx1ZUNvbnZlcnRlcjxTdHJpbmc+IGdldFF1YWxpZmllZE5hbWVXaXRoV2lsZENhcmQoKSB7CisJCXJldHVybiBnZXRRdWFsaWZpZWROYW1lVmFsdWVDb252ZXJ0ZXIoKTsKKwl9CisJCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9jb21tb24vQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9jb21tb24vQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ3YmI4YQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2NvbW1vbi9BdXRob3JpemF0aW9uRFNMTGl0ZXJhbHMuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuY29tbW9uOworCitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwUHJvY2Vzc0VudW07CitpbXBvcnQgb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLlJvbGVCbGlwVXNlclRhc2tFbnVtOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlUHJvcGVydHlFbnVtOworCisvKioKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCNjb250ZW50QXNzaXN0IG9uIGhvdyB0byBjdXN0b21pemUgY29udGVudCBhc3Npc3RhbnQKKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTExpdGVyYWxzIHsKKyAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUHJvcGVydHlFbnVtKGZpbmFsIFN0cmluZyBwcm9wb3NhbCkgeworICAgIFJvbGVQcm9wZXJ0eUVudW1bXSBfdmFsdWVzID0gUm9sZVByb3BlcnR5RW51bS52YWx1ZXMoKTsKKyAgICBmb3IgKGZpbmFsIFJvbGVQcm9wZXJ0eUVudW0gaXRlbSA6IF92YWx1ZXMpIHsKKyAgICAgIFN0cmluZyBfbGl0ZXJhbCA9IGl0ZW0uZ2V0TGl0ZXJhbCgpOworICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX2xpdGVyYWwuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb2Nlc3NFbnVtKGZpbmFsIFN0cmluZyBwcm9wb3NhbCkgeworICAgIFJvbGVCbGlwUHJvY2Vzc0VudW1bXSBfdmFsdWVzID0gUm9sZUJsaXBQcm9jZXNzRW51bS52YWx1ZXMoKTsKKyAgICBmb3IgKGZpbmFsIFJvbGVCbGlwUHJvY2Vzc0VudW0gaXRlbSA6IF92YWx1ZXMpIHsKKyAgICAgIFN0cmluZyBfbGl0ZXJhbCA9IGl0ZW0uZ2V0TGl0ZXJhbCgpOworICAgICAgYm9vbGVhbiBfZXF1YWxzID0gX2xpdGVyYWwuZXF1YWxzKHByb3Bvc2FsKTsKKyAgICAgIGlmIChfZXF1YWxzKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgCisgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1VzZXJUYXNrRW51bShmaW5hbCBTdHJpbmcgcHJvcG9zYWwpIHsKKyAgICBSb2xlQmxpcFVzZXJUYXNrRW51bVtdIF92YWx1ZXMgPSBSb2xlQmxpcFVzZXJUYXNrRW51bS52YWx1ZXMoKTsKKyAgICBmb3IgKGZpbmFsIFJvbGVCbGlwVXNlclRhc2tFbnVtIGl0ZW0gOiBfdmFsdWVzKSB7CisgICAgICBTdHJpbmcgX2xpdGVyYWwgPSBpdGVtLmdldExpdGVyYWwoKTsKKyAgICAgIGJvb2xlYW4gX2VxdWFscyA9IF9saXRlcmFsLmVxdWFscyhwcm9wb3NhbCk7CisgICAgICBpZiAoX2VxdWFscykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9mb3JtYXR0aW5nL0F1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2Zvcm1hdHRpbmcvQXV0aG9yaXphdGlvbkRTTEZvcm1hdHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NzM4YjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9mb3JtYXR0aW5nL0F1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZm9ybWF0dGluZzsKKworaW1wb3J0IGNvbS5nb29nbGUuaW5qZWN0LkluamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnV0aWxzLnh0ZXh0LkdlbmVyaWNGb3JtYXR0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuR3JhbW1hcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuQWJzdHJhY3REZWNsYXJhdGl2ZUZvcm1hdHRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5mb3JtYXR0aW5nLmltcGwuRm9ybWF0dGluZ0NvbmZpZzsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5zZXJ2aWNlcy5YdHlwZUdyYW1tYXJBY2Nlc3M7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb250YWlucyBjdXN0b20gZm9ybWF0dGluZyBkZXNjcmlwdGlvbi4KKyAqIAorICogc2VlIDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9YdGV4dC9kb2N1bWVudGF0aW9uLmh0bWwjZm9ybWF0dGluZworICogb24gaG93IGFuZCB3aGVuIHRvIHVzZSBpdAorICogCisgKiBBbHNvIHNlZSB7QGxpbmsgb3JnLmVjbGlwc2UueHRleHQueHRleHQuWHRleHRGb3JtYXR0aW5nVG9rZW5TZXJpYWxpemVyfSBhcyBhbiBleGFtcGxlCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdERlY2xhcmF0aXZlRm9ybWF0dGVyIHsKKyAgQEluamVjdAorICBwcml2YXRlIFh0eXBlR3JhbW1hckFjY2VzcyBncmFtbWFyQWNjZXNzOworICAKKyAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRm9ybWF0dGluZyhmaW5hbCBGb3JtYXR0aW5nQ29uZmlnIGMpIHsKKyAgICBmaW5hbCBHZW5lcmljRm9ybWF0dGVyIGdlbmVyaWNGb3JtYXR0ZXIgPSBuZXcgR2VuZXJpY0Zvcm1hdHRlcigpOworICAgIEdyYW1tYXIgX2dyYW1tYXIgPSB0aGlzLmdyYW1tYXIuZ2V0R3JhbW1hcigpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZm9ybWF0Rmlyc3RMZXZlbEJsb2NrcyhjLCBfZ3JhbW1hciwgIlJvbGUiLCAiQXV0aG9yaXphdGlvbkltcG9ydCIpOworICAgIGdlbmVyaWNGb3JtYXR0ZXIuZ2VuZXJpY0Zvcm1hdHRpbmcoYywgdGhpcy5ncmFtbWFyLCB0aGlzLmdyYW1tYXJBY2Nlc3MpOworICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9nZW5lcmF0b3IvQXV0aG9yaXphdGlvbkRTTEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvZ2VuZXJhdG9yL0F1dGhvcml6YXRpb25EU0xHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNkN2NjCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvZ2VuZXJhdG9yL0F1dGhvcml6YXRpb25EU0xHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiAgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiAgQ29udHJpYnV0b3JzOgorICogCSAgIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZ2VuZXJhdG9yOworCitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuaTE4bi5JMThOTW9kZWxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQuZ2VuZXJhdG9yLklGaWxlU3lzdGVtQWNjZXNzOworCitAU3VwcHJlc3NXYXJuaW5ncygiYWxsIikKK3B1YmxpYyBjbGFzcyBBdXRob3JpemF0aW9uRFNMR2VuZXJhdG9yIGV4dGVuZHMgSTE4Tk1vZGVsR2VuZXJhdG9yIHsKKyAgcHVibGljIHZvaWQgZG9HZW5lcmF0ZShmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgSUZpbGVTeXN0ZW1BY2Nlc3MgZnNhKSB7CisgICAgc3VwZXIuZG9HZW5lcmF0ZShyZXNvdXJjZSwgZnNhKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvanZtbW9kZWwvQXV0aG9yaXphdGlvbkRTTEp2bU1vZGVsSW5mZXJyZXIuamF2YSBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2p2bW1vZGVsL0F1dGhvcml6YXRpb25EU0xKdm1Nb2RlbEluZmVycmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1M2QzMgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL2p2bW1vZGVsL0F1dGhvcml6YXRpb25EU0xKdm1Nb2RlbEluZmVycmVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLmp2bW1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuQXV0aG9yaXphdGlvbk1vZGVsOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmp2bW1vZGVsLkFic3RyYWN0TW9kZWxJbmZlcnJlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC54YmFzZS5qdm1tb2RlbC5JSnZtRGVjbGFyZWRUeXBlQWNjZXB0b3I7CisKKy8qKgorICogPHA+SW5mZXJzIGEgSlZNIG1vZGVsIGZyb20gdGhlIHNvdXJjZSBtb2RlbC48L3A+CisgKiAKKyAqIDxwPlRoZSBKVk0gbW9kZWwgc2hvdWxkIGNvbnRhaW4gYWxsIGVsZW1lbnRzIHRoYXQgd291bGQgYXBwZWFyIGluIHRoZSBKYXZhIGNvZGUKKyAqIHdoaWNoIGlzIGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2UgbW9kZWwuIE90aGVyIG1vZGVscyBsaW5rIGFnYWluc3QgdGhlIEpWTSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgc291cmNlIG1vZGVsLjwvcD4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTEp2bU1vZGVsSW5mZXJyZXIgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSW5mZXJyZXIgeworICAvKioKKyAgICogY29udmVuaWVuY2UgQVBJIHRvIGJ1aWxkIGFuZCBpbml0aWFsaXplIEpWTSB0eXBlcyBhbmQgdGhlaXIgbWVtYmVycy4KKyAgICovCisgIHByb3RlY3RlZCB2b2lkIF9pbmZlcihmaW5hbCBBdXRob3JpemF0aW9uTW9kZWwgbW9kZWwsIGZpbmFsIElKdm1EZWNsYXJlZFR5cGVBY2NlcHRvciBhY2NlcHRvciwgZmluYWwgYm9vbGVhbiBpc1ByZUluZGV4aW5nUGhhc2UpIHsKKyAgfQorICAKKyAgcHVibGljIHZvaWQgaW5mZXIoZmluYWwgRU9iamVjdCBtb2RlbCwgZmluYWwgSUp2bURlY2xhcmVkVHlwZUFjY2VwdG9yIGFjY2VwdG9yLCBmaW5hbCBib29sZWFuIGlzUHJlSW5kZXhpbmdQaGFzZSkgeworICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIEF1dGhvcml6YXRpb25Nb2RlbCkgeworICAgICAgX2luZmVyKChBdXRob3JpemF0aW9uTW9kZWwpbW9kZWwsIGFjY2VwdG9yLCBpc1ByZUluZGV4aW5nUGhhc2UpOworICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAobW9kZWwgIT0gbnVsbCkgeworICAgICAgX2luZmVyKG1vZGVsLCBhY2NlcHRvciwgaXNQcmVJbmRleGluZ1BoYXNlKTsKKyAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5oYW5kbGVkIHBhcmFtZXRlciB0eXBlczogIiArCisgICAgICAgIEFycmF5cy48T2JqZWN0PmFzTGlzdChtb2RlbCwgYWNjZXB0b3IsIGlzUHJlSW5kZXhpbmdQaGFzZSkudG9TdHJpbmcoKSk7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zY29waW5nL0F1dGhvcml6YXRpb25EU0xTY29wZVByb3ZpZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC9zY29waW5nL0F1dGhvcml6YXRpb25EU0xTY29wZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4YTc5YgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC94dGVuZC1nZW4vb3JnL2VjbGlwc2Uvb3NicC94dGV4dC9hdXRob3JpemF0aW9uZHNsL3Njb3BpbmcvQXV0aG9yaXphdGlvbkRTTFNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKioKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxNiAtIExvZXR6IEdtYkgmQ28uS0cgKDY5MTE1IEhlaWRlbGJlcmcsIEdlcm1hbnkpCisgKiAKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKKyAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAorICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCisgKiAKKyAqIENvbnRyaWJ1dG9yczoKKyAqIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgorICogCisgKiAKKyAqICBUaGlzIGNvcHlyaWdodCBub3RpY2Ugc2hvd3MgdXAgaW4gdGhlIGdlbmVyYXRlZCBKYXZhIGNvZGUKKyAqLworcGFja2FnZSBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuc2NvcGluZzsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5BdXRob3JpemF0aW9uRFNMUGFja2FnZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuUm9sZUJsaXBQcm9jZXNzOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbC5Sb2xlQmxpcFVzZXJUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwOworaW1wb3J0IG9yZy5lY2xpcHNlLm9zYnAueHRleHQuYmxpcC5CbGlwSXRlbTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmJsaXAuQmxpcFVzZXJUYXNrOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnJlc291cmNlLkVPYmplY3REZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS54dGV4dC5yZXNvdXJjZS5JRU9iamVjdERlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuSVNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnNjb3BpbmcuaW1wbC5NYXBCYXNlZFNjb3BlOworaW1wb3J0IG9yZy5lY2xpcHNlLnh0ZXh0LnhiYXNlLmFubm90YXRpb25zLnR5cGVzeXN0ZW0uWGJhc2VXaXRoQW5ub3RhdGlvbnNCYXRjaFNjb3BlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UueHRleHQueGJhc2UubGliLkNvbGxlY3Rpb25MaXRlcmFsczsKKworQFN1cHByZXNzV2FybmluZ3MoImFsbCIpCitwdWJsaWMgY2xhc3MgQXV0aG9yaXphdGlvbkRTTFNjb3BlUHJvdmlkZXIgZXh0ZW5kcyBYYmFzZVdpdGhBbm5vdGF0aW9uc0JhdGNoU2NvcGVQcm92aWRlciB7CisgIEBPdmVycmlkZQorICBwdWJsaWMgSVNjb3BlIGdldFNjb3BlKGZpbmFsIEVPYmplY3QgY29udGV4dCwgZmluYWwgRVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICBib29sZWFuIF9lcXVhbHMgPSBPYmplY3RzLmVxdWFsKHJlZmVyZW5jZSwgQXV0aG9yaXphdGlvbkRTTFBhY2thZ2UuTGl0ZXJhbHMuUk9MRV9CTElQX1VTRVJfVEFTS19fVVNFUl9UQVNLKTsKKyAgICBpZiAoX2VxdWFscykgeworICAgICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVfUm9sZUJsaXBQcm9jZXNzX1VzZXJUYXNrKCgoUm9sZUJsaXBVc2VyVGFzaykgY29udGV4dCkpOworICAgIH0KKyAgICBSZXNvdXJjZSBfZVJlc291cmNlID0gY29udGV4dC5lUmVzb3VyY2UoKTsKKyAgICBSZXNvdXJjZVNldCBycyA9IF9lUmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKTsKKyAgICByZXR1cm4gc3VwZXIuZ2V0U2NvcGUoY29udGV4dCwgcmVmZXJlbmNlKTsKKyAgfQorICAKKyAgcHVibGljIElTY29wZSBnZXRTY29wZV9Sb2xlQmxpcFByb2Nlc3NfVXNlclRhc2soZmluYWwgUm9sZUJsaXBVc2VyVGFzayByb2xlQmxpcFVzZXJUYXNrKSB7CisgICAgQXJyYXlMaXN0PElFT2JqZWN0RGVzY3JpcHRpb24+IHJlc3VsdCA9IENvbGxlY3Rpb25MaXRlcmFscy48SUVPYmplY3REZXNjcmlwdGlvbj5uZXdBcnJheUxpc3QoKTsKKyAgICBFT2JqZWN0IF9lQ29udGFpbmVyID0gcm9sZUJsaXBVc2VyVGFzay5lQ29udGFpbmVyKCk7CisgICAgQmxpcCBwcm9jZXNzID0gKChSb2xlQmxpcFByb2Nlc3MpIF9lQ29udGFpbmVyKS5nZXRQcm9jZXNzKCk7CisgICAgYm9vbGVhbiBfbm90RXF1YWxzID0gKCFPYmplY3RzLmVxdWFsKHByb2Nlc3MsIG51bGwpKTsKKyAgICBpZiAoX25vdEVxdWFscykgeworICAgICAgRUxpc3Q8QmxpcEl0ZW0+IF9pdGVtcyA9IHByb2Nlc3MuZ2V0SXRlbXMoKTsKKyAgICAgIGZvciAoZmluYWwgQmxpcEl0ZW0gaXRlbSA6IF9pdGVtcykgeworICAgICAgICBpZiAoKGl0ZW0gaW5zdGFuY2VvZiBCbGlwVXNlclRhc2spKSB7CisgICAgICAgICAgU3RyaW5nIF9uYW1lID0gKChCbGlwVXNlclRhc2spaXRlbSkuZ2V0TmFtZSgpOworICAgICAgICAgIElFT2JqZWN0RGVzY3JpcHRpb24gX2NyZWF0ZSA9IEVPYmplY3REZXNjcmlwdGlvbi5jcmVhdGUoX25hbWUsIGl0ZW0pOworICAgICAgICAgIHJlc3VsdC5hZGQoX2NyZWF0ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE1hcEJhc2VkU2NvcGUuY3JlYXRlU2NvcGUoSVNjb3BlLk5VTExTQ09QRSwgcmVzdWx0KTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsaWRhdGlvbi9BdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wveHRlbmQtZ2VuL29yZy9lY2xpcHNlL29zYnAveHRleHQvYXV0aG9yaXphdGlvbmRzbC92YWxpZGF0aW9uL0F1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjRkOTYxCi0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsL3h0ZW5kLWdlbi9vcmcvZWNsaXBzZS9vc2JwL3h0ZXh0L2F1dGhvcml6YXRpb25kc2wvdmFsaWRhdGlvbi9BdXRob3JpemF0aW9uRFNMVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KQorICogCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCisgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKKyAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAorICogCisgKiBDb250cmlidXRvcnM6CisgKiBDaHJpc3RvcGhlIExvZXR6IChMb2V0eiBHbWJIJkNvLktHKSAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KKyAqIAorICogCisgKiAgVGhpcyBjb3B5cmlnaHQgbm90aWNlIHNob3dzIHVwIGluIHRoZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2Uub3NicC54dGV4dC5hdXRob3JpemF0aW9uZHNsLnZhbGlkYXRpb247CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudmFsaWRhdGlvbi5BYnN0cmFjdEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3I7CisKKy8qKgorICogQ3VzdG9tIHZhbGlkYXRpb24gcnVsZXMuCisgKiAKKyAqIHNlZSBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL1h0ZXh0L2RvY3VtZW50YXRpb24uaHRtbCN2YWxpZGF0aW9uCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJhbGwiKQorcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdEF1dGhvcml6YXRpb25EU0xWYWxpZGF0b3IgeworfQpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUxZGNiYgotLS0gL2Rldi9udWxsCisrKyBiL3BvbS54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0jPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Cis8IS0tIyBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTYgLSBMb2V0eiBHbWJIJkNvLktHICg2OTExNSBIZWlkZWxiZXJnLCBHZXJtYW55KS4gLS0+Cis8IS0tIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIC0tPgorPCEtLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIC0tPgorPCEtLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgLS0+Cis8IS0tIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCAtLT4KKzwhLS0jIC0tPgorPCEtLSMgQ29udHJpYnV0b3JzOiAtLT4KKzwhLS0jIENocmlzdG9waGUgTG9ldHogKExvZXR6IEdtYkgmQ28uS0cpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIC0tPgorPCEtLSM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworCTxwYXJlbnQ+CisJCTxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAucmVsZW5nLm1hdmVuPC9ncm91cElkPgorCQk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnJlbGVuZy5tYXZlbi5wYXJlbnQudHljaG88L2FydGlmYWN0SWQ+CisJCTx2ZXJzaW9uPjAuOS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorCQk8cmVsYXRpdmVQYXRoLz4KKwk8L3BhcmVudD4KKworCTxncm91cElkPm9yZy5lY2xpcHNlLm9zYnAueHRleHQuYXV0aG9yaXphdGlvbmRzbDwvZ3JvdXBJZD4KKwk8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKwk8dmVyc2lvbj4wLjkuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKwk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisJPHVybD4ke29zYnAuc2l0ZS5yZXBvc2l0b3J5LnVybH08L3VybD4KKwk8c2NtPgorCQk8dXJsPiR7b3NicC5zY20udXJsfTwvdXJsPgorCQk8Y29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb259PC9jb25uZWN0aW9uPgorCQk8ZGV2ZWxvcGVyQ29ubmVjdGlvbj4ke29zYnAuc2NtLmNvbm5lY3Rpb24uZGV2fTwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KKwkJPHRhZz5IRUFEPC90YWc+CisJPC9zY20+CisJPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisJCTxzaXRlPgorCQkJPGlkPmdoLXBhZ2VzPC9pZD4KKwkJCTxuYW1lPk9TQlAgR2l0SHViIFBhZ2VzPC9uYW1lPgorCQkJPHVybD4ke2Rpc3RyaWJ1dGlvbi5zaXRlLnVybH08L3VybD4KKwkJPC9zaXRlPgorCTwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KKworCTxwcm9wZXJ0aWVzPgorCQk8b3NicC5naXRyZXBvLm5hbWU+JHtwcm9qZWN0Lmdyb3VwSWR9PC9vc2JwLmdpdHJlcG8ubmFtZT4KKwk8L3Byb3BlcnRpZXM+CisKKwk8bW9kdWxlcz4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2w8L21vZHVsZT4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudGVzdHM8L21vZHVsZT4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wudWk8L21vZHVsZT4KKwkJPG1vZHVsZT5vcmcuZWNsaXBzZS5vc2JwLnh0ZXh0LmF1dGhvcml6YXRpb25kc2wuZmVhdHVyZTwvbW9kdWxlPgorCTwvbW9kdWxlcz4KKworCTxidWlsZD4KKwkJPHBsdWdpbk1hbmFnZW1lbnQ+CisJCQk8cGx1Z2lucz4KKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisJCQkJCTxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorCQkJCQk8Y29uZmlndXJhdGlvbj4KKwkJCQkJCTxza2lwPnRydWU8L3NraXA+CisJCQkJCTwvY29uZmlndXJhdGlvbj4KKwkJCQk8L3BsdWdpbj4KKwkJCQk8cGx1Z2luPgorCQkJCQk8Z3JvdXBJZD5vcmcuZWNsaXBzZS50eWNobzwvZ3JvdXBJZD4KKwkJCQkJPGFydGlmYWN0SWQ+dGFyZ2V0LXBsYXRmb3JtLWNvbmZpZ3VyYXRpb248L2FydGlmYWN0SWQ+CisJCQkJCTx2ZXJzaW9uPiR7dHljaG8tdmVyc2lvbn08L3ZlcnNpb24+CisJCQkJCTxjb25maWd1cmF0aW9uPgorCQkJCQkJPHJlc29sdmVyPnAyPC9yZXNvbHZlcj4KKwkJCQkJCTxwb21EZXBlbmRlbmNpZXM+Y29uc2lkZXI8L3BvbURlcGVuZGVuY2llcz4KKwkJCQkJCTxlbnZpcm9ubWVudHM+CisJCQkJCQkJPGVudmlyb25tZW50PgorCQkJCQkJCQk8b3M+d2luMzI8L29zPgorCQkJCQkJCQk8d3M+d2luMzI8L3dzPgorCQkJCQkJCQk8YXJjaD54ODZfNjQ8L2FyY2g+CisJCQkJCQkJPC9lbnZpcm9ubWVudD4KKwkJCQkJCQk8ZW52aXJvbm1lbnQ+CisJCQkJCQkJCTxvcz5saW51eDwvb3M+CisJCQkJCQkJCTx3cz5ndGs8L3dzPgorCQkJCQkJCQk8YXJjaD54ODY8L2FyY2g+CisJCQkJCQkJPC9lbnZpcm9ubWVudD4KKwkJCQkJCQk8ZW52aXJvbm1lbnQ+CisJCQkJCQkJCTxvcz5saW51eDwvb3M+CisJCQkJCQkJCTx3cz5ndGs8L3dzPgorCQkJCQkJCQk8YXJjaD54ODZfNjQ8L2FyY2g+CisJCQkJCQkJPC9lbnZpcm9ubWVudD4KKwkJCQkJCQk8ZW52aXJvbm1lbnQ+CisJCQkJCQkJCTxvcz5tYWNvc3g8L29zPgorCQkJCQkJCQk8d3M+Y29jb2E8L3dzPgorCQkJCQkJCQk8YXJjaD54ODZfNjQ8L2FyY2g+CisJCQkJCQkJPC9lbnZpcm9ubWVudD4KKwkJCQkJCTwvZW52aXJvbm1lbnRzPgorCQkJCQk8L2NvbmZpZ3VyYXRpb24+CisJCQkJPC9wbHVnaW4+CisJCQk8L3BsdWdpbnM+CisJCTwvcGx1Z2luTWFuYWdlbWVudD4KKwk8L2J1aWxkPgorPC9wcm9qZWN0Pgo=